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

如何在R语言Iris数据集关联图中添加拟合线并优化可视化?

在R语言中给Iris变量关联图添加拟合线并美化图表

针对你用Iris数据集绘制变量关联图的需求,这里给出添加拟合线和美化图表的具体方案:

一、添加拟合线的实现方法

1. 线性拟合线

适合变量间存在线性趋势的场景,用线性回归模型拟合后直接绘制直线,注意只用xlim范围内的数据拟合,避免无关数据干扰结果:

# 筛选x在5.5-8之间的子集
subset_df <- subset(df, Sepal.Length >= 5.5 & Sepal.Length <= 8)
# 构建线性模型
model_lm <- lm(subset_df[,i] ~ subset_df$Sepal.Length, data = subset_df)
# 绘制红色拟合线,线宽2
abline(model_lm, col = "darkred", lwd = 2)

2. 指数拟合曲线

如果数据呈现指数趋势,用非线性最小二乘法拟合,注意添加try()避免部分变量拟合失败导致循环中断:

try({
  # 指数模型,需要指定初始参数
  model_exp <- nls(subset_df[,i] ~ a * exp(b * subset_df$Sepal.Length), 
                   start = list(a = 1, b = 0.1),
                   data = subset_df)
  # 生成连续x序列用于绘制曲线
  x_seq <- seq(5.5, 8, length.out = 100)
  y_pred <- predict(model_exp, newdata = list(Sepal.Length = x_seq))
  # 绘制蓝色虚线拟合曲线,线宽2
  lines(x_seq, y_pred, col = "darkblue", lwd = 2, lty = 2)
})

二、美化图表的实用技巧

把这些细节加进去,既能保留关联展示,又能让图表更清晰美观:

  • 区分物种分组:给不同物种的点上色,直观展示分组差异:col = subset_df$Species
  • 优化标签与标题:替换模糊的ylab="Y"为具体变量名,添加明确标题:ylab = "Sepal Length"、main = paste("Sepal Length vs", colnames(df)[i])
  • 调整点样式:用实心点更醒目:pch = 16,配合cex=0.8调整点大小
  • 添加网格辅助:grid(col = "gray80", lty = 3),方便读取数值
  • 统一画布边距:设置par(mar = c(4,4,2,1))避免坐标轴标签被截断
  • 精简图例:只在最后一个子图添加图例,避免重复:
if (i == ncol(df)) {
  legend("topright", 
         legend = c(levels(df$Species), "Linear Fit", "Exponential Fit"),
         col = c(1:3, "darkred", "darkblue"),
         pch = c(16,16,16, NA, NA),
         lty = c(NA,NA,NA, 1, 2),
         cex = 0.7)
}

完整代码示例

library(datasets)
data(iris)
df <- iris

# 设置2行2列的画布布局,调整边距
par(mfrow = c(2, 2), mar = c(4, 4, 2, 1)) 

# 遍历除第一列外的所有变量
for (i in seq(ncol(df))[-1]) {
  # 筛选x在5.5-8之间的数据
  subset_df <- subset(df, Sepal.Length >= 5.5 & Sepal.Length <= 8)
  
  # 绘制美化后的散点图
  plot(subset_df$Sepal.Length, subset_df[, i], 
       xlim = c(5.5, 8),
       xlab = colnames(df)[i], 
       ylab = "Sepal Length",
       main = paste("Sepal Length vs", colnames(df)[i]),
       pch = 16, 
       col = subset_df$Species,
       cex = 0.8)
  
  # 添加线性拟合线
  model_lm <- lm(subset_df[,i] ~ subset_df$Sepal.Length, data = subset_df)
  abline(model_lm, col = "darkred", lwd = 2)
  
  # 添加指数拟合曲线(兼容拟合失败情况)
  try({
    model_exp <- nls(subset_df[,i] ~ a * exp(b * subset_df$Sepal.Length), 
                     start = list(a = 1, b = 0.1),
                     data = subset_df)
    x_seq <- seq(5.5, 8, length.out = 100)
    y_pred <- predict(model_exp, newdata = list(Sepal.Length = x_seq))
    lines(x_seq, y_pred, col = "darkblue", lwd = 2, lty = 2)
  })
  
  # 添加网格线
  grid(col = "gray80", lty = 3)
  
  # 最后一个图添加图例
  if (i == ncol(df)) {
    legend("topright", 
           legend = c(levels(df$Species), "Linear Fit", "Exponential Fit"),
           col = c(1:3, "darkred", "darkblue"),
           pch = c(16,16,16, NA, NA),
           lty = c(NA,NA,NA, 1, 2),
           cex = 0.7)
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:39:54