如何禁用R绘图时自动分组元素?附数据代码求助
问题解决:按时间顺序排列学期轴并选择合适的班级规模可视化方式
一、修正x轴学期的显示顺序
ggplot默认会对离散型x轴变量按字母排序,导致秋季(F)、冬季(W)、夏季(S)被分组显示。要按时间顺序或数据框中的出现顺序排列,只需将sem转换为有序因子即可。
方法1:按数据框中出现的顺序设置
直接提取数据框中sem的唯一值作为因子水平,保持原有顺序:
comp1010$sem <- factor(comp1010$sem, levels = unique(comp1010$sem))
方法2:按实际时间顺序排序(更严谨)
如果数据框的行顺序可能混乱,可通过解析季节和年份生成正确的时间顺序:
library(dplyr) # 生成按时间排序的学期水平 sem_order <- comp1010 %>% mutate( season = substr(sem, 1, 1), # 提取季节字母 year = as.integer(paste0("20", substr(sem, 2, 3))) # 转换为完整年份 ) %>% arrange(year, match(season, c("F", "W", "S"))) %>% # 按年份+季节顺序排序(秋→冬→夏) pull(sem) %>% unique() # 将sem转换为有序因子 comp1010$sem <- factor(comp1010$sem, levels = sem_order)
修改后重新运行你的ggplot代码,x轴就会按时间顺序排列了:
ggplot(data = comp1010, aes(x = sem, y = enrollActual)) + geom_point() + scale_x_discrete(guide = guide_axis(angle = 90)) + labs(x = "学期", y = "实际选课人数", title = "Mat 1010 学期末班级选课人数", subtitle = "2013年秋季至2025年冬季")
二、推荐适合的绘图类型
针对“观察班级规模是否变大”的需求,推荐以下几种简单直观的绘图类型:
1. 箱线图:展示每个学期的班级规模分布
能清晰看到每个学期选课人数的中位数、四分位数和异常值,快速对比各学期的整体分布:
ggplot(data = comp1010, aes(x = sem, y = enrollActual)) + geom_boxplot(fill = "lightblue", alpha = 0.7) + scale_x_discrete(guide = guide_axis(angle = 90)) + labs(x = "学期", y = "实际选课人数", title = "Mat 1010 学期末班级选课人数分布", subtitle = "2013年秋季至2025年冬季")
2. 点图+均值线:兼顾个体数据与整体趋势
用点展示每个班级的具体选课人数,叠加均值折线直观呈现整体规模的变化趋势:
ggplot(data = comp1010, aes(x = sem, y = enrollActual)) + geom_point(color = "darkred", size = 2, alpha = 0.6) + stat_summary(fun = mean, geom = "line", group = 1, color = "blue", size = 1) + scale_x_discrete(guide = guide_axis(angle = 90)) + labs(x = "学期", y = "实际选课人数", title = "Mat 1010 班级选课人数及均值趋势", subtitle = "2013年秋季至2025年冬季")
3. 学期均值折线图:聚焦整体趋势变化
如果只想看班级规模的长期趋势,先计算每个学期的平均选课人数,再绘制折线图:
comp1010_summary <- comp1010 %>% group_by(sem) %>% summarize(mean_enroll = mean(enrollActual)) ggplot(data = comp1010_summary, aes(x = sem, y = mean_enroll, group = 1)) + geom_line(color = "darkgreen", size = 1.2) + geom_point(size = 3, color = "darkgreen") + scale_x_discrete(guide = guide_axis(angle = 90)) + labs(x = "学期", y = "平均实际选课人数", title = "Mat 1010 学期平均选课人数趋势", subtitle = "2013年秋季至2025年冬季")
内容的提问来源于stack exchange,提问作者2Lazy2BeOriginal
相关产品推荐
相关产品推荐

