如何在base R中绘制按温度分组的压力-粘度散点图及对应回归线?
base R实现分组拟合回归线+分面展示方案
以下两种方案均无需使用ggplot2,可直接在base R环境运行:
方案1:分面布局(完全匹配ggplot2的facet_wrap效果)
将4个温度水平的散点、回归线分别放在独立子图中,实现逻辑和facet_wrap完全一致:
- 先通过
par()设置2行2列的画布布局,匹配4个温度水平 - 遍历每个温度水平,筛选对应子集后绘制散点、拟合线性回归、添加回归线
- 绘图结束后重置画布参数,避免影响后续绘图操作
示例代码
# -------------------------- # 1. 示例数据构造(有实际数据可直接跳过该段) # -------------------------- set.seed(123) pressure <- runif(200, 1, 10) temp <- factor(rep(c(0,25,44,98), each=50), levels = c(0,25,44,98)) viscosity <- 2*pressure + as.numeric(temp)*0.5 + rnorm(200, 0, 1) df <- data.frame(viscosity, pressure, temp) # -------------------------- # 2. 分面绘图代码 # -------------------------- # 保存原始画布参数,用于后续重置 old_par <- par(no.readonly = TRUE) # 设置2行2列分面,调整边距避免标签重叠 par(mfrow = c(2,2), mar = c(4,4,2,1)) # 遍历每个温度水平绘图 for (t in levels(df$temp)) { sub_df <- df[df$temp == t, ] # 绘制散点 plot(sub_df$pressure, sub_df$viscosity, main = paste0("温度 = ", t, "℃"), xlab = "pressure", ylab = "viscosity", pch = 16, col = "steelblue") # 拟合当前组的线性回归 fit <- lm(viscosity ~ pressure, data = sub_df) # 添加回归线 abline(fit, col = "red", lwd = 2) # 可选:添加R²标注,不需要可删除 r2 <- round(summary(fit)$r.squared, 3) legend("topleft", legend = paste0("R² = ", r2), bty = "n") } # 重置画布参数 par(old_par)
方案2:单图分组展示
如果不需要分面,也可以在同一张图中用不同颜色区分不同温度的散点和回归线:
# 定义每个温度对应的颜色 temp_colors <- c("0" = "steelblue", "25" = "darkorange", "44" = "forestgreen", "98" = "firebrick") # 先绘制空白画布确定坐标轴范围 plot(df$pressure, df$viscosity, type = "n", xlab = "pressure", ylab = "viscosity") # 遍历每个温度水平添加图形元素 for (t in levels(df$temp)) { sub_df <- df[df$temp == t, ] # 添加散点 points(sub_df$pressure, sub_df$viscosity, pch = 16, col = temp_colors[t]) # 拟合回归并添加回归线 fit <- lm(viscosity ~ pressure, data = sub_df) abline(fit, col = temp_colors[t], lwd = 2) } # 添加图例 legend("topleft", legend = paste0("温度 = ", names(temp_colors), "℃"), col = temp_colors, pch = 16, lwd = 2, bty = "n")
内容的提问来源于stack exchange,提问作者Eva
相关产品推荐
相关产品推荐

