如何在Matplotlib双Y轴图表中正常使用矩形选择器?
解决Matplotlib双Y轴下RectangleSelector不可见的问题
问题根源
用twinx()生成次坐标轴ax2后,ax2的层级(zorder)默认比主坐标轴ax高,直接把主ax上的RectangleSelector给遮住了。要是硬把主ax的zorder调高,它的不透明背景又会完全盖住ax2的图表,得不偿失。
解决方案
把主坐标轴的背景设为透明,这样既能让主ax上的选择器显示在ax2内容上方,又不会遮挡ax2的图表:
- 创建次坐标轴后,给主ax添加透明背景设置:
self.ax2 = self.ax.twinx() # 将主坐标轴背景设为透明 self.ax.set_facecolor('none')
- 不用调整主ax的zorder,保持默认层级就行——twinx生成的ax2默认zorder更高,但主ax背景透明后,ax2的图表会透过背景显示出来,同时主ax上的选择器、图表元素都能正常展示。
修改后的完整代码片段
# 创建矩形选择器 self.toggle_selection_var=tk.IntVar(value = 1) self.selection_coords=[] def toggle_selector(): if self.toggle_selection_var.get() == 1 and not toggle_selector.RS.active: toggle_selector.RS.set_active(True) elif self.toggle_selection_var.get() == 0 and toggle_selector.RS.active: toggle_selector.RS.set_active(False) def onselect(eclick, erelease): self.selection_coords=[eclick.xdata, eclick.ydata, erelease.xdata, erelease.ydata] toggle_selector.RS = RectangleSelector(self.ax, onselect, useblit=True, button=[1, 3], # 禁用中键 minspanx=5, minspany=5, spancoords='pixels', interactive=True, drag_from_anywhere=True, use_data_coordinates=True) # 添加次坐标轴并设置主坐标轴背景透明 self.ax2 = self.ax.twinx() self.ax.set_facecolor('none')
补充调整
如果之后发现主ax的网格线或其他元素被ax2覆盖,可以单独调整这些元素的层级:
# 让主ax的网格线显示在ax2图表上方 self.ax.grid(zorder=2) self.ax2.set_zorder(1)
内容的提问来源于stack exchange,提问作者grimad
相关产品推荐
相关产品推荐

