igraph:在绘制相同图形的增量子图时,如何修复节点位置

时间:2015-10-26 20:17:41

标签: python igraph graph-drawing

我有一个图表,我之前通过在Gephi中运行ForceAtlas2预先计算了节点的位置,然后我尝试在python中使用ìgraph进行绘制。每个节点都有一个date属性,所以我迭代所有年份,计算相应的子图并绘制它们以创建动画效果。

然而,随着节点不断添加到图表中,以前的节点不必保留旧位置,与所描述的内容类似in this post

我的代码如下:

colors = [color_list[int(g.vs[v]["Modularity Class"])] for v in range(0, len(g.vs))]
label_sizes = [sz / 4.0 for sz in g.vs["size"]]

nodes_in_years = defaultdict(list) # keeps a list of nodes per year
for v in g.vs:
    year = int(v["date"][:4]) # convert the first 4 digits of the date to year
    nodes_in_years[year].append(v)

nodes_incremental = []
for y, nodes in nodes_in_years.items():
    nodes_incremental += nodes
    h = g.subgraph(nodes_incremental)

    plot(h, "graph-igraph%d.png"%y,
         bbox=(640,480),
         vertex_color=colors,
         vertex_label_size=label_sizes,
         keep_aspect_ratio=False,
          )

以下是两个连续快照。 graph 2001 graph 2002

在第二个快照中,节点被轻微压缩"随着更多节点被添加到左侧。

如何将节点保持在固定位置?我尝试使用xlim设置和ylim,但我可能没有设置正确的值

1 个答案:

答案 0 :(得分:3)

ylimshape用于igraph的R接口;它们对Python没有影响。通常使用的技巧是在所有快照中找到最小和最大X和Y坐标,然后在左上角和右下角放置两个伪顶点(其None属性设置为shape)布局的角落。确保在具有相同坐标的所有快照中包含这些假顶点 - 这将确保布局在每个快照中的缩放方式完全相同,以适合您指定的边界框。

如果您没有在当前布局中使用shape属性,请注意向假顶点添加shape属性也会添加None属性(默认值为shape)到“真实”顶点,因此您应手动将除两个假顶点之外的所有顶点的"circle"属性设置为{{1}}。