对两个单独的图执行相同的节点 position/layouts

Enforce same node position/layouts for two separate graphs

我们知道种子用于生成相同的图形,也用于保存其节点和边的可绘制坐标。 Node/edge 可以通过 node_positions = nx.spring_layout(G = graph, seed = 5) 进行保存。但是,在生成第二个图时,必须使用不同的图种子来生成不仅仅是重复的东西。在这个问题的情况下,节点将与第一种情况完全相同,并且可以通过 nx.set_node_attributes(graph, dict_of_dicts) 进行设置。仅边缘是不同的,以表示节点在其 'personalities'.

两个方面的行为

我认为最好使用不同的种子生成第二个图,然后使用与以前相同的存储 spring_layout 来绘制新边(尽管会导致绘图有点混乱)但在与以前相同的节点位置之上。不幸的是,我很天真,后来意识到这是不可能的,因为每个图表的 spring_layout 根本不同。

我想知道用两组边绘制同一组节点坐标的最佳方法是什么?我不是想使用 nx.compose(graph1, graph2) 来组合图形,但实际上我希望处理一个图形,绘制它,处理第二个图形,绘制它,并由于静态位置而实现一系列无缝输出图尽管边缘不断变化,但节点的数量。

编辑:Post-答案,这是原始的,后面是所需的输出。相同位置的节点,但使用不同的边:

预答题

Post-回答

感谢阅读。

我不确定你到底在哪里挣扎。 networkx 中布局的 return 值是字典,其中节点作为键,位置作为值。 因此,如果两个图的节点集相同(或者至少要绘制的图的所有节点都在layout dict中),则可以绘制图。

所以下面绘制了两个具有相同 spring 布局的不同随机图 - 来自第一个:

import networkx as nx
import matplotlib.pylab as pl

g_1 = nx.fast_gnp_random_graph(n=10, p=.1, seed=42)
g_2 = nx.fast_gnp_random_graph(n=10, p=.1, seed=21)

pos = nx.spring_layout(G=g_1, seed=42)
# pos = nx.circular_layout(g_1)

nx.draw(g_1, pos)
pl.show()

nx.draw(g_2, pos)
pl.show()

我不确定你的图表有多少个节点,但你可能想检查一个更简单的“边缘独立”布局,例如圆形布局。