R语言科研绘图:散点图 + 线性回归完整教程(环境因子 vs 物种多样性)
在生态学、环境科学、土壤学研究中,我们经常需要回答一个问题:某个环境因子是否显著影响了物种多样性?
- pH 升高,Shannon 指数是上升还是下降?
- 土壤有机质越多,微生物多样性越高吗?
- 哪个环境因子对多样性的解释力最强?
最直观的方式就是:散点图 + 线性回归。一张图胜过一堆统计表格。
本文用一个土壤微生物数据集的完整案例,从数据准备到多面板拼图,带你把整个流程跑通。
一、数据结构与准备
这是一份土壤采样数据,共 12 个样点,包含以下变量:
| 变量 | 含义 | 单位 |
|---|---|---|
| pH | 土壤酸碱度 | — |
| AK | 速效钾 | mg/kg |
| AP | 速效磷 | mg/kg |
| AN | 碱解氮 | mg/kg |
| OM | 有机质 | g/kg |
| W | 土壤含水量 | % |
| Shannon | 物种多样性指数 | — |
| PD | 系统发育多样性指数 | — |
数据结构如图所示:
# 读取数据
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")
三、多因子拼图: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))
四、结果解读:如何快速筛选关键因子
通过上述代码生成的拼图,我们可以快速回答以下问题:
-
哪些环境因子与 Shannon 指数有显著关系?
看每个子图右上角的 R² 和 p 值。R² 越大、p 值越小,说明该因子对多样性的解释力越强。6 个因子放在一起对比,可以直观地排序出影响最大的因子。在本数据集中,部分养分因子(如 AK、AN)表现出一定趋势,而 pH 与多样性几乎无关(R² ≈ 0)。 -
多面板拼图的真正价值
当你有 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")
替换成你的数据的步骤
- 准备一个 CSV 文件,第一行为列名,包含你的环境因子列和多样性指数列
- 修改
x_vars为你的环境因子列名 - 修改
x_labels为图上显示的标签(含单位) - 修改
df$Shannon为你的多样性指数列名 - 运行即可
六、实用参数速查
| 参数 | 作用 | 常用值 |
|---|---|---|
| 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),不显著可能是因为统计检验力不足,而非完全没有生态学意义。
如果这篇文章对你有帮助,欢迎点赞 + 收藏。