You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:27:00