如何按分组创建箱线图?实现R语言多ID箱线图同页对比展示
解决方案:为每个ID生成同页面对比的箱线图
没问题!用R的ggplot2包就能快速实现你的需求——把每个ID对应的箱线图放在同一画布上,方便直接对比数据分布。下面是针对你的数据集的完整步骤:
1. 加载你的数据集
首先把你提供的数据集导入到R中:
# 加载数据集 df <- structure(list(ID = c("F1", "F1", "F1", "F1", "F1", "F1", "F1", "F2", "F2", "F2", "F2", "F2", "F2", "F2", "F2", "F3", "F3", "F3", "F3", "F3", "F3", "F3", "F3", "F3", "F4", "F4", "F4", "F4", "F4", "F4", "F4", "F4"), Date = c("22/6/2021", "23/6/2021", "24/6/2021", "25/6/2021", "26/6/2021", "27/6/2021", "28/6/2021", "22/6/2021", "23/6/2021", "24/6/2021", "25/6/2021", "26/6/2021", "27/6/2021", "28/6/2021", "29/6/2021", "22/6/2021", "23/6/2021", "24/6/2021", "25/6/2021", "26/6/2021", "27/6/2021", "28/6/2021", "29/6/2021", "30/6/2021", "22/6/2021", "23/6/2021", "24/6/2021", "25/6/2021", "26/6/2021", "27/6/2021", "28/6/2021", "29/6/2021"), Values = c(9.6, 9.8, 10.2, 9.8, 9.9, 9.9, 9.9, 1.2, 1.2, 1.8, 1.5, 1.5, 1.6, 1.4, 1.1, 3266, 3256, 7044, 6868, 6556, 3405, 3410, 3980, 5567, 59.4, 56, 52.8, 52.4, 55.5, 54, 61, 53.6)), class = "data.frame", row.names = c(NA, -32L))
2. 安装并加载ggplot2包
如果你还没安装ggplot2,先执行安装命令:
install.packages("ggplot2")
然后加载包:
library(ggplot2)
3. 生成同页面的箱线图
用ggplot函数构建绘图对象,指定x轴为ID,y轴为Values,然后用geom_boxplot()绘制箱线图,还可以添加一些美化元素让图表更清晰:
ggplot(df, aes(x = ID, y = Values)) + geom_boxplot(fill = "#4292c6", alpha = 0.7) + # 设置箱线图填充色和透明度 labs(title = "各ID的Values分布箱线图", x = "ID编号", y = "Values数值") + theme_minimal() + # 使用简洁的主题 theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold")) # 居中标题并调整样式
执行这段代码后,你就能得到一张包含所有ID箱线图的画布,直接对比每个ID的数值分布(中位数、四分位数、异常值等)。
额外优化建议
注意到你的数据中不同ID的Values数值量级差异很大(比如F3的数值是几千,F2只有1左右),如果觉得直接对比不够清晰,可以尝试以下两种优化方式:
- 使用对数坐标轴:在绘图代码中添加
scale_y_log10(),让小数值的分布更明显:ggplot(df, aes(x = ID, y = Values)) + geom_boxplot(fill = "#4292c6", alpha = 0.7) + scale_y_log10() + # 对数转换y轴 labs(title = "各ID的Values分布箱线图(对数坐标轴)", x = "ID编号", y = "Values数值(对数)") + theme_minimal() + theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold")) - 分面展示:如果想保留原始数值尺度,也可以用分面把每个ID的箱线图单独展示但放在同一页面:
ggplot(df, aes(x = ID, y = Values)) + geom_boxplot(fill = "#4292c6", alpha = 0.7) + facet_wrap(~ID, scales = "free_y") + # 按ID分面,y轴自由缩放 labs(title = "各ID的Values分布箱线图(分面展示)", x = "ID编号", y = "Values数值") + theme_minimal() + theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))
这样就能根据你的需求选择最适合的展示方式啦!
内容的提问来源于stack exchange,提问作者pipts
相关产品推荐
相关产品推荐

