如何使用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
相关产品推荐
相关产品推荐

