如何在ggplot2中为geom_violin图层添加不同数据集的geom_errorbar
ggplot2添加geom_errorbar报错:找不到bid_price列的解决方法
问题背景
用户基于航运线路拍卖的两个数据集做可视化:
df_detail:投标价格明细数据df_summary:包含中标加权价、市场高低估值的汇总数据
需要在同一图中展示:
geom_violin:投标价分布geom_jitter:单个投标价散点geom_point:中标价geom_errorbar:市场估值区间
前三个图层可正常绘制,添加geom_errorbar时触发报错,提示找不到df_detail中的bid_price列。
报错原因
在ggplot()的全局美学映射中设置了y = bid_price,ggplot2的后续图层默认会继承该映射。但geom_errorbar使用的df_summary数据集不含bid_price列,导致ggplot尝试调用不存在的列而报错。
修复方案
以下两种方法均可解决问题:
方案1:在geom_errorbar中显式取消y映射继承
在geom_errorbar的美学映射中,通过y = NULL覆盖全局的y映射,避免继承不存在的bid_price列:
library(ggplot2) ggplot(data = df_detail, aes(x=item, y = bid_price)) + geom_violin(fill = "gray90") + geom_jitter(color = "darkorchid2", size = 0.75, alpha = 1, width = 0.15) + geom_point(data = df_summary, aes(x = item, y = award), color = "red") + # 显式取消y的继承,仅指定所需的映射项 geom_errorbar(data = df_summary, mapping = aes(x = item, ymin = mkt_low, ymax = mkt_high, y = NULL), width = 0.5) + theme_bw() + coord_cartesian(ylim = c(0,7000))
方案2:将y映射移至需要的图层
把y = bid_price从全局映射中移除,仅在需要用到该字段的geom_violin和geom_jitter中单独设置,后续图层不会继承不必要的y映射:
library(ggplot2) ggplot(data = df_detail, aes(x=item)) + # 全局仅保留x映射 geom_violin(aes(y = bid_price), fill = "gray90") + # 单独设置y映射 geom_jitter(aes(y = bid_price), color = "darkorchid2", size = 0.75, alpha = 1, width = 0.15) + # 单独设置y映射 geom_point(data = df_summary, aes(x = item, y = award), color = "red") + geom_errorbar(data = df_summary, mapping = aes(x = item, ymin = mkt_low, ymax = mkt_high), width = 0.5) + theme_bw() + coord_cartesian(ylim = c(0,7000))
效果验证
两种方案都能成功绘制包含所有所需元素的图表,不会再出现找不到bid_price的报错。
内容的提问来源于stack exchange,提问作者ScottyJ
相关产品推荐
相关产品推荐

