我的目标是创建前两列中的节点图,其边长与第三列中的值成比例。我的输入数据如下所示:
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
属性作为顶点标签。如果您想使用名称作为标签,您有两种选择:
将
name
顶点属性复制到label
属性:g.vs["label"] = g.vs["name"]
明确告诉
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/