基于Iris数据集的异常相关系数组直方图绘制循环实现求助
解决Iris数据集异常组差值分布直方图的循环实现问题
原代码核心问题
- 循环遍历对象错误:直接遍历
outliers数据框,实际应遍历异常组的Species名称 - 未构建对比数据集:缺少「当前异常组」与「整体样本」的差值区分逻辑
- 语法错误:
labs(fill="")print(x)缺少语法连接符,导致代码无法运行 - 绘图参数缺失:
aes中x和fill未指定对应变量
修正后的完整代码
library(datasets) library(ggplot2) library(dplyr) library(hrbrthemes) # 加载数据集 data(iris) # Step 1: 分组计算Spearman相关系数并识别异常组 corr <- iris %>% group_by(Species) %>% summarise(correlation = cor(Sepal.Length, Sepal.Width, method = 'spearman'), .groups = "drop") Q1 <- quantile(corr$correlation, 0.25) Q3 <- quantile(corr$correlation, 0.75) iqr_val <- IQR(corr$correlation) # 避免与内置函数IQR重名 outliers <- corr %>% filter(correlation < (Q1 - 0.5*iqr_val) | correlation > (Q3 + 0.5*iqr_val)) # Step 2: 为每个异常组绘制对比直方图 # 提前计算所有样本的差值 iris$diff <- iris$Sepal.Length - iris$Sepal.Width # 遍历异常组的物种名称 for (sp in outliers$Species) { # 拼接对比数据集:当前异常组 + 整体样本 plot_data <- bind_rows( iris %>% filter(Species == sp) %>% mutate(group = paste(sp, "组")), iris %>% mutate(group = "整体样本") ) # 生成直方图 p <- ggplot(plot_data, aes(x = diff, fill = group)) + geom_histogram(color = "#e9ecef", alpha = 0.6, position = "identity", bins = 15) + scale_fill_manual(values = c("#69b3a2", "#404080")) + theme_ipsum() + labs( title = paste("差值分布对比:", sp, "组 vs 整体样本"), x = "Sepal.Length - Sepal.Width 差值", fill = "分组" ) # 输出图形 print(p) }
关键优化说明
- 重命名
IQR变量为iqr_val,避免与内置函数冲突 - 提前计算所有样本的差值
diff,简化循环内重复计算 - 循环遍历
outliers$Species,确保每次仅处理一个异常组 - 用
bind_rows拼接对比数据并添加group列,实现分组填充区分 - 修复
geom_histogram的position参数为identity,实现重叠直方图效果,补充bins参数控制区间数量 - 完善图表标题与坐标轴标签,提升可读性
内容的提问来源于stack exchange,提问作者jacbin76
相关产品推荐
相关产品推荐

