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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:33:24