在R中绘制网络(控制边缘厚度加上非重叠边缘)

时间:2011-09-22 20:54:01

标签: r

我需要使用R绘制一个包含5个节点和20个有向边(连接每2个节点的边)的网络,但我需要存在两个特征:

  1. 能够控制每个边缘的厚度。
  2. 边缘不重叠(即边缘形式A到B不会从B到A的边缘绘制)
  3. 我花了好几个小时寻找解决方案,尝试了很多套餐,但总是有问题。

    请有人建议解决方案并提供尽可能完整的示例吗?

    非常感谢提前。

4 个答案:

答案 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

然而,这个包并不是真正用于此目的,你不能改变边缘颜色(但是,正在处理它:))。您只能通过一个小技巧使所有边缘变黑:

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)

igraph

答案 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