求助:NetworkX中无法绘制(i,i)形式的自环边
解决NetworkX MultiGraph自环边不显示的问题
嘿,别担心!你添加自环边的操作本身完全没问题,NetworkX默认的绘图工具只是对自环的支持不够直观,不是你代码写错啦😉
先确认自环边已经成功添加
首先可以先验证一下你的自环边是不是真的在图里——毕竟新手容易怀疑自己的操作,咱们先打消这个顾虑:
import networkx as nx # 创建你的多图对象 G = nx.MultiGraph() G.add_edge(2, 2) # 添加自环边 # 打印图里的所有边 print("当前图中的边:", list(G.edges()))
运行这段代码后,你应该能看到输出 [(2, 2)],这说明自环边已经被正确添加到图里了,只是绘图的时候没显示出来而已。
让自环边显示出来的两种方法
NetworkX的默认nx.draw()函数对自环的渲染比较保守,咱们可以通过调整参数或者手动绘制自环来解决:
方法1:用nx.draw_networkx()并设置connectionstyle
nx.draw_networkx()比基础的nx.draw()有更多自定义选项,其中connectionstyle参数可以控制边的弯曲方式,刚好能让自环显示出来:
import matplotlib.pyplot as plt # 绘制图形,指定自环的弧度 nx.draw_networkx(G, with_labels=True, # 显示节点标签 node_size=1500, # 调大节点尺寸,避免自环和节点重叠 font_size=12, # 调整标签字体大小 connectionstyle='arc3, rad=0.1') # rad控制自环的弯曲程度,数值越大弧度越明显 plt.show()
方法2:手动单独绘制自环边
如果习惯用nx.draw(),可以先绘制普通节点和边,再单独把自环边画上去:
import matplotlib.pyplot as plt # 先设置节点布局(spring_layout是常用的力导向布局) pos = nx.spring_layout(G) # 绘制节点和普通边 nx.draw(G, pos, with_labels=True, node_size=1500) # 单独绘制自环边,指定弧度 nx.draw_networkx_edges(G, pos, edgelist=[(2, 2)], connectionstyle='arc3, rad=0.2') plt.show()
额外小技巧:MultiGraph的多条自环
如果你在同一个节点上添加多条自环(比如多次调用G.add_edge(2,2)),可以给每条自环设置不同的rad值,让它们分开显示不重叠:
# 添加三条自环边 G.add_edge(2, 2) G.add_edge(2, 2) G.add_edge(2, 2) pos = nx.spring_layout(G) nx.draw_networkx(G, pos, with_labels=True, node_size=2000) # 给每条自环设置不同的弧度(正负值可以让自环在节点两侧) nx.draw_networkx_edges(G, pos, edgelist=[(2,2,0)], connectionstyle='arc3, rad=0.3') nx.draw_networkx_edges(G, pos, edgelist=[(2,2,1)], connectionstyle='arc3, rad=-0.3') nx.draw_networkx_edges(G, pos, edgelist=[(2,2,2)], connectionstyle='arc3, rad=0.1') plt.show()
总的来说,你完全没做错操作,只是NetworkX的默认绘图逻辑没把自环展示出来,调整一下参数就能看到啦!
内容的提问来源于stack exchange,提问作者Héctor Alonso
相关产品推荐
相关产品推荐

