R语言科研绘图:散点图 + 线性回归完整教程(环境因子 vs 物种多样性)

0 阅读6分钟

R语言科研绘图:散点图 + 线性回归完整教程(环境因子 vs 物种多样性)

在生态学、环境科学、土壤学研究中,我们经常需要回答一个问题:某个环境因子是否显著影响了物种多样性?

  • pH 升高,Shannon 指数是上升还是下降?
  • 土壤有机质越多,微生物多样性越高吗?
  • 哪个环境因子对多样性的解释力最强?

最直观的方式就是:散点图 + 线性回归。一张图胜过一堆统计表格。

本文用一个土壤微生物数据集的完整案例,从数据准备到多面板拼图,带你把整个流程跑通。


一、数据结构与准备

这是一份土壤采样数据,共 12 个样点,包含以下变量:

变量含义单位
pH土壤酸碱度
AK速效钾mg/kg
AP速效磷mg/kg
AN碱解氮mg/kg
OM有机质g/kg
W土壤含水量%
Shannon物种多样性指数
PD系统发育多样性指数

数据结构如图所示:

配图1.png

# 读取数据
df <- read.csv("sandian.csv", header = TRUE)

# 查看数据结构
str(df)
head(df)

如果你的数据是 Excel 格式,用 readxl::read_excel() 读入即可。


二、单因子分析:从 lm() 到出图

pH → Shannon 指数 为例,走一遍完整流程。

第一步:线性回归

x <- df$pH
y <- df$Shannon
fit <- lm(y ~ x)
summary(fit)

输出重点关注两个指标:

  • R²(决定系数):衡量回归模型对数据的拟合程度,取值 0~1,越接近 1 说明环境因子对多样性的解释力越强。
  • p 值:检验回归斜率是否显著不为零,通常以 p < 0.05 作为显著阈值。

以 pH 为例的结果:

Multiple R-squared:  0.0004,	 p-value: 0.927

R² = 0.0004,p = 0.927——pH 与 Shannon 指数在本数据集中没有显著线性关系

注意:不显著的结果也是科研中的常态。清楚地知道哪些因子不相关,本身就有重要的科学意义。可视化能帮你客观呈现这种关系,而不是只挑选显著的结果。

第二步:绘制散点图 + 回归线

par(mar = c(5, 5, 3, 1))
plot(x, y,
     xlab = "pH", ylab = "Shannon 指数",
     pch = 16, cex = 1.5, col = "#00AFBB",
     cex.lab = 1.8, cex.axis = 1.3, las = 1)
abline(fit, lwd = 3, col = "#00AFBB")

配图2.png

三、多因子拼图:layout() 批量作图

单张图一张张画效率太低。用 layout() + for 循环可以一次性生成多面板拼图,这是科研论文中的标准做法。

2×3 拼图:6 个环境因子 vs Shannon 指数

# 定义变量和标签
x_vars <- c("pH", "AK", "AP", "AN", "OM", "W")
x_labels <- c("pH", "AK (mg/kg)", "AP (mg/kg)",
              "AN (mg/kg)", "SOM (g/kg)", "W (%)")

# 设置 2 行 3 列布局
layout(matrix(1:6, 2, 3, byrow = TRUE))
par(mar = c(4.5, 4.5, 3, 1))

for (i in seq_along(x_vars)) {
  fit <- lm(df$Shannon ~ df[[x_vars[i]]])
  s <- summary(fit)

  plot(df[[x_vars[i]]], df$Shannon,
       xlab = x_labels[i], ylab = "Shannon",
       pch = 16, cex = 1.3, col = "#00AFBB",
       cex.lab = 1.5, cex.axis = 1.2, las = 1)
  abline(fit, lwd = 3, col = "#00AFBB")

  # 右上角标注 R² 和 p 值
  r2 <- round(s$r.squared, 3)
  p  <- s$coefficients[2, 4]
  p_label <- ifelse(p < 0.001, "p<0.001", paste0("p=", round(p, 3)))
  x_pos <- par("usr")[2] - diff(par("usr")[1:2]) * 0.25
  y_pos <- par("usr")[4] - diff(par("usr")[3:4]) * 0.1
  text(x_pos, y_pos, labels = bquote(R^2 == .(r2) ~ " " ~ .(p_label)),
       cex = 1.1, adj = c(1, 1))
}

保存为高清 PNG

png("scatter_6panel.png", width = 3000, height = 2000, res = 300)
# ... 绘图代码 ...
dev.off()

res = 300 即 300 dpi,满足期刊发表要求。如需 PPT 格式,可用 export 包的 graph2ppt() 函数。

