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

R语言中绘制分颜色类别和弦图及多图分面的技术咨询

R和弦图分面与单区间展示解决方案

背景:构建相关系数矩阵

首先构建相关系数矩阵dat:

dat <- as.matrix(cbind(c(1.0000000, 0.5161944, 0.5190630, 0.3717464, 0.5719125),
                       c(0.5161944, 1.0000000, 0.2549985, 0.8469740, 0.7761113),
                       c(0.5190630, 0.2549985, 1.0000000, 0.2130771, 0.2930945),
                       c(0.3717464, 0.8469740, 0.2130771, 1.0000000, 0.5652874),
                       c(0.5719125, 0.7761113, 0.2930945, 0.5652874, 1.0000000))
)
colnames(dat) <- c(paste0("X",1:ncol(dat)))
rownames(dat) <- c(paste0("X",1:ncol(dat)))
dat[lower.tri(dat)] <- 0 

原有融合颜色的和弦图代码

已实现融合两种颜色的和弦图绘制:

MyBreaks <- c(0, 0.5, 1)
MyColors <- c("red", "green")

labels <- rownames(dat)

# 定义颜色分配函数
getColor <- function(val, i, j) {
  if (val >= 0 && val < 0.5) {
    return(MyColors[1])
  } else  {
    return(MyColors[2])
  }
}

zero_mat <- (dat == 0)
col_vec <- sapply(as.vector(dat), getColor, i = row(dat), j = col(dat))

col_vec[zero_mat] <- "#00000000"

# 绘制和弦图
chordDiagram(dat, order = labels, col = col_vec, 
             annotationTrack = c("name", "grid"))

问题与解决方案

问题1:分别展示单颜色区间的和弦图

需要生成两幅和弦图,分别仅展示绿色线条(相关系数≥0.5)和红色线条(0≤相关系数<0.5)。

解决方案代码

核心思路是对每个颜色区间生成仅保留该区间数值的矩阵,其余值置0,再通过布局函数分开展示:

# 设置1行2列的绘图布局
par(mfrow = c(1, 2))
labels <- rownames(dat)

# 1. 仅展示绿色线条(相关系数≥0.5)
dat_green <- dat
dat_green[dat_green < 0.5] <- 0
chordDiagram(dat_green, order = labels, col = "green", 
             annotationTrack = c("name", "grid"), main = "相关系数≥0.5")

# 2. 仅展示红色线条(0≤相关系数<0.5)
dat_red <- dat
dat_red[dat_red >= 0.5 | dat_red == 0] <- 0
chordDiagram(dat_red, order = labels, col = "red", 
             annotationTrack = c("name", "grid"), main = "0≤相关系数<0.5")

# 重置绘图布局
par(mfrow = c(1, 1))

问题2:多区间和弦图的分面布局

扩展为4个系数区间时,需用par(mfrow = c(2,2))实现2行2列的分面布局,每个子图对应一个系数区间。

解决方案代码

通过循环遍历每个区间,生成对应子矩阵后逐个绘制:

# 设置2行2列的绘图布局
par(mfrow = c(2, 2))

labels <- rownames(dat)
# 定义区间断点、对应颜色和标题
MyBreaks <- c(0, 0.25, 0.5, 0.75, 1)
MyColors <- c("red", "green", "yellow", "blue")
interval_titles <- c("0≤相关系数<0.25", "0.25≤相关系数<0.5", 
                     "0.5≤相关系数<0.75", "相关系数≥0.75")

# 遍历每个区间绘制和弦图
for (i in 1:length(MyColors)) {
  dat_sub <- dat
  # 仅保留当前区间的相关系数,其余置0
  dat_sub[!(dat_sub >= MyBreaks[i] & dat_sub < MyBreaks[i+1])] <- 0
  # 绘制子图
  chordDiagram(dat_sub, order = labels, col = MyColors[i], 
               annotationTrack = c("name", "grid"), main = interval_titles[i])
}

# 重置绘图布局
par(mfrow = c(1, 1))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:37:19