在R中绘制均值分组条形图:按年级与性别展示平均成绩
按性别分组绘制各年级平均成绩的分组条形图
嘿,这个需求其实很好实现!我给你两种常用的方案,分别用ggplot2(更推荐,语法直观易扩展)和基础R绘图来完成:
方法一:使用ggplot2包(推荐)
ggplot2处理分组条形图非常省心,不需要提前手动计算均值,直接用内置的统计函数就能搞定:
# 先加载ggplot2包(如果没安装的话先运行install.packages("ggplot2")) library(ggplot2) # 绘制分组条形图 ggplot(learner, aes(x = factor(grade), y = literacy_total, fill = gender)) + # 用stat_summary计算均值并绘制条形,position="dodge"让同年级的两个条形并排 geom_bar(stat = "summary", fun = "mean", position = position_dodge(width = 0.9)) + # 添加均值标签(可选,让图表更直观) stat_summary(fun = "mean", geom = "text", position = position_dodge(width = 0.9), vjust = -0.5, size = 3.5) + # 设置坐标轴和标题 labs( x = "年级", y = "平均读写测试成绩", fill = "性别", title = "各年级男女生平均读写成绩对比" ) + # 调整主题(可选,让图表更好看) theme_minimal() + theme(plot.title = element_text(hjust = 0.5))
关键参数解释:
fill = gender:指定按性别分组填充颜色,这是实现分组的核心position = position_dodge(width = 0.9):让同x轴类别(年级)的两个条形并排显示,width参数控制条形间的间距factor(grade):把年级转成因子类型,避免x轴按连续数值显示(如果你的grade已经是因子可以去掉)
方法二:使用基础R绘图
如果不想用ggplot2,也可以用基础R的barplot实现,不过需要先手动计算各年级-性别组合的均值:
# 1. 计算每个年级、性别对应的平均成绩 mean_scores <- aggregate(literacy_total ~ grade + gender, data = learner, FUN = mean) # 2. 把数据整理成矩阵格式(barplot需要这种结构) score_matrix <- reshape2::dcast(mean_scores, grade ~ gender, value.var = "literacy_total") # 如果没安装reshape2,先运行install.packages("reshape2") # 3. 绘制分组条形图 barplot( t(score_matrix[, -1]), # 转置矩阵,让性别作为分组维度 beside = TRUE, # 设置为分组条形图(而非堆叠) names.arg = score_matrix$grade, # x轴标签为年级 col = c("#1f77b4", "#ff7f0e"), # 自定义男女的颜色 xlab = "年级", ylab = "平均读写测试成绩", main = "各年级男女生平均读写成绩对比" ) # 添加图例 legend("topright", legend = colnames(score_matrix[, -1]), fill = c("#1f77b4", "#ff7f0e"))
关键步骤解释:
aggregate函数用来按年级和性别分组计算均值dcast把长格式数据转成宽格式,方便barplot处理beside = TRUE是实现分组条形的核心参数,默认是堆叠条形图
两种方法都能实现你想要的效果,推荐用ggplot2,后续调整样式、添加注释会更灵活~
内容的提问来源于stack exchange,提问作者Ardyn
相关产品推荐
相关产品推荐

