如何利用NetworkX根据节点Type属性设置节点形状与颜色?
解决NetworkX节点按Type属性自定义形状和颜色的问题
嗨,这事儿好办!我们只需要给NetworkX的绘图函数传递自定义的样式参数就行,不过要注意一个小细节:nx.draw()不支持直接给不同节点设置不同形状,得按形状分组绘制。下面是完整的可运行示例,完美匹配你的需求:
import networkx as nx import matplotlib.pyplot as plt # 初始化图(模拟你的场景) G = nx.Graph() # 添加节点 G.add_nodes_from(['ART1', 'ZG1', 'MG1']) # 设置节点属性 G.nodes['ART1']['Type'] = 'MASTER' G.nodes['ZG1']['Type'] = 'DOC' # MG1 保持无Type属性 # 先定义好每种Type对应的样式:颜色+形状 style_map = { 'MASTER': {'color': '#1f77b4', 'shape': 'o'}, # 蓝色圆形 'DOC': {'color': '#2ca02c', 'shape': '^'}, # 绿色三角形 'DEFAULT': {'color': '#7f7f7f', 'shape': 'D'} # 灰色菱形(无属性节点) } # 生成节点布局(先算好布局,保证所有节点位置统一) pos = nx.spring_layout(G) # 先绘制节点标签,避免被节点挡住 nx.draw_networkx_labels(G, pos, font_size=12) # 按形状分组绘制节点 for shape in ['o', '^', 'D']: # 找到对应形状的节点列表 target_nodes = [ node for node, attrs in G.nodes(data=True) if style_map[attrs.get('Type', 'DEFAULT')]['shape'] == shape ] # 获取对应的颜色 target_color = style_map[next(k for k, v in style_map.items() if v['shape'] == shape)]['color'] # 绘制这组节点 nx.draw_networkx_nodes( G, pos, nodelist=target_nodes, node_color=target_color, node_shape=shape, node_size=800 # 可以根据需要调整节点大小 ) plt.axis('off') # 关闭坐标轴,让图更美观 plt.show()
核心要点解释:
- 样式统一管理:用
style_map字典把Type和对应的颜色、形状绑定在一起,后续要改样式直接改字典就行,非常方便 - 分批次绘制节点:因为NetworkX的基础绘图函数不支持多形状,所以我们按形状分组,用
nx.draw_networkx_nodes()分别绘制每组节点,这样就能实现不同节点用不同形状了 - 无属性节点处理:用
attrs.get('Type', 'DEFAULT')来兜底,没有Type属性的节点自动使用DEFAULT样式
运行这段代码后,你就能看到:
MASTER类型节点是蓝色圆形DOC类型节点是绿色三角形- 无Type属性的节点是灰色菱形
完全符合你的需求~
内容的提问来源于stack exchange,提问作者jan-seins
相关产品推荐
相关产品推荐

