如何在Netgraph的EditableGraph中固定节点大小,不受窗口缩放影响?
解决Netgraph EditableGraph窗口缩放时节点大小固定的问题
Netgraph的EditableGraph默认使用轴相对单位定义节点大小,窗口缩放时节点会随轴的显示比例变化,导致和固定大小的标签比例失调。要让节点保持固定屏幕大小,核心是让节点使用屏幕像素坐标而非轴相对坐标,以下是具体实现方法:
方法1:自定义固定大小的节点绘制函数
通过重写节点绘制逻辑,利用Matplotlib的坐标变换让节点大小绑定屏幕像素:
import matplotlib.pyplot as plt from netgraph import EditableGraph import matplotlib.transforms as transforms # 创建画布和轴 fig, ax = plt.subplots() def draw_fixed_pixel_nodes(ax, positions, node_size=25, **kwargs): # 将屏幕像素转换为当前轴坐标(仅用于初始化) pix_to_axis = ax.transData.inverted() pixel_radius = node_size / 2 # 计算对应轴坐标下的半径 axis_radius = pix_to_axis.transform((pixel_radius, pixel_radius))[0] - pix_to_axis.transform((0,0))[0] # 使用混合变换:轴坐标定位 + 屏幕坐标保持大小 fixed_transform = ax.transData + transforms.ScaledTranslation(0, 0, transforms.IdentityTransform()) # 逐个绘制固定大小节点 node_patches = [] for node, pos in positions.items(): circle = plt.Circle(pos, axis_radius, transform=fixed_transform, **kwargs) ax.add_patch(circle) node_patches.append(circle) return node_patches # 初始化EditableGraph,替换节点绘制函数 graph = EditableGraph( [(0,1), (1,2), (2,0), (0,3)], node_artist_function=draw_fixed_pixel_nodes, node_size=25, # 这里传入的是像素大小 node_color='#63aeee', edge_color='#333333' ) plt.show()
方法2:绑定窗口Resize事件动态调整
如果需要窗口缩放时实时保持节点像素大小,可绑定Matplotlib的resize事件,动态更新节点半径:
# 接上面的代码,添加resize事件处理 def update_node_size_on_resize(event): pix_to_axis = ax.transData.inverted() pixel_radius = 25 / 2 # 和初始化的node_size保持一致 axis_radius = pix_to_axis.transform((pixel_radius, pixel_radius))[0] - pix_to_axis.transform((0,0))[0] # 更新所有节点的半径 for patch in ax.patches: if isinstance(patch, plt.Circle): patch.set_radius(axis_radius) fig.canvas.draw_idle() # 绑定事件 fig.canvas.mpl_connect('resize_event', update_node_size_on_resize) plt.show()
关键说明
node_size参数传入的是屏幕像素值,可根据需求调整(比如20-30像素适合大多数场景)- 混合变换
ax.transData + transforms.IdentityTransform()确保节点位置跟随轴坐标,但大小保持屏幕像素固定 - Resize事件处理保证窗口缩放后节点大小实时修正
内容的提问来源于stack exchange,提问作者Franck
相关产品推荐
相关产品推荐

