You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:25:22