如何用ggplot2基于汇总数据绘制班级分数箱线图?
你当前的melt方向是对的,但还需要把汇总的频数数据还原成每个学生的个体分数记录——因为箱线图是基于个体数据计算四分位数、极值等统计量的,没法直接用汇总频数数据绘制。具体操作步骤如下:
1. 转换长格式并展开个体数据
先把宽表转成长表,再根据各班对应分数的人数,重复对应的分数行,还原成每个学生的分数记录:
# 先安装依赖包(首次使用时运行) install.packages(c("reshape2", "tidyr", "ggplot2")) library(reshape2) library(tidyr) library(ggplot2) # 宽表转长表,明确列名 df_long <- melt(df, id.vars = "score", variable.name = "class", value.name = "count") # 根据人数展开数据,得到每个学生的单条记录 df_expanded <- uncount(df_long, count)
如果不想用tidyr包,也可以用base R的rep函数实现展开:
df_expanded <- df_long[rep(seq(nrow(df_long)), df_long$count), c("score", "class")]
2. 绘制箱线图
有了个体数据后,就可以直接用ggplot绘制目标箱线图了:
ggplot(df_expanded, aes(x = class, y = score)) + geom_boxplot(fill = "lightblue", alpha = 0.7) + labs(x = "班级", y = "分数", title = "各班分数分布箱线图") + theme_minimal()
内容的提问来源于stack exchange,提问作者Amyly
相关产品推荐
相关产品推荐

