如何使用Networkx和Matplotlib基于归一化随机浮点属性设置节点颜色?
给NetworkX节点根据'hc'属性分配Jet颜色映射的解决方案
要实现0对应红色、1对应深紫色的Jet颜色映射,只需借助Matplotlib的颜色映射工具,将节点的'hc'属性值直接转换为对应颜色,再传递给NetworkX的绘图函数即可。以下是修改后的完整代码,核心逻辑同样适用于你的树形图:
import networkx as nx import matplotlib.pyplot as plt import matplotlib.cm as cm from scipy.stats import truncnorm from networkx.drawing.nx_agraph import graphviz_layout # 构建随机网络(替换为你的树形图即可) G = nx.erdos_renyi_graph(20, 0.1) # 生成0-1范围内的'hc'属性 lower, upper = 0, 1 mean_hc = 0.5 devi_hc = 0.1 gaussian_hc = truncnorm((lower - mean_hc) / devi_hc, (upper - mean_hc) / devi_hc, loc=mean_hc, scale=devi_hc) for i in G: G.nodes[i]['hc'] = round(gaussian_hc.rvs(), 3) # 保留三位小数提升性能 # 提取节点的'hc'值(保证顺序与节点列表一致) node_hc = [G.nodes[node]['hc'] for node in G.nodes()] # 获取Jet颜色映射,并将'hc'值转换为对应颜色 cmap = cm.get_cmap('jet') node_colors = cmap(node_hc) # 绘图 pos = graphviz_layout(G, prog="dot") plt.figure(figsize=(30, 30)) # 绘制带颜色的节点,可自定义节点大小、边颜色等 nx.draw(G, pos, node_color=node_colors, node_size=1500, edge_color='#888888', with_labels=True, font_size=12) # 添加颜色条,直观展示'hc'值与颜色的对应关系 sm = cm.ScalarMappable(cmap=cmap, norm=plt.Normalize(vmin=0, vmax=1)) sm.set_array([]) plt.colorbar(sm, shrink=0.6, label='hc Value') plt.show()
关键步骤说明:
- 颜色映射转换:使用
cm.get_cmap('jet')获取Jet色卡,直接传入0-1范围内的'hc'值即可得到RGBA格式的颜色值列表,完美匹配你的需求(0→红,1→深紫)。 - 节点顺序一致性:通过列表推导式按节点顺序提取'hc'值,确保颜色与节点一一对应,避免错位。
- 颜色条添加:通过
ScalarMappable创建颜色条,方便查看'hc'值和颜色的对应关系,提升可视化效果。
内容的提问来源于stack exchange,提问作者John Gama
相关产品推荐
相关产品推荐

