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_text
的aes
中,不能使用继承的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
我有一个带 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_text
的aes
中,不能使用继承的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