我需要使用R绘制一个包含5个节点和20个有向边(连接每2个节点的边)的网络,但我需要存在两个特征:
我花了好几个小时寻找解决方案,尝试了很多套餐,但总是有问题。
请有人建议解决方案并提供尽可能完整的示例吗?
非常感谢提前。
答案 0 :(得分:23)
如果线条可以弯曲,那么我知道两种方法。首先,我创建一个边缘列表:
Edges <- data.frame(
from = rep(1:5,each=5),
to = rep(1:5,times=5),
thickness = abs(rnorm(25)))
Edges <- subset(Edges,from!=to)
它包含第一列的原点节点,第二列的目标节点和第三列的权重。您可以使用我的pacake qgraph使用此绘制加权图。默认情况下,如果两个节点之间有多条边,则边是弯曲的:
library("qgraph")
qgraph(Edges,esize=5,gray=TRUE)
然而,这个包并不是真正用于此目的,你不能改变边缘颜色(但是,正在处理它:))。您只能通过一个小技巧使所有边缘变黑:
qgraph(Edges,esize=5,gray=TRUE,minimum=0,cut=.Machine$double.xmin)
要获得更多控制权,您可以使用igraph包。首先我们制作图表:
library("igraph")
g <- graph.edgelist(as.matrix(Edges[,-3]))
注意转换为矩阵并减去一,因为第一个节点为0.接下来我们定义布局:
l <- layout.fruchterman.reingold(g)
现在我们可以使用E()
函数更改一些边参数:
# Define edge widths:
E(g)$width <- Edges$thickness * 5
# Define arrow widths:
E(g)$arrow.width <- Edges$thickness * 5
# Make edges curved:
E(g)$curved <- 0.2
最后绘制图表:
plot(g,layout=l)
答案 1 :(得分:1)
虽然不是专门的R答案,但我建议使用Cytoscape来生成网络。
您可以使用RCytoscape自动化它。 http://bioconductor.org/packages/release/bioc/html/RCytoscape.html
答案 2 :(得分:1)
信息丰富的名为“网络”的软件包可以很好地绘制定向网络,并处理您的问题。
ex.net <- rbind(c(0, 1, 1, 1), c(1, 0, 0, 1), c(0, 0, 0, 1), c(1, 0, 1, 0))
plot(network(ex.net), usecurve = T, edge.curve = 0.00001,
edge.lwd = c(4, rep(1, 7)))
edge.curve参数,如果设置得非常低并与usecurve = T结合,则会分隔边,尽管可能有更直接的方法,而edge.lwd可以将矢量作为不同大小的参数
我承认,这并不总是最漂亮的结果。但是,可以通过多种不同的方式获得体面的网络图很容易(参见?network.plot)。
答案 3 :(得分:1)
边缘上的“非重叠”约束是这里的一个大问题。首先,你的网络必须是“平面的”,否则在二维中是不可能的(你不能将三个房子连接到没有交叉的天然气,电力,电话公司建筑物。)
我认为平面图布局的算法基本上解决了4色问题。玩得开心。存在启发式,搜索平面图布局和强制定向,并阅读Planar Graph Layouts