顶点是空白的,因为 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))
或者,您也可以在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 是标准差距离分布)——但这并不保证在所有情况下都有效。