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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:57:09