gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:46:51 25 4
gpt4 key购买 nike

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

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,(median + 2 sd) 距离转换为 0.1,(median - 2 sd) 距离转换为 0.9(其中 sd 是标准差距离分布)——但这并不能保证在所有情况下都有效。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com