ggplot直方图设置x=mz、y=value报错,如何绘制指定轴的分组直方图?
解决方案
你的数据结构不需要调整,它已经是适合分组可视化的长格式。问题出在选了错误的几何对象:geom_histogram是用来统计原始观测的频数分布的,默认y轴是观测数量(count),不支持直接传入自定义的value作为y轴。你需要用geom_col来直接展示数据中已有的value值。
1. 并列分组柱状图(推荐)
如果希望同一mz对应的a、b分组柱子并列展示,用以下代码:
library(ggplot2) df <- data.frame(mz = c(10, 10, 11, 11, 12, 12, 14, 14), name = c('a', 'b','a', 'b','a', 'b', 'a', 'b'), value = c(1000, 1200, 900, 1100, 1000, 1300, 1115, 950)) ggplot(df, aes(x = factor(mz), y = value, fill = name)) + geom_col(position = "dodge", width = 0.7) + # width可调整柱子宽度 labs(x = "mz", y = "value", fill = "分组") + theme_minimal()
- 把
mz转成factor是因为你的mz是离散值,这样x轴会按实际取值展示,不会当成连续轴处理 position = "dodge"实现分组柱子的并列效果
2. 堆叠分组柱状图
如果想展示同一mz下a、b的value总和及占比,改用堆叠模式:
ggplot(df, aes(x = factor(mz), y = value, fill = name)) + geom_col(position = "stack") + labs(x = "mz", y = "value", fill = "分组") + theme_minimal()
为什么geom_histogram不适用?
geom_histogram的核心是对连续型x轴进行分箱,然后统计每个箱内的观测数量,它的y轴是自动计算的统计量(count或density),无法直接绑定数据中的value列,这就是你设置y=value时报错的原因。你的数据是已经汇总好的分组数值,不是原始观测集合,因此geom_col才是正确选择。
内容的提问来源于stack exchange,提问作者Abigail
相关产品推荐
相关产品推荐

