如何在ggplot2的geom_text中让数值分置点上下?position_dodge未达预期
解决geom_text数值位置调整问题
要让grp2对应的两个数值分别放在点的上方和下方,不用position_dodge(它是在横向分散元素,和你要的纵向偏移不是一回事),直接根据grp2分组给文本设置不同的y轴偏移量即可,具体修改如下:
library(tidyverse) library(ggplot2) # fake data n <- 1000 df <- data.frame(value = runif(n, 1, 5), grp = sample(c("A", "B", "C"), size = n, replace = T), grp2 = sample(c("A", "B"), size = n, replace = T), var = sample(c("var1", "var2", "var3"), size = n, replace = T)) # plot df %>% group_by(var, grp, grp2) %>% summarise(mw = mean(value, na.rm=TRUE), sd = sd(value, na.rm = TRUE)/2, n = n(), uci = t.test(value, conf.level = .95)$conf.int[[2]], lci = t.test(value, conf.level = .95)$conf.int[[1]]) %>% ggplot(aes(x = grp, y = mw, color = grp2)) + geom_point(size=3, alpha=.5, pch = 15, position = position_dodge(width=0.7)) + geom_errorbar(aes(ymin=lci, ymax=uci), lwd=1, width=.5, alpha=.8, position = position_dodge(width=0.7), na.rm=T) + # 核心修改:根据grp2设置不同的y偏移,让文本分别在点的上下 geom_text(aes(y = mw + ifelse(grp2 == "A", 0.2, -0.2), label = round(mw, 1)), color = "black", size = 3, show.legend = FALSE) + coord_flip() + facet_grid(var ~ .) + # 调整y轴范围,避免偏移后的文本被截断 scale_y_continuous(limits = c(0.8, 5.2))
关键说明:
- 用
ifelse(grp2 == "A", 0.2, -0.2)给grp2="A"的文本加0.2的y偏移(点上方),grp2="B"的减0.2(点下方),偏移量可以根据你的图调整大小; - 因为偏移后文本可能超出原y轴范围,所以把
scale_y_continuous的limits从c(1,5)改成c(0.8,5.2),保证文本完整显示; - 不需要再用
position_dodge,因为我们是在纵向(y轴)偏移,不是横向分散。
内容的提问来源于stack exchange,提问作者D. Studer
相关产品推荐
相关产品推荐

