为两个单独的图强制执行相同的节点位置/布局

问题描述

我们知道种子用于生成相同的图形,也用于保留其节点和边的可绘制坐标。可以通过 node_positions = nx.spring_layout(G = graph,seed = 5) 保留节点/边缘。但是,在生成第二个图时,必须使用不同的图种子来生成不仅仅是重复的内容在这个问题的情况下,节点将与第一种情况完全相同,并且可以通过 nx.set_node_attributes(graph,dict_of_dicts) 进行设置。单独的边是不同的,以代表节点在其“个性”的两个方面的行为。

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

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

EDIT:Post-Answer,这是原始的,然后是所需的输出。节点在相同的位置,但利用不同的边:

预先回答

回复

感谢阅读。

解决方法

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

因此,以下绘制了两个具有相同弹簧布局的不同随机图 - 源自第一个:

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,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()

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