如何在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
相关产品推荐
相关产品推荐

