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

时间:2014-11-15 17:04:39

标签: python igraph vertices weighted

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

1 个答案:

答案 0 :(得分:4)

顶点是空白的,因为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"])

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

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

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

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

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

    对于重复的节点,我强烈怀疑你的输入文件中有一个拼写错误,这两个名字不相同;例如,最后可以有一个空间。仔细检查g.vs["name"],看看是否是这种情况。

    更新:如果您希望边缘的长度与规定的权重成比例,我担心在一般情况下无法做到这一点 - 很容易想出一个图表,其中在2D空间中无法实现规定的长度。有一种称为多维缩放(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是标准差)距离分布) - 但不能保证在所有情况下都能正常工作。