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

如何使用networkx和matplotlib绘制互不交叉的多个独立完全图

问题原因

  • 你定义pos变量时重复赋值,后续的坐标直接覆盖了之前所有图的节点坐标,最后仅保留了单节点图Y的随机坐标
  • 节点类型不匹配:你为G、F手动定义坐标时,pos的键用的是整数(如1、2),但添加节点时传入的是字符串格式(如"1"、"2"),二者无法对应,networkx找不到指定坐标就会默认生成布局,导致所有节点堆叠
  • 调用nx.draw()时没有传入对应图的pos参数,绘图时会自动重新计算布局,之前手动设置的坐标完全没有生效

修改后可运行代码

import networkx as nx
import matplotlib.pyplot as plt

# 定义第一个完全图G及坐标
G = nx.Graph()
G.add_edges_from([("1","2"),("2","3"),("3","4"),("1","3"),("1","4"),("2","4")])
pos_G = {"1": (0, 0), "2": (1, 1), "3": (0, 1) , "4": (1, 0)} # 键改为字符串和节点匹配

# 定义第二个完全图F及坐标
F = nx.Graph()
F.add_edges_from([("5","6"),("6","7"),("7","8"),("5","7"),("5","8"),("6","8")])
pos_F = {"5": (3, 0), "6": (4, 1), "7": (3, 1) , "8": (4, 0)} # 和G保持足够距离避免重叠

# 定义第三个完全图E及坐标
E = nx.Graph()
E.add_edges_from([("9","10"),("10","11"),("9","11")])
pos_E = {"9": (0, 3), "10": (1, 4), "11": (0, 4)} # 放在左上区域

# 定义单节点图Y及坐标
Y = nx.Graph()
Y.add_node("12")
pos_Y = {"12": (3.5, 3.5)} # 放在右上区域

# 绘图时分别传入每个图对应的pos参数
nx.draw(G, pos=pos_G, with_labels=True, node_color='white', edgecolors='black')
nx.draw(F, pos=pos_F, with_labels=True, node_color='white', edgecolors='black')
nx.draw(E, pos=pos_E, with_labels=True, node_color='white', edgecolors='black')
nx.draw(Y, pos=pos_Y, with_labels=True, node_color='white', edgecolors='black')

plt.savefig('labels.png')
plt.show()

运行后四个完全图会分布在画布不同区域,不会出现交叉重叠的情况。

内容的提问来源于stack exchange,提问作者DSS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 11:06:00