You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单个绘图中绘制两个不重叠的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:25:30