使用列表修改NetworkX图中特定节点形状触发报错如何解决?
问题原因
NetworkX的nx.draw_networkx()及其衍生绘图接口的node_shape参数不支持传入列表为不同节点指定不同形状,仅支持传入单个全局统一的标记样式。和node_color、node_size这类支持逐点配置的参数不同,node_shape底层依赖matplotlib的散点图实现,单个散点序列只能使用同一种标记样式,所以你传入形状列表的操作不符合参数要求,触发值错误。
解决方案
将不同形状的节点拆分为独立分组,分别调用nx.draw_networkx_nodes()绘制即可,边、标签等元素可统一绘制避免重复操作,示例代码如下:
# 按形状规则拆分节点分组 normal_nodes = [n for n in S if n not in nodes_of_interest] special_nodes = [n for n in S if n in nodes_of_interest] # 统一绘制边和节点标签 nx.draw_networkx_edges(S, pos=layout) nx.draw_networkx_labels(S, pos=layout, font_size=14, font_weight='bold') # 绘制普通圆形节点 nx.draw_networkx_nodes( S, pos=layout, nodelist=normal_nodes, node_color=[color_map[i] for i, n in enumerate(S.nodes) if n in normal_nodes], # 可根据你自己的color_map索引规则调整取值逻辑 edgecolors=[edge_colors[i] for i, n in enumerate(S.nodes) if n in normal_nodes], node_size=[node_size[i] for i, n in enumerate(S.nodes) if n in normal_nodes], node_shape='o' ) # 绘制特殊菱形节点 nx.draw_networkx_nodes( S, pos=layout, nodelist=special_nodes, node_color=[color_map[i] for i, n in enumerate(S.nodes) if n in special_nodes], edgecolors=[edge_colors[i] for i, n in enumerate(S.nodes) if n in special_nodes], node_size=[node_size[i] for i, n in enumerate(S.nodes) if n in special_nodes], node_shape='d' ) # 隐藏坐标轴(可选,匹配原draw_networkx的默认表现) plt.axis('off') plt.show()
如果你的属性列表本身是按节点顺序存储的,也可以提前建立节点-属性的映射字典,取值逻辑会更简洁。
内容的提问来源于stack exchange,提问作者Alex L
相关产品推荐
相关产品推荐

