如何在R中绘制Y值数量不同的双系列图:拟合值与普查观测值
问题描述
我有8年的人口普查数据及对应人口观测值,通过模型计算了对应年份的拟合值,同时估算了普查年(间隔10年)之间的人口值。希望在同一张图中绘制覆盖所有年份(普查年与非普查年)的拟合值,同时仅在普查年绘制人口观测值。请问在R中实现该需求的最佳方法是什么?
以下是数据片段:
Census Yr. Observed Fitted 1881 155179 159065.7154 165281.5066 171412.0231 177443.1571 183361.9961 189156.8866 194817.4808 200334.7674 205701.0867 210910.132 1891 223314 215956.9368 220837.8509 225550.5055 230093.7686 234467.6931 238673.4581 242713.3047 246590.4685 250309.1086 253874.2355 1901 265780 257291.6383
解决方案
1. 整理数据
原始数据格式不规整,首先要转换成每行对应一个年份的整洁格式,补全缺失的普查年和观测值,同时生成连续年份列:
# 读取并构造数据框 df <- read.table(text = "Census_Yr Observed Fitted 1881 155179 159065.7154 NA 165281.5066 NA 171412.0231 NA 177443.1571 NA 183361.9961 NA 189156.8866 NA 194817.4808 NA 200334.7674 NA 205701.0867 NA 210910.132 1891 223314 215956.9368 NA 220837.8509 NA 225550.5055 NA 230093.7686 NA 234467.6931 NA 238673.4581 NA 242713.3047 NA 246590.4685 NA 250309.1086 NA 253874.2355 1901 265780 257291.6383", header = TRUE, stringsAsFactors = FALSE) # 用前向填充补全普查年和观测值的缺失值 library(zoo) df$Census_Yr <- na.locf(df$Census_Yr) df$Observed <- na.locf(df$Observed) # 生成连续年份:每个普查年对应10个连续年份(如1881-1890) df$Year <- unlist(lapply(unique(df$Census_Yr), function(x) x:(x+9)))
2. 绘图实现
方法一:使用ggplot2(推荐)
ggplot2支持分层绘图,轻松实现拟合值折线+普查年观测值点的效果:
library(ggplot2) ggplot(df, aes(x = Year)) + # 绘制覆盖所有年份的拟合值折线 geom_line(aes(y = Fitted), color = "#1f77b4", linewidth = 1) + # 仅在普查年绘制观测值点,通过subset筛选数据 geom_point(data = subset(df, Year == Census_Yr), aes(y = Observed), color = "#ff4b5c", size = 3) + # 添加标签和主题 labs(x = "年份", y = "人口数", title = "人口拟合值与普查观测值对比") + theme_minimal()
方法二:使用基础绘图系统
如果习惯基础绘图,也可以分步实现:
# 先绘制拟合值折线 plot(df$Year, df$Fitted, type = "l", col = "#1f77b4", lwd = 2, xlab = "年份", ylab = "人口数", main = "人口拟合值与普查观测值对比") # 筛选普查年数据,叠加观测值点 obs_data <- subset(df, Year == Census_Yr) points(obs_data$Year, obs_data$Observed, col = "#ff4b5c", pch = 19, cex = 1.5) # 添加图例 legend("topleft", legend = c("拟合值", "普查观测值"), col = c("#1f77b4", "#ff4b5c"), lty = c(1, NA), pch = c(NA, 19), cex = 0.8)
关键提示
- 数据整理是前提:必须把非规整数据转换成每行对应一个年份的格式,否则无法准确映射年份和数值。
- 分层绘图逻辑:拟合值用折线覆盖全年份,观测值仅在
Year == Census_Yr的行(即普查年)显示,通过数据筛选实现精准控制。
内容的提问来源于stack exchange,提问作者User1865345
相关产品推荐
相关产品推荐

