如何在单个绘图中绘制两个不重叠的NetworkX网络图?
解决Matplotlib中两个网络图重叠的问题
我尝试在同一个绘图中绘制2个网络图,使用了以下代码:
plt.figure(figsize=(20, 20)) df = pd.DataFrame({ 'from':['A','A','A','A'], 'to':['D', 'A', 'E','C']}) G=nx.from_pandas_dataframe(df, 'from', 'to') nx.draw(G, with_labels=True) df1 = pd.DataFrame({ 'from':['S','S','S','S'], 'to':['L', 'K', 'M','N']}) G=nx.from_pandas_dataframe(df1, 'from', 'to') nx.draw(G, with_labels=True) plt.show()目前的问题是两个图发生重叠,仅能看到一个图,请问该如何解决?
这个问题很常见——你现在是把两个网络图都绘制在了同一个Matplotlib坐标轴上,它们的节点位置默认在画布中心区域生成,自然会重叠。给你两个实用的解决办法:
方法1:用子图分开绘制(推荐)
这是最清晰也最规范的方式,把画布分成多个独立的子区域,每个子图放一个网络图。修改后的代码如下:
import matplotlib.pyplot as plt import pandas as pd import networkx as nx # 创建1行2列的子图布局,设置合适的画布大小 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 10)) # 绘制第一个网络图到ax1子图 df = pd.DataFrame({ 'from':['A','A','A','A'], 'to':['D', 'A', 'E','C']}) G1 = nx.from_pandas_dataframe(df, 'from', 'to') nx.draw(G1, with_labels=True, ax=ax1) ax1.set_title('第一个网络图') # 给子图加标题,方便区分 # 绘制第二个网络图到ax2子图 df1 = pd.DataFrame({ 'from':['S','S','S','S'], 'to':['L', 'K', 'M','N']}) G2 = nx.from_pandas_dataframe(df1, 'from', 'to') nx.draw(G2, with_labels=True, ax=ax2) ax2.set_title('第二个网络图') plt.tight_layout() # 自动调整子图间距,避免标题和图形互相遮挡 plt.show()
核心要点:
plt.subplots(1, 2)创建了1行2列的子图布局,ax1和ax2是两个独立的坐标轴对象- 在
nx.draw()中通过ax参数指定要绘制到哪个子图上 plt.tight_layout()能自动优化子图之间的间距,让布局更美观
方法2:手动调整节点位置,放在同一画布的不同区域
如果你确实想把两个图放在同一个坐标轴里,那可以手动修改节点的位置坐标,让它们在画布上分开。比如把第一个图移到左侧,第二个移到右侧:
import matplotlib.pyplot as plt import pandas as pd import networkx as nx plt.figure(figsize=(20, 20)) # 处理第一个网络图:把所有节点左移 df = pd.DataFrame({ 'from':['A','A','A','A'], 'to':['D', 'A', 'E','C']}) G1 = nx.from_pandas_dataframe(df, 'from', 'to') # 生成默认的节点布局 pos1 = nx.spring_layout(G1) # 遍历所有节点,把x坐标减去2(左移) for node in pos1: pos1[node] = (pos1[node][0] - 2, pos1[node][1]) nx.draw(G1, pos=pos1, with_labels=True) # 处理第二个网络图:把所有节点右移 df1 = pd.DataFrame({ 'from':['S','S','S','S'], 'to':['L', 'K', 'M','N']}) G2 = nx.from_pandas_dataframe(df1, 'from', 'to') pos2 = nx.spring_layout(G2) # 遍历所有节点,把x坐标加上2(右移) for node in pos2: pos2[node] = (pos2[node][0] + 2, pos2[node][1]) nx.draw(G2, pos=pos2, with_labels=True) plt.show()
核心要点:
nx.spring_layout()会生成默认的节点位置(基于弹簧模型)- 通过修改每个节点的x坐标(加减偏移量),让两个图在水平方向上分开
- 你可以根据画布大小调整偏移量的数值,确保两个图完全不重叠
内容的提问来源于stack exchange,提问作者user517696
相关产品推荐
相关产品推荐

