在R中绘制美国各州英语测试分数随时间的散点连线图
数据集整理+ggplot绘图解决方案
一、数据整理(完全不损坏原数据)
你担心转长格式会弄坏数据完全没必要——我们会生成新的数据框,原数据集School_data会保持原样。步骤如下:
- 先筛选出仅英语(ela)的记录,减少冗余计算
- 把2016-2023这些年份列转成长格式,方便ggplot识别
- 将年份转为数值型,保证X轴按时间顺序排列
- 挑选你需要的5个州(示例用CA、NY、TX、FL、IL,可自行替换)
# 加载tidyverse工具包(包含dplyr和tidyr) library(tidyverse) # 生成整理后的新数据框 clean_data <- School_data %>% filter(subject == "ela") %>% # 只保留英语分数数据 pivot_longer( cols = starts_with("20"), # 匹配所有以20开头的年份列 names_to = "year", # 新列:存储年份 values_to = "score" # 新列:对应年份的分数 ) %>% mutate(year = as.numeric(year)) %>% # 把年份转成数值型,方便绘图排序 filter(State %in% c("CA", "NY", "TX", "FL", "IL")) # 选5个目标州
二、绘图代码(散点+连线+可选趋势线)
用整理好的长格式数据,直接按年份、分数、州分组绘图即可:
ggplot(clean_data, aes(x = year, y = score, color = State, group = State)) + geom_point(size = 2, alpha = 0.7) + # 散点:控制大小和透明度 geom_line(linewidth = 1) + # 点间连线控制粗细 # 可选:添加线性趋势线(不需要就删掉这行) stat_smooth(method = "lm", se = FALSE, linetype = "dashed") + # 自定义标签 labs( title = "各州英语测试分数年度变化", x = "年份", y = "平均分数", color = "州" ) + scale_color_brewer(palette = "Set1") + # 配色方案,可替换成你喜欢的 theme_bw() + # 简洁清爽的主题 theme(plot.title = element_text(hjust = 0.5)) # 标题居中
你之前代码的问题
之前的错误在于直接把年份列当成x/y轴参数,ggplot需要长格式数据才能按年份和州进行分组映射——转长格式是这类时间序列分组绘图的标准流程,完全安全。
内容的提问来源于stack exchange,提问作者Estree Arenal
相关产品推荐
相关产品推荐

