ggplot中geom_point与errorbar的position_dodge对齐失效问题
问题:ggplot中geom_errorbar与geom_point(shape=21)无法通过position_dodge对齐
我正在绘制包含多组数据的图表:一组是带置信区间的均值,另一组是数据点的抖动效果。现在遇到的问题是,geom_errorbar无法和geom_point通过position_dodge实现同步偏移,errorbar始终居中。之前画同类图表没问题,唯一区别是这次给geom_point指定了shape=21(带黑框提升辨识度)。
原代码
ggplot(NULL, aes(x, y)) + geom_errorbar( watervol.time, mapping = aes( x = Date.Order, y = water.vol.mean, ymin = LCI, ymax = UCI ), colour = "black", width = 10, position = position_dodge() ) + geom_point( watervol.time, mapping = aes( x = Date.Order, y = water.vol.mean, fill = Site, group = Site ), size = 3.5, shape = 21, position = position_dodge(11) )
补充数据
| Site | Date.Order | water.vol.mean | LCI | UCI |
|---|---|---|---|---|
| Quartz | 28/09/2021 | 27.52666667 | 23.86938796 | 31.18394537 |
| Quartz | 29/11/2021 | 44.23333333 | 40.57605463 | 47.89061204 |
| Quartz | 18/07/2022 | 45.23666667 | 41.57938796 | 48.89394537 |
| Quartz | 27/09/2022 | 40.46 | 36.80272129 | 44.11727871 |
| Hematite | 28/09/2021 | 33.18666667 | 29.52938796 | 36.84394537 |
| Hematite | 29/11/2021 | 45.65 | 41.99272129 | 49.30727871 |
| Hematite | 19/07/2022 | 45.50333333 | 41.84605463 | 49.16061204 |
| Hematite | 27/09/2022 | 42.14 | 38.48272129 | 45.79727871 |
| Olivine | 28/09/2021 | 26.21333333 | 22.55605463 | 29.87061204 |
| Olivine | 29/11/2021 | 43.84333333 | 40.18605463 | 47.50061204 |
| Olivine | 18/07/2022 | 44.58066667 | 40.92338796 | 48.23794537 |
| Olivine | 27/09/2022 | 39.778 | 36.12072129 | 43.43527871 |
| Plagioclase | 28/09/2021 | 32.81666667 | 29.15938796 | 36.47394537 |
| Plagioclase | 29/11/2021 | 46.18166667 | 42.52438796 | 49.83894537 |
| Plagioclase | 19/07/2022 | 47.66633333 | 44.00905463 | 51.32361204 |
| Plagioclase | 27/09/2022 | 44.89196667 | 41.23468796 | 48.54924537 |
解决方案
问题核心是两个图层的分组逻辑和偏移参数不统一,修改后的代码如下:
ggplot(watervol.time, aes(x = Date.Order, y = water.vol.mean, group = Site)) + geom_errorbar( aes(ymin = LCI, ymax = UCI), colour = "black", width = 10, position = position_dodge(11) ) + geom_point( aes(fill = Site), size = 3.5, shape = 21, position = position_dodge(11) )
关键修改点:
- 将数据集统一放在
ggplot()的初始参数中,避免重复传递 - 在全局
aes中添加group = Site,让两个图层都基于Site分组偏移 - 给
geom_errorbar设置和geom_point完全相同的position_dodge(11)宽度,确保二者对齐 - 移除重复的x/y映射,简化代码结构
修改后,errorbar会和对应分组的geom_point同步偏移,不再保持居中。
内容的提问来源于stack exchange,提问作者tea4science
相关产品推荐
相关产品推荐

