如何在NetworkX环形布局节点外侧显示特征向量值尺寸的圆形
解决方案:根据环形节点位置调整外侧圆形的位置
我帮你调整了代码,现在能根据每个节点在环形布局中的位置,把橙色圆形放在对应的外侧方向(左/右/上/下),同时调整节点编号文本的位置避免重叠:
import networkx as nx import matplotlib.pyplot as plt # 创建随机图 G = nx.gnp_random_graph(20, 0.2) # 计算特征向量中心性 centrality = nx.eigenvector_centrality_numpy(G) # 创建保留三位小数的标签字典 labels = { node: '{:.3f}'.format(centrality[node]) for node in centrality } plt.figure(figsize=(20, 20)) ax = plt.gca() ax.set_aspect('equal') pos = nx.circular_layout(G) # 绘制基础图和节点标签 nx.draw(G, pos=pos, node_color='lightblue', labels=labels, with_labels=True) for node, (x, y) in pos.items(): rad = centrality[node] * 0.25 # 判断节点在环形的方向,确定圆形位置 if abs(y) > abs(x): # 顶部或底部节点 if y > 0: # 顶部:圆在节点上方 circle_pos = (x, y + rad) # 调整文本位置,放在圆的上方 text_pos = (x - 0.012, y + rad + rad*0.5) else: # 底部:圆在节点下方 circle_pos = (x, y - rad) text_pos = (x - 0.012, y - rad - rad*0.5) else: # 左侧或右侧节点 if x > 0: # 右侧:圆在节点右侧 circle_pos = (x + rad, y) text_pos = (x + rad + rad*0.5, y) else: # 左侧:圆在节点左侧 circle_pos = (x - rad, y) text_pos = (x - rad - rad*0.5, y) # 添加圆形和节点编号文本 circle = plt.Circle(circle_pos, radius=rad, color='orange') plt.text(*text_pos, node, fontsize=16, weight="bold") ax.add_artist(circle) plt.show()
关键逻辑说明:
- 方向判断:通过比较节点坐标
x和y的绝对值大小,区分节点是在垂直方向(上下)还是水平方向(左右);再通过坐标的正负确定具体是上/下/左/右。 - 位置计算:根据方向调整圆形的中心坐标——比如右侧节点的圆形中心在
(x+rad, y),这样圆形会刚好贴在节点的右侧外侧;顶部节点则是(x, y+rad)。 - 文本位置适配:把节点编号文本放在圆形的外侧(比如顶部节点的文本在圆的上方,左侧节点的文本在圆的左边),避免和圆形或节点标签重叠。
这样修改后,每个节点的橙色圆形都会出现在对应的外侧方向,而且大小由特征向量中心性值决定,完全符合你的需求~
内容的提问来源于stack exchange,提问作者nandz123
相关产品推荐
相关产品推荐

