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

在R的facet_grid多面板图中为各模型添加独立回归线的方法

问题

我绘制了一个2×2网格的图形,每个面板包含两个模型的数据。我需要为每个面板中的每个模型添加独立的回归线,请问能否通过facet_grid实现该需求?目前我已完成图形的其他部分,仅缺少回归线,代码如下:

df <- data.frame(year=factor(c(2000,2001,2002,2000,2001,2002,2000,2001,2002,2000,2001,2002,
                        2000,2001,2002,2000,2001,2002,2000,2001,2002,2000,2001,2002)),
                 crop=c("Maize","Maize","Maize","Maize","Maize","Maize",
                        "Soybean","Soybean","Soybean","Soybean","Soybean","Soybean",
                        "Maize","Maize","Maize","Maize","Maize","Maize",
                        "Soybean","Soybean","Soybean","Soybean","Soybean","Soybean"),
                 treatment_code=c("T1","T1","T1","T2","T2","T2",
                                  "T1","T1","T1","T2","T2","T2",
                                  "T1","T1","T1","T2","T2","T2",
                                  "T1","T1","T1","T2","T2","T2"),
                 value=c(9,10,8.5,11,12,7.8,
                         4,7,7.5,3,3,5,
                         12,11,9,13,9,10,
                         5,3,6,4,5,4),
                 model=c("A","A","A","A","A","A","A","A","A","A","A","A",
                         "B","B","B","B","B","B","B","B","B","B","B","B"))

gY_calib <- df %>%
  ggplot(aes(x=year, y=value, color=model, show.legend=TRUE)) +
  geom_point(show.legend=TRUE) +
  xlab("Year") +
  ylab(expression('Grain Yield (Mg ha ' ^-1*')')) +
  ylim(0,13) +
  facet_grid(crop~treatment_code) 

gY_calib

当前绘制的2×2网格图形:每个面板对应一种作物(Maize/Soybean)和一种处理(T1/T2),面板内以不同颜色区分模型A和B的散点数据。


解决方案

完全可以通过facet_grid实现需求,只需两个关键修改:

  • 将year从因子类型转换为数值类型(线性回归需要连续自变量,原数据中year是因子,无法直接拟合随年份变化的回归线)
  • 添加geom_smooth()图层,指定线性回归方法

修改后的完整代码

df <- data.frame(year=factor(c(2000,2001,2002,2000,2001,2002,2000,2001,2002,2000,2001,2002,
                        2000,2001,2002,2000,2001,2002,2000,2001,2002,2000,2001,2002)),
                 crop=c("Maize","Maize","Maize","Maize","Maize","Maize",
                        "Soybean","Soybean","Soybean","Soybean","Soybean","Soybean",
                        "Maize","Maize","Maize","Maize","Maize","Maize",
                        "Soybean","Soybean","Soybean","Soybean","Soybean","Soybean"),
                 treatment_code=c("T1","T1","T1","T2","T2","T2",
                                  "T1","T1","T1","T2","T2","T2",
                                  "T1","T1","T1","T2","T2","T2",
                                  "T1","T1","T1","T2","T2","T2"),
                 value=c(9,10,8.5,11,12,7.8,
                         4,7,7.5,3,3,5,
                         12,11,9,13,9,10,
                         5,3,6,4,5,4),
                 model=c("A","A","A","A","A","A","A","A","A","A","A","A",
                         "B","B","B","B","B","B","B","B","B","B","B","B"))

# 将year转换为数值型
df$year <- as.numeric(as.character(df$year))

gY_calib <- df %>%
  ggplot(aes(x=year, y=value, color=model, show.legend=TRUE)) +
  geom_point(show.legend=TRUE) +
  # 添加线性回归线,se=FALSE移除置信区间(如需保留可删除该参数)
  geom_smooth(method = "lm", se = FALSE) +
  xlab("Year") +
  ylab(expression('Grain Yield (Mg ha ' ^-1*')')) +
  ylim(0,13) +
  facet_grid(crop~treatment_code) 

gY_calib

关键说明

  1. year类型转换:as.numeric(as.character(df$year))把因子型的年份转为连续数值,确保回归模型能正确拟合年份与产量的线性关系。
  2. geom_smooth参数:method="lm"指定用线性模型拟合回归线,se=FALSE关闭置信区间(如果需要展示置信区间,去掉这个参数即可)。由于全局aes中已经指定了color=model,geom_smooth会自动为每个模型生成独立的回归线,同时facet_grid的分组逻辑会保证每个面板内的回归线仅基于当前面板的作物和处理数据计算。

内容的提问来源于stack exchange,提问作者E Maas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:24:53