使用ggplot在条形图上添加图例标签

3
我想在ggplot的堆积条形图中添加集群名称。
如您所见,有些簇具有非常小的比例,并且每个条中有许多簇。这使得很难看出哪些是哪个簇,特别是在相似的颜色之间。 理想情况下,我希望能够选择性地用名称标注一些大比例(或簇),例如当百分比> 5%时,显示其簇名称。
例如,在示例“幼稚CD8 T”中,我想要标记簇4和5,如下所示:
cluster.count %>% 
  ggplot(aes(x=Cell_subtype,y=count1, fill= seurat_clusters)) +
  geom_bar(stat="identity", position = 'fill')
1个回答

3

可以这样实现:

  1. 不要使用 position="fill",通过 group_by + mutate 手动计算百分比
  2. 然后可以通过使用 geom_text 轻松添加标签,在其中使用 ifelse 仅显示具有所需最小频率或比例的标签。

尝试使用一些随机示例数据:

library(ggplot2)
library(dplyr)

set.seed(42)
cluster.count <- data.frame(
  Cell_subtype = sample(LETTERS[1:4], 60, replace = TRUE),
  seurat_clusters = sample(0:16, 60, replace = TRUE)
)
cluster.count <- count(cluster.count, Cell_subtype, seurat_clusters, name = "count1")
cluster.count <- mutate(cluster.count, seurat_clusters = factor(seurat_clusters))

cluster.count %>% 
  group_by(Cell_subtype) %>% 
  mutate(pct = count1 / sum(count1)) %>% 
  ggplot(aes(x=Cell_subtype,y=pct, fill= seurat_clusters)) +
  geom_col() +
  geom_text(aes(label = ifelse(pct > .1, as.character(seurat_clusters), "")), position = position_stack(vjust = .5))


图表上的标签和图例标签不匹配,差异是一个常数:1。例如,在样本“D”中,顶部聚类应该是0而不是1。 - Hh Xu
啊,抱歉。这是因为将您的变量seurat_clusters转换为因子(以获得离散比例尺并正确排序)引入了此问题。我刚刚进行了编辑以通过在geom_text中使用as.character(seurat_clusters)来解决这个问题。 - stefan
谢谢!这很有趣。你能解释一下为什么会发生这种情况吗?我原以为因子和字符串字符(或数字)之间的转换实际上不会改变其值... 我还尝试了 as.integer(seurat_clusters) -1,这样就可以工作了。 - Hh Xu
当转换为因子时,R会分配从1开始的新数值,而原始值存储在级别属性中,例如as.numeric(factor(0:5))将给出1:6。不幸的是,在ifelse中发生了这种情况,即因子被转换为数字,然后再转换为字符。因此我们得到+1。使用as.character可以解决这个问题,因为在这种情况下,值将被替换为存储在级别属性中的原始值,即as.character(factor(0:5))将给出0:5。 - stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接