Matplotlib与Networkx绘制多自环图仅显示单个自环如何解决
NetworkX多自环可视化异常解决方案
NetworkX基于matplotlib的默认绘图接口不支持多自环渲染:同一节点的多个自环会使用相同的半径、偏移角度参数绘制,完全重叠后视觉上仅显示1个,和实际边数不一致。
方案1:使用pyvis库实现(推荐,交互性好,原生支持多重图)
pyvis是专门用于图可视化的库,原生支持MultiGraph/MultiDiGraph的多自环、多边渲染,不需要额外调整参数即可正常展示全部自环:
from pyvis.network import Network import networkx as nx g = nx.MultiDiGraph() g.add_edge(0, 0) g.add_edge(0, 1) g.add_edge(1, 2) g.add_edge(2, 2) g.add_edge(2, 2) # 初始化pyvis画布 net = Network(directed=True, notebook=False, height="600px", width="800px") # 加载networkx格式的图 net.from_nx(g) # 生成可视化HTML文件,打开即可看到带多个错开自环的交互图 net.write_html("multi_selfloop_graph.html")
方案2:基于matplotlib手动绘制多自环
如果需要保留matplotlib的静态输出形式,可以手动遍历自环,为每个自环设置不同的半径参数避免重叠:
import networkx as nx import matplotlib.pyplot as plt from matplotlib.patches import Arc g = nx.MultiDiGraph() g.add_edge(0, 0) g.add_edge(0, 1) g.add_edge(1, 2) g.add_edge(2, 2) g.add_edge(2, 2) # 计算节点布局 pos = nx.spring_layout(g, seed=42) fig, ax = plt.subplots(figsize=(6,4)) # 绘制非自环边 non_selfloop_edges = [e for e in g.edges if e[0] != e[1]] nx.draw_networkx_edges(g, pos, edgelist=non_selfloop_edges, ax=ax, width=2) # 绘制节点和标签 nx.draw_networkx_nodes(g, pos, ax=ax, node_color='white', edgecolors='black', node_size=500) nx.draw_networkx_labels(g, pos, ax=ax, font_weight='bold') # 手动批量绘制自环,每个自环依次增大半径避免重叠 selfloop_radius_step = 0.1 for node in g.nodes(): selfloop_count = g.number_of_edges(node, node) for i in range(selfloop_count): radius = 0.1 + i * selfloop_radius_step x, y = pos[node] # 绘制圆弧自环 arc = Arc((x, y), radius*2, radius*2, angle=0, theta1=0, theta2=270, edgecolor='black', linewidth=2, linestyle='-') ax.add_patch(arc) # 添加箭头标记 ax.annotate('', xy=(x + radius*0.95, y - radius*0.1), xytext=(x + radius*0.9, y - radius*0.2), arrowprops=dict(arrowstyle="->", color='black', linewidth=2)) plt.axis('off') plt.show()
内容的提问来源于stack exchange,提问作者Arijit Panda
相关产品推荐
相关产品推荐

