如何在R中对数据框的统计摘要绘制箱线图
R 多特征分布可视化实现方案
这里提供两种可直接使用的实现方案,完全匹配你展示特征最值范围、均值、识别离群点的需求:
方案1:基于原始数据直接绘制箱线图 推荐
箱线图原生支持展示最小值、四分位数、中位数、最大值,且会自动标记1.5倍四分位距外的离群点,不需要提前计算统计摘要,代码如下:
# 先安装依赖包(已安装可跳过) # install.packages("tidyverse") library(tidyverse) # 替换为你自己的原始数据框即可 df <- structure(list(feat_1 = c(1L, 0L, 0L, 1L, 0L, 2L, 2L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), feat_2 = c(0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), feat_3 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 2L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), feat_4 = c(0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 1L, 0L, 1L, 0L, 2L, 0L, 0L, 0L, 0L )), row.names = c(NA, 20L), class = "data.frame") # 宽表转长表适配ggplot绘图逻辑 df_long <- df %>% pivot_longer(cols = everything(), names_to = "feature", values_to = "value") # 绘制箱线图 ggplot(df_long, aes(x = feature, y = value)) + geom_boxplot(fill = "lightblue", outlier.color = "red") + # 离群点标红突出显示 coord_flip() + # 特征名放在y轴,避免80个特征名重叠 labs(x = "特征名称", y = "数值", title = "各特征分布箱线图") + theme_bw()
方案2:基于已计算的summary统计值绘图
如果你只需要展示最值和均值,不需要看四分位数分布,可以直接用你已经生成的summary统计值绘图:
# 计算统计摘要(和你提供的代码逻辑一致) summary_df <- as.data.frame(apply(df, 2, summary)) # 转换为绘图适配的长表格式 summary_long <- summary_df %>% rownames_to_column("stat") %>% pivot_longer(cols = -stat, names_to = "feature") %>% pivot_wider(names_from = stat, values_from = value) # 绘制范围+均值图 ggplot(summary_long, aes(x = feature)) + geom_linerange(aes(ymin = Min., ymax = Max.), linewidth = 1, color = "gray") + # 绘制最值范围线 geom_point(aes(y = Mean), size = 3, color = "darkred") + # 标记均值点 coord_flip() + labs(x = "特征名称", y = "数值", title = "各特征最值范围与均值分布") + theme_bw()
使用优化提示
- 若80个特征的数值量级差异大,可在ggplot代码末尾加
scale_y_log10()做对数变换,避免小数值特征被压缩 - 若特征名过长重叠,可加
theme(axis.text.y = element_text(size = 7))调整y轴字体大小 - 需要额外展示中位数、四分位数范围时,在方案2中添加对应的点/线图层即可
内容的提问来源于stack exchange,提问作者YannickAaron
相关产品推荐
相关产品推荐

