如何修改NetworkX绘制的图的节点大小?node_size参数报错如何解决?
NetworkX自定义节点大小报错解决方案
你遇到的ValueError: s must be a scalar, or float array-like with the same size as x and y报错,核心原因确实是node_size传入的times_list长度和图的节点总数不匹配,除此之外你代码里的G.size(500)是无效代码,该方法不能修改节点大小,可按以下步骤修复:
- 第一步:校验长度匹配
首先确认times_list和图节点数一致,执行下面代码即可查看两者长度:
print("图节点总数:", G.number_of_nodes()) print("自定义大小列表长度:", len(times_list))
如果需要所有节点大小相同,直接给node_size传入数字标量即可,不需要传列表。如果需要每个节点大小不同,要先调整times_list,保证每个节点对应一个大小值。
第二步:调整绘图代码
你原代码里调用了nx.draw_networkx(G, pos),该方法会默认一次性绘制节点、边、节点标签,要自定义节点大小有两种可选方案:
方案1:直接在nx.draw_networkx中传入node_size参数,一次性完成绘制,代码示例如下:import networkx as nx import matplotlib.pyplot as plt G = nx.DiGraph() fig, ax = plt.subplots(figsize=(32,24)) G.add_edges_from(number_list) pos = nx.spring_layout(G) # 所有节点统一大小写法 nx.draw_networkx(G, pos, node_size=500, node_color='Gray', node_shape='o') # 每个节点自定义大小写法,需保证times_list长度等于节点总数 # nx.draw_networkx(G, pos, node_size=times_list, node_color='Gray', node_shape='o') # 绘制边标签 edge_labels = duration_list nx.draw_networkx_edge_labels(G, pos, edge_labels=dict(zip(map(tuple, number_list), edge_labels))) plt.axis('off') plt.show()方案2:拆分绘图逻辑,分别绘制节点、边、标签,灵活度更高,代码示例如下:
import networkx as nx import matplotlib.pyplot as plt G = nx.DiGraph() fig, ax = plt.subplots(figsize=(32,24)) G.add_edges_from(number_list) pos = nx.spring_layout(G) # 单独绘制自定义大小的节点 nx.draw_networkx_nodes(G, pos, node_size=times_list, node_color='Gray', node_shape='o') # 绘制边 nx.draw_networkx_edges(G, pos) # 绘制节点标签 nx.draw_networkx_labels(G, pos) # 绘制边标签 edge_labels = duration_list nx.draw_networkx_edge_labels(G, pos, edge_labels=dict(zip(map(tuple, number_list), edge_labels))) plt.axis('off') plt.show()注意事项
NetworkX的node_size单位是点的平方,常规取值范围为100-1000,如果times_list内数值过小,节点会无法正常显示,可根据需要按比例放大列表内的数值。
原代码中的G.size(500)可直接删除,该方法用于返回图的加权边数,和节点大小设置无关。
内容的提问来源于stack exchange,提问作者Md.Shams Araf Shovon
相关产品推荐
相关产品推荐

