如何实现任意两事件间仅单一路径的Chord Diagram?附R代码
实现两事件间仅单路径的弦图(Chord Diagram)
我希望制作一个任意两个事件之间仅存在一条路径的Chord Diagram,以下是我的R代码:
library(stringr) library(circlize) Subject <- 1:137 set.seed(123) # Create 'EventA' variable with binomial distribution EventA <- rbinom(137, size = 1, prob = 0.68) EventB <- rbinom(137, size = 1, prob = 0.62) EventC <- rbinom(137, size = 1, prob = 0.81) EventD <- rbinom(137, size = 1, prob = 0.55) EventE <- rbinom(137, size = 1, prob = 0.71) EventF <- rbinom(137, size = 1, prob = 0.77) data <- data.frame(Subject, EventA, EventB, EventC, EventD, EventE, EventF) data$Subject <- str_sub(data$Subject, -5, -1) ############################################# events <- as.matrix(data[, -1]) num_sectors <- ncol(events) co_occurrence <- t(events) %*% events diag(co_occurrence) <- 0 event_names <- c("EventA", "EventB", "EventC", "EventD", "EventE", "EventF") event_numerosity <- colSums(data[,c(-1,-8)]) event_labels <- paste(event_names, "N = ", event_numerosity) colnames(co_occurrence) <- rownames(co_occurrence) <- event_labels print(co_occurrence) grid.col <- setNames(rainbow(length(unlist(dimnames(co_occurrence)))), union(rownames(co_occurrence), colnames(co_occurrence))) chordDiagram(co_occurrence, grid.col = grid.col)
当前代码生成的弦图中,任意两个事件间存在双向路径,要实现仅单条路径的效果,可按以下方式修改:
解决思路
核心是处理共现矩阵,仅保留上三角或下三角区域的连接值,将另一区域设为0,这样chordDiagram只会绘制单方向的弦,实现两事件间仅一条路径的效果。
修改后的完整代码
library(stringr) library(circlize) Subject <- 1:137 set.seed(123) # 创建事件变量 EventA <- rbinom(137, size = 1, prob = 0.68) EventB <- rbinom(137, size = 1, prob = 0.62) EventC <- rbinom(137, size = 1, prob = 0.81) EventD <- rbinom(137, size = 1, prob = 0.55) EventE <- rbinom(137, size = 1, prob = 0.71) EventF <- rbinom(137, size = 1, prob = 0.77) data <- data.frame(Subject, EventA, EventB, EventC, EventD, EventE, EventF) data$Subject <- str_sub(data$Subject, -5, -1) # 转换为事件矩阵 events <- as.matrix(data[, -1]) # 计算共现矩阵 co_occurrence <- t(events) %*% events diag(co_occurrence) <- 0 # 移除自身连接 # 关键:保留上三角矩阵,下三角设为0(仅保留单方向连接) co_occurrence[lower.tri(co_occurrence)] <- 0 # 设置标签 event_names <- c("EventA", "EventB", "EventC", "EventD", "EventE", "EventF") event_numerosity <- colSums(data[, -1]) event_labels <- paste(event_names, "N = ", event_numerosity) colnames(co_occurrence) <- rownames(co_occurrence) <- event_labels # 设置颜色 grid.col <- setNames(rainbow(length(event_labels)), event_labels) # 绘制弦图 chordDiagram(co_occurrence, grid.col = grid.col)
关键说明
co_occurrence[lower.tri(co_occurrence)] <- 0:将共现矩阵的下三角区域全部设为0,只保留上三角的连接值,这样任意两个事件之间只会有一条按扇区顺序的单方向弦。如果需要保留下三角路径,替换为co_occurrence[upper.tri(co_occurrence)] <- 0即可。- 修改后,弦图中任意一对事件之间只会显示一条连接路径,完全符合需求。
内容的提问来源于stack exchange,提问作者Bibi
相关产品推荐
相关产品推荐

