如何简化R中两列均值可视化流程并使用ggplot绘制美观图表?
简化流程与ggplot美化方案
一、数据处理简化
你原来的步骤过于繁琐,直接用summarize计算均值,再转成ggplot偏好的长数据格式即可,无需生成整列重复的均值再提取:
library(dplyr) library(tidyr) # 计算两列均值并转换为长格式 avg_data <- my_data %>% summarize( part_1 = mean(part_1, na.rm = TRUE), part_2 = mean(part_2, na.rm = TRUE) ) %>% pivot_longer( cols = everything(), names_to = "Part", values_to = "Average" ) %>% mutate(Part = factor(Part, levels = c("part_1", "part_2"), labels = c("First part", "Second part")))
二、ggplot绘制美观柱状图
用geom_col实现核心绘图,同时添加标签、主题美化等元素:
library(ggplot2) ggplot(avg_data, aes(x = Part, y = Average, fill = Part)) + geom_col(width = 0.6, show.legend = FALSE) + # 调整柱子宽度,隐藏冗余图例 geom_text(aes(label = round(Average, 2)), vjust = -0.5, size = 4) + # 显示均值数值标签 labs( title = "Mean Comparison: Part 1 vs Part 2", x = "Group", y = "Average Value" ) + theme_minimal() + # 使用简洁清爽的主题 theme( plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), axis.title = element_text(size = 12), axis.text = element_text(size = 10) ) + scale_fill_brewer(palette = "Set2") # 搭配专业配色
三、图表选择优化建议
单柱状图能清晰展示均值差异,但如果想更全面呈现数据特征,带误差棒的柱状图会更实用(比如补充标准差/标准误,体现数据离散程度),示例代码如下:
# 先计算均值+标准差 stats_data <- my_data %>% summarize( part_1_mean = mean(part_1, na.rm = TRUE), part_1_sd = sd(part_1, na.rm = TRUE), part_2_mean = mean(part_2, na.rm = TRUE), part_2_sd = sd(part_2, na.rm = TRUE) ) %>% pivot_longer( cols = everything(), names_to = c("Part", "Stat"), names_sep = "_", values_to = "Value" ) %>% pivot_wider(names_from = Stat, values_from = Value) %>% mutate(Part = factor(Part, levels = c("part_1", "part_2"), labels = c("First part", "Second part"))) # 绘制带误差棒的柱状图 ggplot(stats_data, aes(x = Part, y = mean, fill = Part)) + geom_col(width = 0.6, show.legend = FALSE) + geom_errorbar(aes(ymin = mean - sd, ymax = mean + sd), width = 0.2) + # 添加标准差误差棒 geom_text(aes(label = round(mean, 2)), vjust = -0.8, size = 4) + labs( title = "Mean & Standard Deviation Comparison", x = "Group", y = "Value" ) + theme_minimal() + theme( plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), axis.title = element_text(size = 12), axis.text = element_text(size = 10) ) + scale_fill_brewer(palette = "Set2")
内容的提问来源于stack exchange,提问作者Joseph Dalchialpo
相关产品推荐
相关产品推荐

