NetworkX中MultiDiGraph绘图无法显示全部边的问题求助
NetworkX MultiDiGraph多条边不显示问题解决
问题原因
你看到的G.edges里的整数是MultiDiGraph给平行边分配的唯一key,这是正常机制,你的交互类型属性w并没有丢失,可通过G.edges(data=True)或G.edges[u, v, key]['w']查看。
绘图时多条边看似消失,是因为默认draw_networkx_edges会把平行边画在同一条直线上,视觉重叠导致无法区分。
解决方案
通过给平行边设置弯曲偏移,让它们分开显示,同时添加边标签展示交互类型。完整代码如下:
import networkx as nx import matplotlib.pyplot as plt # 初始化边数据 edges = [ ('type_1', 'type_2', {'w': 'interaction_type_1'}), ('type_1', 'type_2', {'w': 'interaction_type_2'}), ('type_1', 'type_2', {'w': 'interaction_type_3'}), ('type_2', 'type_3', {'w': 'interaction_type_1'}), ('type_2', 'type_3', {'w': 'interaction_type_3'}) ] # 创建MultiDiGraph并添加边 G = nx.MultiDiGraph() G.add_edges_from(edges) # 设置节点布局 pos = nx.random_layout(G) # 绘制节点与节点标签 nx.draw_networkx_nodes(G, pos, node_size=1500, node_color='lightblue') nx.draw_networkx_labels(G, pos, font_size=12, font_weight='bold') # 定义平行边的弯曲偏移量,正负值控制弯曲方向 edge_rads = [0.1, -0.1, 0.2] # 循环绘制每条边及对应标签 edge_idx = 0 for u, v, key in G.edges(): # 获取当前边的交互类型 interaction = G.edges[u, v, key]['w'] # 绘制单条带偏移的边 nx.draw_networkx_edges( G, pos, edgelist=[(u, v, key)], connectionstyle=f"arc3,rad={edge_rads[edge_idx % len(edge_rads)]}", arrowstyle='->', arrowsize=20, edge_color='gray' ) # 绘制边的交互类型标签 nx.draw_networkx_edge_labels( G, pos, edge_labels={(u, v, key): interaction}, font_size=10, label_pos=0.3 ) edge_idx += 1 plt.axis('off') plt.show()
关键细节说明
connectionstyle="arc3,rad=xxx":通过调整rad值控制边的弯曲程度,正负值让平行边向不同方向弯曲,避免重叠- 循环绘制单条边:确保每条平行边都能应用独立的偏移设置
- 边标签:通过
draw_networkx_edge_labels直接关联边的w属性,清晰展示交互类型
内容的提问来源于stack exchange,提问作者Shuman_tov
相关产品推荐
相关产品推荐

