首页 > 解决方案 > 基于矩阵输入格式化和弦图

问题描述

现在的情况

在我之前的问题Data frame into a symmetric matrix 同时保留所有 row 和 column中,我最终得到了一个对称矩阵,我想将其转换为这样的格式化和弦图:

library(edgebundleR)

# data
x <- structure(c(1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0), 
               .Dim = c(3L,5L), 
               .Dimnames = list(c("a.X", "a.Y", "b.Z"), c("a.A", "a.B", "a.C", "b.D", "b.E")))
x <- as.matrix(x)
x <- rbind(cbind(diag(nrow(x)), x), cbind(t(x), diag(ncol(x))))
colnames(x) <- rownames(x)

# plot
edgebundle(x)

# plot with basic formatting using the arguments of edgebundle()
edgebundle(x,
           tension=1,
           fontsize = 12,
           cutoff = 0, 
           width = 1000,
           padding = 230,
           nodesize = c(5, 30))

问题

但是,类似于使用 edgebundle 在弦图中着色边缘和顶点我想更进一步并更改线和节点的颜色(默认情况下和鼠标悬停期间),这在使用 igraph-object 时是可能的,如图所示在R和文档中的网络和弦图问题中

在阅读了我的PDF 文档后,edgebundleR我想这不是该软件包功能的一部分,但它也可以...

我的问题

  1. 当使用矩阵而不是 igraph 对象时,是否可以为每组的线和节点着色,优先使用颜色代码(rgb,十六进制),如果是,如何?
  2. 尽管没有包含在基本功能中,有没有办法从上面进行高级格式化?(当然,不必在很大程度上重写或扩展包)

谢谢你的建议!

标签: rmatrixplotchord-diagram

解决方案


与此同时,我想出了一种方法来改变整体情节的颜色(包括文本、线条和节点)。我想在这里分享它,以便为有类似抱负的人节省几个小时的研究时间。

1. 改变和弦图的颜色

它通过将矩阵转换为 igraph 对象并通过 verticesV()函数设置颜色来工作。颜色可以按组设置,每个顶点使用回收或仅使用一种颜色时作为一个整体设置。

library(igraph)   

# transform into igraph-object
y <- graph_from_adjacency_matrix(as.matrix(x, "adjacency"), mode = "undirected")

# setting colors

# Per group
V(y)[which(substring(colnames(x),0,1) %in% "a")]$color <- "green"
V(y)[which(substring(colnames(x),0,1) %in% "b")]$color <- "red"
edgebundle(y)

# vertex per vertex
V(y)$color <- c("green", "red") 
edgebundle(y)

# as a whole
V(y)$color <- "#a98561" # hex-codes are supported
edgebundle(y)

2. 高级格式化

毕竟,igraph 带有用于定义标题y$main、更改线条颜色(即边缘)的功能,通过使用该E()功能E(y)$color、更改标签字体V(y)$label.family和其他工具以获得更好的格式(参见:手册)。edgebundleR不幸的是,软件包不支持这些东西。它们在使用时没有任何作用。下面,我提供了一个简短的示例,以了解这些设置显示 和 之间的edgebundle()差异plot.igraph()

# settings
y$main <- "Title"
E(y)$color <- "red"
V(y)$label.family <- "Arial"

# see plots
plot.igraph(y)
edgebundle(y)

如果不扩展包,似乎不可能在鼠标悬停期间更改线条的颜色,即边缘。edgebundle()的默认设置为标准线指向蓝色,鼠标悬停时指向红色。一旦指定,这些值将被替换为相同的颜色。目前没有为标准线和鼠标悬停定义不同颜色的选项。

也无法将分组标签添加到文本组。

展望

如果有人能够解决这些问题,或者如果edgebundleR收到包含新功能的更新,欢迎您扩展此答案。


推荐阅读