ggplot2绘制稳定同位素散点图时误差棒刻度异常问题求助
嘿,我一眼就瞅出问题所在啦——你把误差棒的变量映射完全搞反了!这就是生成的图和目标图误差棒刻度不符的核心原因。
问题根源:误差棒的轴对应错了
你的代码里:
geom_errorbar是用来绘制垂直误差棒(对应y轴的δ¹⁵N数据),但你却用了x轴的D13C和D13C.ds来计算上下限;geom_errorbarh是用来绘制水平误差棒(对应x轴的δ¹³C数据),但你反而用了y轴的D15N和D15N.ds来计算左右限。
完全搞反了轴和变量的对应关系,误差棒当然不对啦!
修正后的代码(基于你的Means数据集)
我帮你把误差棒的变量纠正过来,还合并了重复的geom_point(你之前加了两次,会导致点重叠,透明度叠加):
a <- read.table("Means.txt", header = TRUE) theme_set(theme_classic(base_size = 16)) ggplot(a, aes(x = D13C, y = D15N)) + # 垂直误差棒:对应y轴δ¹⁵N的误差 geom_errorbar(aes(ymax = D15N + D15N.ds, ymin = D15N - D15N.ds), width = 0.15, alpha = .8) + # 水平误差棒:对应x轴δ¹³C的误差 geom_errorbarh(aes(xmax = D13C + D13C.ds, xmin = D13C - D13C.ds), height = 0.15, alpha = .8) + # 合并成一个geom_point,避免重复绘制 geom_point(aes(shape = Species, color = Species, fill = Species), size = 4, alpha = .5) + scale_color_manual(values = c("black","dodgerblue1","coral4","darkorchid")) + scale_fill_manual(values = c("black","dodgerblue1","coral4","darkorchid")) + scale_shape_manual(values = c(21,23,22,24)) + labs(title = NULL, subtitle = NULL, caption = NULL, x = expression(paste(delta^{13}, "C (‰)")), y = expression(paste(delta^{15}, "N (‰)")))
进阶推荐:用原始数据自动计算统计量
手动维护Means.txt很容易出错,我推荐直接用你的原始数据CN_fauna,通过dplyr自动计算每个物种的均值和标准差,这样更严谨也更高效:
library(ggplot2) library(dplyr) # 从原始数据生成统计摘要 summary_data <- CN_fauna %>% rename(Species = tax) %>% # 统一列名和Means数据集一致 group_by(Species) %>% summarise( D13C = mean(D13C), D13C.ds = sd(D13C), D15N = mean(D15N), D15N.ds = sd(D15N) ) # 绘图逻辑和修正后的代码一致 theme_set(theme_classic(base_size = 16)) ggplot(summary_data, aes(x = D13C, y = D15N)) + geom_errorbar(aes(ymax = D15N + D15N.ds, ymin = D15N - D15N.ds), width = 0.15, alpha = .8) + geom_errorbarh(aes(xmax = D13C + D13C.ds, xmin = D13C - D13C.ds), height = 0.15, alpha = .8) + geom_point(aes(shape = Species, color = Species, fill = Species), size = 4, alpha = .5) + scale_color_manual(values = c("black","dodgerblue1","coral4","darkorchid")) + scale_fill_manual(values = c("black","dodgerblue1","coral4","darkorchid")) + scale_shape_manual(values = c(21,23,22,24)) + labs(title = NULL, subtitle = NULL, caption = NULL, x = expression(paste(delta^{13}, "C (‰)")), y = expression(paste(delta^{15}, "N (‰)")))
这样调整后,误差棒就会准确对应到各自的轴上,应该就能得到你想要的目标图啦!
内容的提问来源于stack exchange,提问作者Paolo Fisichella
相关产品推荐
相关产品推荐

