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

Base R绘图图例颜色异常及ggplot循环绘图技术求助

问题1:Base R绘图图例颜色修复

你当前图例只显示一个聚类颜色的原因是,legend()的col参数传入了每个样本的颜色向量(factor(df_syn$Cluster)会生成与样本数等长的颜色索引),但图例只需要对应每个唯一聚类的颜色。

修改方案:先把Cluster转为因子,提取其水平值,再为每个水平分配对应颜色:

set.seed(42)  ## 保证结果可复现
df_syn <- as.data.frame(matrix(runif(n=50, min=1, max=20), nrow=10)) 
names(df_syn) <- c('A', 'B', 'C', 'D', 'E')
df_cr <- data.frame(Cluster=c('A', 'A', 'B', 'B', 'C', 'C', 'C', 'C', 'A', 'B'))
df_syn <- cbind(df_cr, df_syn)
D <- ncol(df_syn[, 2:6])

# 提前定义聚类因子,方便后续调用
cluster_factor <- factor(df_syn$Cluster)
cluster_levels <- levels(cluster_factor)
# 获取每个聚类对应的颜色
cluster_colors <- palette()[seq_along(cluster_levels)]

for (i in 2:D) {
  for (j in 2:D) {
    if (i == j) {
      plot(0, 0, type="n", xaxt="n", yaxt="n")
      text(0, 0, names(df_syn[i]))
    } else {
      Z <- robCompositions::pivotCoord(df_syn[, c(i, j, 2:D[-c(i, j)])], method="symm")
      plot(Z[, 1:2], 
           xlab=colnames(df_syn[i]), ylab=colnames(df_syn[j]), 
           col=cluster_factor, pch=19)
      # 图例使用聚类水平和对应颜色
      legend("bottomright", legend=cluster_levels, pch=19, ncol=1, col=cluster_colors)
    }
  }
}
问题2:ggplot循环绘图实现

ggplot在循环中需要显式调用print()才能显示图像,同时需要将计算后的枢轴坐标与聚类信息合并为数据框,方便ggplot调用:

set.seed(42)  ## 保证结果可复现
df_syn <- as.data.frame(matrix(runif(n=50, min=1, max=20), nrow=10)) 
names(df_syn) <- c('A', 'B', 'C', 'D', 'E')
df_cr <- data.frame(Cluster=c('A', 'A', 'B', 'B', 'C', 'C', 'C', 'C', 'A', 'B'))
df_syn <- cbind(df_cr, df_syn)
D <- ncol(df_syn[, 2:6])

# 加载ggplot2
library(ggplot2)

for (i in 2:D) {
  for (j in 2:D) {
    if (i == j) {
      # 绘制对角线的变量名图,用ggplot实现
      p <- ggplot() +
        geom_text(aes(x=0, y=0, label=names(df_syn[i])), size=10) +
        theme_void()
      print(p)
    } else {
      Z <- robCompositions::pivotCoord(df_syn[, c(i, j, 2:D[-c(i, j)])], method="symm")
      # 合并数据:枢轴坐标 + 聚类信息
      plot_data <- cbind(Z[, 1:2], Cluster=df_syn$Cluster)
      # 重命名列,方便ggplot调用
      colnames(plot_data) <- c("x", "y", "Cluster")
      
      p <- ggplot(plot_data, aes(x=x, y=y, color=Cluster)) +
        geom_point(size=3, shape=19) +
        labs(x=colnames(df_syn[i]), y=colnames(df_syn[j])) +
        theme_bw() +
        theme(legend.position="bottomright")
      # 循环中必须print才能显示图像
      print(p)
    }
  }
}

说明

  • Base R部分:通过提前提取聚类水平和对应颜色,确保图例颜色与点的颜色一一对应。
  • ggplot部分:将计算结果与聚类信息合并为数据框,利用aes(color=Cluster)自动映射颜色,循环中通过print(p)触发图像显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:35:17