python - 如何在Python(而不是R)中使用igraph读取加权边缘列表?

标签 python igraph vertices weighted

我的目标是创建前两列中的节点图,其边长与第三列中的值成比例。我的输入数据如下所示:

E06.1644.1  A01.908.1   0.5
E06.1643.1  A01.908.1   0.02 
E06.1644.1  A01.2060.1  0.7

我目前正在像这样导入它:

g=Graph.Read_Ncol("igraph.test.txt",names=True,directed=False,weights=True)
igraph.plot(g, "igraph.pdf", layout="kamada_kawai")

当我打印名称或重量(我希望它们是边长)时,它们打印得很好:

print(g.vs["name"])
print(g.es["weight"])

但是,顶点是空白的,并且长度似乎与它们的值不成比例。另外,节点太多(A01.908.1 重复)。 我究竟做错了什么? 提前致谢....

最佳答案

顶点为空,因为 igraph 不会自动使用 name 属性作为顶点标签。如果您想使用名称作为标签,您有两种选择:

  1. name 顶点属性复制到 label 属性:g.vs["label"] = g.vs["name"]

  2. 明确告诉 plot 您希望它使用名称作为标签:plot(g, "igraph.pdf", layout="kamada_kawai", vertex_label=g. vs["名称"])

我想这同样适用于权重; igraph 不会自动使用权重来确定每条边的厚度。如果您想执行此操作,请将权重向量重新缩放到有意义的无厚度范围(例如,从 0.5 到 3),然后将重新缩放的向量设置为 width 边缘属性:

>>> g.es["width"] = rescale(g.es["weight"], out_range=(0.5, 3))

或者,您也可以在 plot() 调用中使用 edge_width 关键字参数:

plot(g, ..., edge_width=rescale(g.es["weight"], out_range=(0.5, 3)))

有关可传递给 plot() 的关键字参数的更多详细信息,请参阅 help(Graph.__plot__)

对于重复的节点,我强烈怀疑您的输入文件中存在拼写错误,并且两个名称不相等;例如,末尾可以有一个空格。仔细检查 g.vs["name"] 看看情况是否如此。

更新:如果您希望边缘的长度与规定的权重成比例,恐怕在一般情况下无法完全做到这一点 -很容易得出一个在二维空间中无法达到规定长度的图表。有一种称为多维缩放 (MDS) 的技术,它可以根据距离矩阵重建节点的位置 - 但这需要为每对节点指定距离(即也为断开连接的节点对) .

您使用的 Kamada-Kawai 布局算法能够在某种程度上考虑边缘权重(它可能会陷入局部最小值,因此您可能不会得到准确的结果),但它解释了权重为相似度,而不是距离,因此权重越大,端点越近。但是,您仍然需要告诉 igraph 在计算布局时使用权重,如下所示:

>>> similarities = [some_transformation(weight) for weight in g.es["weight"]]
>>> layout = g.layout_kamada_kawai(weights=similarities)
>>> plot(g, layout=layout, ...)

其中some_transformation()是从距离到相似度的“合理”转换。这需要一些尝试和错误;我通常使用基于 sigmoid 函数的转换,将中值距离转换为相似度 0.5,将 (中值 + 2 sd) 距离转换为 0.1,将 (中值 - 2 sd) 距离转换为 0.9(其中 sd 是距离分布) - 但这并不能保证在所有情况下都有效。

关于python - 如何在Python(而不是R)中使用igraph读取加权边缘列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26948347/

相关文章:

python - Twisted:如何在初始连接时识别协议(protocol),然后委托(delegate)给适当的协议(protocol)实现?

R 通过组合两个变量的共同值来 reshape 数据

database - 当我知道父顶点和子顶点时,如何删除边?

c++ - DX11 中的顶点缠绕顺序

python - 美汤-查找 child 标签属性内容

python - While 循环问题

python - ValueError : Shape of passed values is (3, 27),索引暗示 (4, 27) # pandas DataFrame

r - igraph中的社区检测算法有什么区别?

r - 途径 : Manipulate list of events in parent-child 'nodes' in R

ios - OpenGLES 使用 glDrawArrays 对顶点进行排序以绘制正确的形状