首页 > 解决方案 > 使用 igraph 绘制不对称关系

问题描述

HAVE是主角(第 1 列中的 ids)和支持者(列名中的 ids )的双模邻接矩阵。

    f1  f2  f3  f4  f5  f6  f7
f1  0   1   0   2   5   0   6
f2  0   0   3   0   0   6   0
f3  9   4   0   1   0   0   0

矩阵中的数字是电影计数。矩阵是不对称的。例如,f2 在 f3 担任3次配角的电影中担任主角,但 f3 在 f2 支持4次的电影中担任主角。

我需要生成一个有向图,其中箭头从演员到支持者 - 箭头/弧的大小需要与films. 请参阅下面的 f2-f3 dyad 模型:在此处输入图像描述

图的两种“模式”中相同的命名约定显然会导致问题。如果您有任何明确的解决方案,或者我没有很好地提出我的问题,请告诉我(我是 igraph 和双模投影的新手)。谢谢!

标签: rigraphdata-manipulationadjacency-matrixsna

解决方案


如果您查看帮助页面help(igraph.plotting),您会发现它说:

箭头大小

箭头的大小。目前这是一个常数,因此对于每个边缘都是相同的。

所以我认为通过箭头的大小是不可能做到这一点的。但是,当然可以使用参数来改变箭头的线宽edge.width

由于您没有提供任何数据,因此我提供了一个小示例,我认为您应该能够与您的问题相匹配。

样本数据

CoStar = matrix(c(0,1,3,1, 3,0,3,1, 2,1,0,0, 0,1,1,0), nrow=4)
CoStar
     [,1] [,2] [,3] [,4]
[1,]    0    3    2    0
[2,]    1    0    1    1
[3,]    3    3    0    1
[4,]    1    1    0    0

现在我们可以把它变成一个图形对象,并使用权重作为边缘宽度来显示它。您需要使用该edge.curved参数以使边缘 A->B 不在边缘 B->A 的顶部。

library(igraph)
G = graph_from_adjacency_matrix(CoStar, weighted=TRUE)
V(G)$label = c("Steve", "Sean", "Andy", "Tim")
plot(G, edge.width=E(G)$weight+1, edge.arrow.size=1.5, edge.curved=0.25)

非对称图

您可以看到边缘大小与权重(关节出现次数)成正比。


推荐阅读