拼图布局修改技巧

# 2行3列,按行填充
layout(matrix(1:6, 2, 3, byrow = TRUE))

# 4行3列,12张图
layout(matrix(1:12, 4, 3))

# 不规则布局:左侧大图 + 右侧两小图
layout(matrix(c(1, 1, 2, 3), 2, 2, byrow = TRUE))

配图3.png


四、结果解读:如何快速筛选关键因子

通过上述代码生成的拼图,我们可以快速回答以下问题:

  1. 哪些环境因子与 Shannon 指数有显著关系?
    看每个子图右上角的 R² 和 p 值。R² 越大、p 值越小,说明该因子对多样性的解释力越强。6 个因子放在一起对比,可以直观地排序出影响最大的因子。在本数据集中,部分养分因子(如 AK、AN)表现出一定趋势,而 pH 与多样性几乎无关(R² ≈ 0)。

  2. 多面板拼图的真正价值
    当你有 10 个甚至 20 个环境因子时,逐一看回归表格会非常痛苦。一张拼图让你一眼抓住关键因子——这在探索性数据分析(EDA)和论文中都非常实用。


五、完整可运行代码

以下代码整合上述所有步骤,复制后修改工作目录即可运行:

# ============================================================
# 散点图 + 线性回归:环境因子与多样性
# ============================================================

# 1. 设置工作目录(改为你的路径)
# setwd("你的数据文件夹路径")

# 2. 读取数据(替换成你的文件名)
df <- read.csv("sandian.csv", header = TRUE)

# 3. 定义作图函数
plot_one <- function(x, y, xlab, ylab) {
  fit <- lm(y ~ x)
  s <- summary(fit)
  r2 <- round(s$r.squared, 3)
  p  <- s$coefficients[2, 4]
  p_label <- ifelse(p < 0.001, "p<0.001", paste0("p=", round(p, 3)))

  plot(x, y, xlab = xlab, ylab = ylab,
       pch = 16, cex = 1.3, col = "#00AFBB",
       cex.lab = 1.5, cex.axis = 1.2, las = 1)
  abline(fit, lwd = 3, col = "#00AFBB")

  x_pos <- par("usr")[2] - diff(par("usr")[1:2]) * 0.25
  y_pos <- par("usr")[4] - diff(par("usr")[3:4]) * 0.1
  text(x_pos, y_pos, labels = bquote(R^2 == .(r2) ~ " " ~ .(p_label)),
       cex = 1.1, adj = c(1, 1))
}

# 4. 配置变量(替换成你的列名)
x_vars   <- c("pH", "AK", "AP", "AN", "OM", "W")
x_labels <- c("pH", "AK (mg/kg)", "AP (mg/kg)",
              "AN (mg/kg)", "SOM (g/kg)", "W (%)")

# 5. 生成 2×3 拼图
png("scatter_6panel.png", width = 3000, height = 2000, res = 300)
layout(matrix(1:6, 2, 3, byrow = TRUE))
par(mar = c(4.5, 4.5, 3, 1))
for (i in seq_along(x_vars)) {
  plot_one(df[[x_vars[i]]], df$Shannon, x_labels[i], "Shannon")
}
dev.off()
cat("已保存:scatter_6panel.png\n")

替换成你的数据的步骤

  1. 准备一个 CSV 文件,第一行为列名,包含你的环境因子列和多样性指数列
  2. 修改 x_vars 为你的环境因子列名
  3. 修改 x_labels 为图上显示的标签(含单位)
  4. 修改 df$Shannon 为你的多样性指数列名
  5. 运行即可

六、实用参数速查

参数作用常用值
pch数据点形状16(实心圆)、1(空心圆)、17(实心三角)
cex点/文字大小1.3~1.5(适中)、1.8(大)
col颜色#00AFBB(青蓝)、#E69F00(橙)、#56B4E9(蓝)
lty线型1(实线)、2(虚线)、3(点线)
lwd线宽2~3(适中)
cex.lab坐标轴标签字号1.5~1.8
cex.axis刻度标签字号1.2~1.3
las刻度标签方向1(始终水平)
res导出图片分辨率300(期刊要求)

补充:R² 不显著怎么办?
如果不显著(p > 0.05):① 这完全正常,不必只展示显著的结果;② 可考虑非线性关系(如用 poly(x, 2) 尝试二次项);③ 如果样本量较小(n < 30),不显著可能是因为统计检验力不足,而非完全没有生态学意义。


如果这篇文章对你有帮助,欢迎点赞 + 收藏