我的目标是创建前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重复)。 我究竟做错了什么? 提前谢谢....
答案 0 :(得分:4)
顶点是空白的,因为igraph不会自动使用name
属性作为顶点标签。如果要将名称用作标签,则有两个选项:
将name
顶点属性复制到label
属性:g.vs["label"] = g.vs["name"]
明确告诉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))
或者,您也可以在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是标准差)距离分布) - 但不能保证在所有情况下都能正常工作。