如何在R语言绘制的弦图中显示原始行名
解决circlize弦图扇区标签显示R1/R2而非原始行名的问题
问题描述
我希望在R语言绘制的弦图中,将扇区标签替换为原始数据的行名,而非当前显示的R1、R2、R3。尝试了以下代码,但生成的弦图仍显示R1、R2、R3等默认标签:
library(circlize) library(readr) df <- read_csv("chord_diag_final.csv", show_col_types = FALSE) rownames(df) <- df[[1]] df <- df[,-1] print(rownames(df)) data <- as.matrix(df) chordDiagram(as.data.frame(data), annotationTrack = "grid", preAllocateTracks = 1) circos.trackPlotRegion(track.index = 2, panel.fun = function(x, y) { xlim = get.cell.meta.data("xlim") ylim = get.cell.meta.data("ylim") sector.name = get.cell.meta.data("sector.index") circos.text(mean(xlim), ylim[1] + 2.5, sector.name, facing = "clockwise", niceFacing = TRUE, adj = c(0, 0.5), cex=0.6) circos.axis(h = "top", labels.cex = 0.5, major.tick.percentage = 0.2, sector.index = sector.name, track.index = 2) }, bg.border = NA)
解决方案
问题出在将矩阵转换为data.frame时,行名信息丢失,导致chordDiagram使用默认的R1/R2命名。修正方法如下:
修正后的代码
library(circlize) library(readr) # 读取数据并设置行名 df <- read_csv("chord_diag_final.csv", show_col_types = FALSE) rownames(df) <- df[[1]] df <- df[,-1] # 转换为矩阵,并确保列名与行名一致(因为数据是对称的,行/列对应同一类别) data_matrix <- as.matrix(df) colnames(data_matrix) <- rownames(data_matrix) # 直接传入矩阵到chordDiagram,无需转成data.frame chordDiagram(data_matrix, annotationTrack = "grid", preAllocateTracks = 1) # 绘制自定义标签和轴 circos.trackPlotRegion(track.index = 2, panel.fun = function(x, y) { xlim <- get.cell.meta.data("xlim") ylim <- get.cell.meta.data("ylim") sector.name <- get.cell.meta.data("sector.index") circos.text(mean(xlim), ylim[1] + 2.5, sector.name, facing = "clockwise", niceFacing = TRUE, adj = c(0, 0.5), cex=0.6) circos.axis(h = "top", labels.cex = 0.5, major.tick.percentage = 0.2, sector.index = sector.name, track.index = 2) }, bg.border = NA) # 关闭circos绘图环境,避免后续冲突 circos.clear()
关键修正点
- 保留矩阵的行/列名:不要将矩阵转换为
data.frame,直接使用带命名的矩阵传入chordDiagram,函数会自动识别行名和列名作为扇区标签。 - 统一列名与行名:因为你的数据是对称关联矩阵,列名需要和行名保持一致,确保扇区对应原始类别名称。
- 添加circos.clear():完成绘图后清理circos环境,避免影响后续绘图操作。
内容的提问来源于stack exchange,提问作者Shradha Sharma
相关产品推荐
相关产品推荐

