Networkx放大节点后箭头被覆盖的解决方法咨询
解决Networkx节点放大后边箭头被覆盖的问题
当你分开调用draw_networkx_nodes和draw_networkx_edges自定义样式时,边的绘制函数默认不知道你设置的节点大小,导致箭头和边端点被大节点覆盖。解决方法很直接:
- 给
draw_networkx_edges传入和draw_networkx_nodes一致的node_size参数,让边的绘制逻辑适配节点尺寸,自动调整箭头和边的终点位置。 - 若需要更显眼的箭头,可额外调整箭头样式和大小。
修改后的示例代码
import networkx as nx from networkx.drawing.nx_agraph import graphviz_layout import matplotlib.pyplot as plt G = nx.DiGraph() G.add_nodes_from([1, 2, 3]) G.add_edges_from([(1, 2), (2, 3)]) pos = graphviz_layout(G, prog='dot') # 自定义节点样式:不同大小和颜色 node_sizes = [1000, 1500, 800] node_colors = ['#ff9999', '#99ff99', '#9999ff'] nx.draw_networkx_nodes(G, pos, node_size=node_sizes, node_color=node_colors, alpha=0.7) # 传入node_size,让边适配节点尺寸;同时自定义边样式 nx.draw_networkx_edges( G, pos, width=2.0, node_size=node_sizes, # 关键:和节点的size一致 arrowstyle='->', # 箭头样式 arrowsize=20, # 箭头大小 edge_color=['#333333', '#666666'] # 不同边颜色 ) # 可选:添加节点标签 nx.draw_networkx_labels(G, pos, font_size=12) plt.axis('off') plt.show()
原理说明
draw_networkx_edges的node_size参数用于计算边的终点应该停在节点边缘的位置,而不是节点中心。当你分开绘制节点和边时,必须手动传入这个参数,否则它会使用默认的node_size=300来计算,导致边的终点跑到大节点内部,箭头被覆盖。
如果你的节点大小是逐个自定义的(比如列表形式),直接把同一个列表传给draw_networkx_edges的node_size即可,函数会自动对应每个节点的尺寸调整边的位置。
内容的提问来源于stack exchange,提问作者graphitump
相关产品推荐
相关产品推荐

