R语言多ID时间序列曲线同图绘制问题求助
解决方案:绘制多ID的温度-年龄曲线
问题分析
你遇到的问题主要来自两处:
- Base R代码中拼写错误(
nrows应为nrow)、颜色分配逻辑错误,以及循环的冗余操作 - ggplot2代码中错误的分组设置(
group=1会把所有数据当成一组),且年龄变量的处理方式导致x轴显示异常
下面针对两种方法分别给出修正后的代码,直接使用你提供的数据集即可运行。
方法1:Base R 绘图修正版
首先加载你提供的数据集并还原成初始的矩阵结构:
# 加载数据集 aql <- structure(list(Id = c("110f", "110f", "110f", "110f", "110f", "110f", "110f", "110f", "110f", "110f", "3270", "3270", "3270", "3270", "3270", "3270", "3270", "3270", "3270", "354f", "354f", "354f", "354f", "354f", "354f", "354f", "354f", "354f", "354f" ), variable = c(1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 3, 6, 9, 12, 15, 18, 21, 24, 27, 1, 4, 7, 10, 13, 16, 19, 22, 25, 28), value = c(38.730612244898, 38.9367346938776, 39.019387755102, 39.2153583617747, 38.9600682593857, 38.9419795221843, 39, 38.8737201365188, 38.5609756097561, 38.8212328767123, NA, 39.5494845360825, 39.5896907216495, 39.9, 39.4855670103093, 39.3525773195876, 39.3855670103093, 39.3632653061225, 39.3575862068965, NA, 39.4225235849057, 39.6268041237113, 39.5020618556701, 39.5895833333333, 39.5666666666667, 39.4302083333333, 39.3822916666667, 39.6345360824742, 39.4631944444444)), row.names = c(NA, -29L ), class = "data.frame") # 重新整理成初始的矩阵结构 age_Temperature <- tapply(aql$value, list(aql$Id, aql$variable), mean)
然后修正绘图代码:
# 定义对应ID数量的颜色集合 my_colors <- c("red", "green", "blue") # 绘制第一条曲线,同时设置y轴范围包含所有数据 plot(age_Temperature[1, ], type='l', pch=20, xlab="âge", ylab="Temperature", col=my_colors[1], ylim=range(age_Temperature, na.rm=TRUE)) # 循环绘制剩余曲线 for (ligne in 2:nrow(age_Temperature)) { # 修正nrows为nrow lines(age_Temperature[ligne, ], col=my_colors[ligne]) # 无需手动递增ligne,for循环会自动迭代 } # 添加图例区分不同ID legend("topright", legend=rownames(age_Temperature), col=my_colors, lty=1)
关键修正点:
- 拼写错误修正:
nrows→nrow - 颜色匹配:让每个ID对应唯一颜色,避免重复使用同一颜色向量
- 轴范围设置:通过
ylim确保所有曲线都在可见范围内 - 添加图例:明确区分不同ID的曲线
方法2:ggplot2 正确版
使用ggplot2时,核心是按Id分组,同时处理缺失值避免干扰:
library(ggplot2) # 清理缺失值(也可在geom_line中设置na.rm=TRUE替代) aql_clean <- na.omit(aql) # 绘制多曲线图表 p <- ggplot(aql_clean, aes(x=variable, y=value, color=Id, group=Id)) + geom_line(linewidth=1) + # 加粗曲线提升可读性 labs( title="Distribution de la temperature en fonction de l'age", x="âge (jours)", y="Temperature", color="ID" ) + theme_minimal() # 可选:美化图表主题 print(p)
关键修正点:
- 分组修正:移除错误的
group=1,改为group=Id(ggplot2会自动根据color=Id分组,显式声明更稳妥) - 缺失值处理:通过
na.omit清理NA,避免曲线断裂或异常显示 - 标签优化:明确x轴为“âge (jours)”,让图表更易理解
- 可选美化:使用
theme_minimal让图表更简洁美观
两种方法都能实现“同一图中显示所有ID对应的曲线,每条曲线使用不同颜色”的需求,你可以根据使用习惯选择其中一种。
内容的提问来源于stack exchange,提问作者Emmanuel GNOFAM
相关产品推荐
相关产品推荐

