首页 > 解决方案 > 如何使轴对事件透明?

问题描述

我正在尝试找到一种方法来Axes为事件创建对象传递。

对于上下文,我有一个带有 6 个小子图的图。它们中的每一个都通过显示用户瞄准的光标点和文本信息来响应鼠标运动事件。我也这样做了,以便单击子图将使其与图形一样大,以提高可见度。将鼠标移到不可见的轴上时,event.inaxes尽管设置为不可见,但仍会指向该轴,这是我想避免的。

下面是MRE:

import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.set_gid("ax1")
ax2.set_gid("ax2")
fig.show()

def on_movement(event):
    """Write on the figure in which `Axes`object the event happened."""

    width, height = fig.bbox.bounds[2:]
    x = event.x/width
    y = event.y/height
    text = ax.get_gid() if (ax := event.inaxes) is not None else "None"
    fig.texts[:] = []
    fig.text(x, y, s=text, transform=fig.transFigure, c="white", bbox=dict(fc="#0055AA", ec="black"))
    fig.canvas.draw()

fig.canvas.mpl_connect("motion_notify_event", on_movement)

正如预期的那样,当您将鼠标悬停在ax1、空白处和ax2上时,您将看到这三个文本之一出现: 在此处输入图像描述

ax1.set_position((1/3, 1/3, 2/3, 2/3))

与我任意调整大小和移动ax1以使其与ax2.

在此处输入图像描述

ax2.set_visible(False)

现在这是我的问题。不可见的轴仍会触发事件。有没有办法让某些轴对事件“透明”?显然,在回调中对所有案例进行排序的常用技术在这里不起作用。

在此处输入图像描述

目前设想的解决方案:

后者已经实现并且确实有效,因此如果您想使用该方法编写回复,请节省您的时间。我最感兴趣的是我会错过的令人惊叹的单线,比如ax2.set_silenced(True).

Python 3.8.5
Matplotlib 3.1.3

标签: python-3.xmatplotlib

解决方案


好吧,设置适当的zorder确实有效。

ax1.set_zorder(2)
ax2.set_zorder(1)
...

def on_movement(event):
    ...
    fig.text(x, y, ..., zorder=1000)
    ...

在此处输入图像描述


推荐阅读