如何从3×2 tibble绘制分组直方图?报错求助
嘿,我来帮你搞定这个绘图问题!咱们先拆解一下你遇到的问题,再一步步修正代码:
问题根源拆解
你碰到的Error: Aesthetics must be either length 1 or the same as the data (3): y,主要有这几个原因:
- 你的数据是宽格式(每列对应一个分组),但ggplot天生更适配长格式数据(一列存分组标签,一列存对应数值)
- 用错了几何对象:
geom_histogram()是用来展示单变量分布的,而你要对比两组的样本平均值,应该用geom_col()(柱状图)才对 - 语法小错误:
stat = "identity"和position = "dodge"是geom_col()的参数,不能单独用+挂在后面 - 直接拿
rownames()和colnames()当映射美学也不合适,得把这些信息转成数据框的正式列
修正步骤来啦
1. 先把数据转成ggplot喜欢的长格式
咱们用tidyr包的pivot_longer()来转换格式,顺便给行名加个正式列(比如叫sample):
library(tidyverse) # 同时加载ggplot2和tidyr,省得单独装 # 给行名添加为一列,再转成长格式 sample.average <- sample.average %>% mutate(sample = rownames(.)) %>% pivot_longer(cols = -sample, names_to = "group", values_to = "average")
转换后的数据会变成6行3列的结构,大概是这样:
| sample | group | average |
|---|---|---|
| 1 | control.average | -0.01280627 |
| 1 | exp.average | -1.014465 |
| 2 | control.average | 99.93987077 |
| 2 | exp.average | 10.009083 |
| 3 | control.average | 6.02685326 |
| 3 | exp.average | 3.995733 |
2. 绘制带图例的分组柱状图
现在用整理好的数据来画图,设置好颜色映射,自动生成图例:
ggplot(sample.average, aes(x = sample, y = average, fill = group)) + # 让同一样本的两个柱子并排,避免重叠 geom_col(position = position_dodge(width = 0.8), width = 0.7) + # 添加标题和标签 labs(title = "Control vs Experiment: Sample Averages", x = "Sample", y = "Average Value", fill = "Group") + # 自定义分组颜色,你可以换成自己喜欢的颜色 scale_fill_manual(values = c("control.average" = "#2ecc71", "exp.average" = "#3498db")) + # 用清爽的主题 theme_minimal()
要是你真的需要直方图(看分布)
如果你的需求是展示两组平均值的分布情况,那可以用长数据的average作为x轴,用分组来区分填充色:
ggplot(sample.average, aes(x = average, fill = group)) + # 半透明叠加,方便看重叠部分,binwidth可以根据数据调整 geom_histogram(binwidth = 5, alpha = 0.7, position = "identity") + labs(title = "Distribution of Average Values", x = "Average Value", y = "Count", fill = "Group") + scale_fill_manual(values = c("control.average" = "#e74c3c", "exp.average" = "#f39c12")) + theme_minimal()
内容的提问来源于stack exchange,提问作者timothyfisherphd
相关产品推荐
相关产品推荐

