r - 基于矩阵输入格式化和弦图
问题描述
现在的情况
在我之前的问题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
我想这不是该软件包功能的一部分,但它也可以...
- 包括基于组的分组标签
c("a.", "b.")
- 更改文本的字体
- 选择类别时,对指向不同组的线条使用不同的颜色(如本例中的输入和输出)
- 为绘图添加标题,当绘图旋转时保持原位
我的问题
- 当使用矩阵而不是 igraph 对象时,是否可以为每组的线和节点着色,优先使用颜色代码(rgb,十六进制),如果是,如何?
- 尽管没有包含在基本功能中,有没有办法从上面进行高级格式化?(当然,不必在很大程度上重写或扩展包)
谢谢你的建议!
解决方案
与此同时,我想出了一种方法来改变整体情节的颜色(包括文本、线条和节点)。我想在这里分享它,以便为有类似抱负的人节省几个小时的研究时间。
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
收到包含新功能的更新,欢迎您扩展此答案。
推荐阅读
- pandas - 在 pivot_table 之后对 MultiIndex 列进行排序
- forms - 禁用按钮仍会触发 Click 事件
- c# - .NET 核心 3.1 中的 HttpResponseMessage.Content 出现意外的空行为
- backup - Sanity.io 备份和恢复(或自动保存文档 ID)
- python - 第二个 condor_submit_dag 可以由第一个 DAG 中的节点执行吗?
- javascript - JavaScript 和 MySQL 中多字节字符占用的字符数不同
- ios - Using 5 UIlabels to create 5 stars to mimic a rating system
- javascript - How to continue playing videos when i close an HTML tab?
- sql - 'INSERT' stored procedure with validation
- awk - Using awk to export a mysql table to .csv