matplotlib:插入轴的事件处理和导航
matplotlib: event handling and navigation for inset axes
为了在一个图上显示另一个图,我可以
- 使用两个轴并使用 zorder
- 或改用插入轴
import matplotlib.pyplot as plt
fig = plt.figure()
ax0 = fig.add_axes([0.1,0.1,0.8,0.8], zorder=1)
ax0.set_title('ax0')
ax1 = fig.add_axes([0.175,0.5,0.3,0.3], zorder=2)
ax1.set_title('ax1')
ax1.set_facecolor('lightgray')
ax1.set_xlim(2,3)
ax1.set_ylim(2,3)
ax2 = ax0.inset_axes([0.575, 0.5, 0.375, 0.375])
ax2.set_title('ax2')
ax2.set_facecolor('gray')
ax2.set_xlim(4,5)
ax2.set_ylim(4,5)
plt.show()
不幸的是,这两个选项都显示不稳定的交互行为:
- ax1 确实在导航栏中显示了正确的信息并允许 zoom/pan(好)。然而,背景轴 ax0 也被缩放和平移(不好)。
- ax2 被完全忽略,即导航栏信息和 zoom/pan 仅适用于 ax0
问题:
是否有一种简单的方法可以在鼠标事件位于 ax1 或 ax2 内时为 ax0 禁用 info/zoom/pan ,或者我是否必须经历覆盖事件函数并根据 [= 的边界框进行坐标转换的痛苦36=],甚至是导航栏的子类?
PS:我只需要 1. 或 2. 中的一个就可以工作,而不是两者都需要。 1. 如果我可以按我的意愿切换 off/on ax0,似乎更接近开始时所要求的行为...
只需使用 ax0.set_navigate(False)
即可停止 ax0 响应导航命令。
Diziet Asahi 与 'axes_enter_event' 相关的回答针对选项 1 解决了它。我无法让它直接用于插入轴。另外,zorder现在好像不重要了所以去掉了。
参考代码:
import matplotlib.pyplot as plt
fig = plt.figure()
ax0 = fig.add_axes([0.1,0.1,0.8,0.8])
ax0.set_title('ax0')
ax1 = fig.add_axes([0.175,0.5,0.3,0.3])
ax1.set_title('ax1')
ax1.set_facecolor('lightgray')
ax1.set_xlim(2,3)
ax1.set_ylim(2,3)
def enter_axes(event):
if not event.inaxes:
return
if event.inaxes == ax1:
ax0.set_navigate(False)
elif event.inaxes == ax0:
ax0.set_navigate(True)
fig.canvas.mpl_connect('axes_enter_event', enter_axes)
plt.show()
为了在一个图上显示另一个图,我可以
- 使用两个轴并使用 zorder
- 或改用插入轴
import matplotlib.pyplot as plt
fig = plt.figure()
ax0 = fig.add_axes([0.1,0.1,0.8,0.8], zorder=1)
ax0.set_title('ax0')
ax1 = fig.add_axes([0.175,0.5,0.3,0.3], zorder=2)
ax1.set_title('ax1')
ax1.set_facecolor('lightgray')
ax1.set_xlim(2,3)
ax1.set_ylim(2,3)
ax2 = ax0.inset_axes([0.575, 0.5, 0.375, 0.375])
ax2.set_title('ax2')
ax2.set_facecolor('gray')
ax2.set_xlim(4,5)
ax2.set_ylim(4,5)
plt.show()
不幸的是,这两个选项都显示不稳定的交互行为:
- ax1 确实在导航栏中显示了正确的信息并允许 zoom/pan(好)。然而,背景轴 ax0 也被缩放和平移(不好)。
- ax2 被完全忽略,即导航栏信息和 zoom/pan 仅适用于 ax0
问题: 是否有一种简单的方法可以在鼠标事件位于 ax1 或 ax2 内时为 ax0 禁用 info/zoom/pan ,或者我是否必须经历覆盖事件函数并根据 [= 的边界框进行坐标转换的痛苦36=],甚至是导航栏的子类?
PS:我只需要 1. 或 2. 中的一个就可以工作,而不是两者都需要。 1. 如果我可以按我的意愿切换 off/on ax0,似乎更接近开始时所要求的行为...
只需使用 ax0.set_navigate(False)
即可停止 ax0 响应导航命令。
Diziet Asahi 与 'axes_enter_event' 相关的回答针对选项 1 解决了它。我无法让它直接用于插入轴。另外,zorder现在好像不重要了所以去掉了。
参考代码:
import matplotlib.pyplot as plt
fig = plt.figure()
ax0 = fig.add_axes([0.1,0.1,0.8,0.8])
ax0.set_title('ax0')
ax1 = fig.add_axes([0.175,0.5,0.3,0.3])
ax1.set_title('ax1')
ax1.set_facecolor('lightgray')
ax1.set_xlim(2,3)
ax1.set_ylim(2,3)
def enter_axes(event):
if not event.inaxes:
return
if event.inaxes == ax1:
ax0.set_navigate(False)
elif event.inaxes == ax0:
ax0.set_navigate(True)
fig.canvas.mpl_connect('axes_enter_event', enter_axes)
plt.show()