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

