如何在NetworkX中为含inf值的边设置自定义颜色?
解决NetworkX中含inf参数边的颜色自定义问题
当然可行!你只需要把带inf参数的边和正常参数的边分开处理,分别设置颜色后再叠加绘制就行。我给你调整下你的代码片段,直接就能用:
import networkx as nx import matplotlib.pyplot as plt import numpy as np def plot_graph_colored_edges(G, node_positions, parameter): # 1. 拆分边为两组:含inf的边和正常参数的边 inf_edges = [] valid_edges = [] valid_params = [] # 假设parameter是一个以边元组(u,v)为键的字典,若为列表则调整取值逻辑 for u, v in G.edges(): param_val = parameter[(u, v)] if np.isinf(param_val): inf_edges.append((u, v)) else: valid_edges.append((u, v)) valid_params.append(param_val) # 2. 先绘制节点,避免被边覆盖 nx.draw_networkx_nodes(G, node_positions, node_color='lightblue', node_size=500) nx.draw_networkx_labels(G, node_positions) # 3. 绘制正常参数的边,用颜色条映射颜色 if valid_edges: edge_cmap = plt.cm.viridis # 可替换成你需要的颜色条 nx.draw_networkx_edges(G, node_positions, edgelist=valid_edges, edge_color=valid_params, edge_cmap=edge_cmap, width=2) # 可选:添加对应正常参数的颜色条 sm = plt.cm.ScalarMappable(cmap=edge_cmap, norm=plt.Normalize(vmin=min(valid_params), vmax=max(valid_params))) sm.set_array([]) plt.colorbar(sm, label='Parameter Value') # 4. 单独绘制含inf的边,指定为红色(可自定义样式) if inf_edges: nx.draw_networkx_edges(G, node_positions, edgelist=inf_edges, edge_color='red', width=2, style='dashed') # 虚线更易区分 plt.axis('off') plt.show()
关键细节说明:
- 边的拆分逻辑:用
np.isinf()判断参数是否为无穷大,将边分成两组。如果你的parameter是和G.edges()顺序对应的列表,只需把取值逻辑改成param_val = parameter[idx](配合enumerate遍历)即可。 - 分层绘制顺序:先画节点,再画正常边,最后画
inf边,确保红色边在最上层不会被遮挡。 - 颜色条隔离:只有正常参数的边参与颜色条映射,避免
inf干扰颜色范围的计算。 - 样式自定义:给红色
inf边加了虚线样式,你也可以改成实线、调整宽度或者换其他颜色(比如#FF4500橙红色)。
内容的提问来源于stack exchange,提问作者newtroks
相关产品推荐
相关产品推荐

