ggplot2 在带有标签 data.frame 的 geom_col 图层上添加 geom_text

ggplot2 add geom_text on geom_col layer with labels data.frame

我有一个带 position = fill 的条形图,用于在同一列上显示 2 种颜色的比例。我正在尝试在此图上添加一个 geom_text 层,以显示总基因中有多少基因正在绘制比例(例如 Condition == "UT"Keyword = "Zinc"、3 up 2 down - > 在这种情况下,131 个 DE 基因中 5 个锌相关基因 (Nb_Keyword) 的比例为 0.6:0.4 (Nb_Tot),标签为 5 / 131。

我有这个绘图代码,ggplot 2 使用两倍的 Nb_Keyword 和 Nb_Tot 数据来构成标签,因为这里有两次,一次是 Direction == "Down" 一次Direction == "Up".

或者,我尝试为 geom_text、df_labels 中的 aes 使用特定的数据框,它具有用于条形图的数据框行数的一半.这会产生错误,因为 geom_text()aes 层的数据与条形图数据的长度不同。

我也没有用annotate()得到我想要的情节。做我想做的事情的正确策略是什么?

感谢您的帮助! 丹尼尔

library(ggplot2)

### reconstitute df3
condition <- rep(c("UT", "STV", "AA"), each = 4, times = 2)
keyword <- rep(c("Ribosome", "Zinc", "Predicted_gene", "Pseudogene"), times = 6)
nb_keyword <- rep(c(7,5,9,1,6,0,2,1,18,9,30,12), times = 2)
length(nb_keyword)
nb_tot <- rep(c(131,75,383), each = 4, times = 2)
direction <- rep(c("Down", "Up"), each = 12)
proportion <- c(5,2,6,1,1,0,2,0,6,0,21,6,2,3,4,0,5,0,0,1,12,9,9,6)

df3 <- data.frame(condition, keyword, nb_keyword, nb_tot, direction, proportion)
names(df3) <- gsub("(^|[_[:space:]])([[:alpha:]])", "\1\U\2", names(df3), perl = TRUE)

df3$Condition <- ordered(df3$Condition, levels = c("UT", "STV", "AA"))
df3$Direction <- ordered(df3$Direction, levels = c("Up", "Down"))

df_labels <- df3[c(1:12), c("Condition","Keyword", "Nb_Keyword", "Nb_Tot")]

color_vector <- c(Up = "#2CA913", Down = "#DB0F0F")

# plot
p2 <- ggplot(df3, aes(x = Condition, y = Proportion)) +
  geom_col(aes(fill = Direction), position = "fill") +
  scale_fill_manual(values = color_vector) +
  theme(axis.text.x = element_text(angle=90,hjust = 1, vjust=0.2)) +
  facet_grid(cols = vars(Keyword)) +
  geom_text(aes(x = Condition, label = paste(Nb_Keyword, "/",Nb_Tot)), angle = 90)

p2

geom_textaes中,不能使用继承的y值,否则标签会根据Proportion列中的位置。相反,您应该将 geom_text(aes(y)) 设置为接近 0 的值。hjust = 0 参数是 left-align(在本例中为 bottom-align)文本。

编辑:感谢@stefan 通过添加 check_overlap = TRUE 参数来改进我的回答以避免标签重叠。

library(ggplot2)

ggplot(df3, aes(x = Condition, y = Proportion)) +
  geom_col(aes(fill = Direction), position = "fill") +
  scale_fill_manual(values = color_vector) +
  theme(axis.text.x = element_text(angle=90,hjust = 1, vjust=0.2)) +
  facet_grid(cols = vars(Keyword)) +
  geom_text(aes(y = 0.05, label = paste(Nb_Keyword, "/",Nb_Tot)), angle = 90, hjust = 0, check_overlap = T)

reprex package (v2.0.1)

创建于 2022-04-12