使用ggplot2在R中绘制正负y轴geom_col条形图时遇数值异常问题
问题原因与解决方法
错误原因
你使用geom_col时,它的默认行为是对同一x值下的所有y值进行堆叠求和,而不是展示该x对应的y/z的极值范围。diamonds数据集中每个x对应成百上千条记录,求和后的数值自然会远大于单个y/z的最大值(58.9和31.8),这就是你看到数值异常的核心原因。
解决方案
要实现每个x位置显示y(正y轴)和z(负y轴)从最小值到最大值的条形,需要先对数据按x分组汇总极值,再选择合适的几何对象绘制:
步骤1:分组汇总数据
使用dplyr对每个x对应的y和z计算极值:
library(ggplot2) library(dplyr) diamonds_summary <- diamonds %>% group_by(x) %>% summarise( y_min = min(y), y_max = max(y), z_min = min(z), z_max = max(z) )
步骤2:绘制极值范围条形
用geom_linerange绘制每个x位置上y的最小值到最大值(正轴),以及z的最小值到最大值取负后的范围(负轴):
ggplot(diamonds_summary) + # 正y轴:y的最小值到最大值 geom_linerange(aes(x = x, ymin = y_min, ymax = y_max), color = "#edae49", size = 1) + # 负y轴:z的最小值到最大值取负(z_max取负后更靠下) geom_linerange(aes(x = x, ymin = -z_max, ymax = -z_min), color = "#66a182", size = 1) + theme_bw()
可选:绘制从0到最大值的条形
如果你的需求是从0开始到最大值的条形(而非完整的最小值到最大值范围),可以只汇总最大值后用geom_col:
diamonds_summary_max <- diamonds %>% group_by(x) %>% summarise( y_max = max(y), z_max = max(z) ) ggplot(diamonds_summary_max) + geom_col(aes(x = x, y = y_max), color = "#edae49", fill = "#edae49", width = 0.8) + geom_col(aes(x = x, y = -z_max), color = "#66a182", fill = "#66a182", width = 0.8) + theme_bw()
内容的提问来源于stack exchange,提问作者LDT
相关产品推荐
相关产品推荐

