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

Pan*_*nsy 16 r

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

  1. 能够控制每个边缘的厚度.
  2. 边缘不重叠(即边缘形式A到B不是从B到A的边缘绘制)

我花了几个小时寻找解决方案,尝试了很多套餐,但总是有问题.

任何人都可以提出解决方案并尽可能提供完整的示例吗?

提前谢谢了.

Sac*_*amp 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)
Run Code Online (Sandbox Code Playgroud)

它包含第一列的原点节点,第二列的目标节点和第三列的权重.您可以使用我的pacake qgraph使用此绘制加权图.默认情况下,如果两个节点之间有多条边,则边是弯曲的:

library("qgraph")
qgraph(Edges,esize=5,gray=TRUE)
Run Code Online (Sandbox Code Playgroud)

qgraph

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

qgraph(Edges,esize=5,gray=TRUE,minimum=0,cut=.Machine$double.xmin)
Run Code Online (Sandbox Code Playgroud)

要获得更多控制,您可以使用igraph包.首先我们制作图表:

library("igraph")
g <- graph.edgelist(as.matrix(Edges[,-3]))
Run Code Online (Sandbox Code Playgroud)

注意转换为矩阵并减去一,因为第一个节点是0.接下来我们定义布局:

l <- layout.fruchterman.reingold(g)
Run Code Online (Sandbox Code Playgroud)

现在我们可以使用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
Run Code Online (Sandbox Code Playgroud)

最后绘制图表:

plot(g,layout=l)
Run Code Online (Sandbox Code Playgroud)

IGRAPH