【问题标题】:How to read in weighted edgelist with igraph in Python (not in R)?如何在 Python(而不是 R)中使用 igraph 读取加权边缘列表?
【发布时间】:2014-11-15 17:04:39
【问题描述】:

我的目标是创建前 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 重复)。 我究竟做错了什么? 提前谢谢....

【问题讨论】:

    标签: python igraph vertices weighted


    【解决方案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["name"])

    我想这同样适用于权重; 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 是标准差距离分布)——但这并不保证在所有情况下都有效。

    【讨论】:

    • 谢谢塔马斯。首先,我如何将边长更改为也与这些值成比例?我仔细检查了拼写错误,重复节点中没有拼写错误。虽然当我打印出来时,没有重复。该图似乎已将 A01.908 替换为 A01.2060...
    • 抱歉,我将问题改为关注边长而不是边权重......
    • 稍微更新了我的答案。
    • 非常感谢塔马斯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多