python-3.x - 如何使轴对事件透明?
问题描述
我正在尝试找到一种方法来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)
现在这是我的问题。不可见的轴仍会触发事件。有没有办法让某些轴对事件“透明”?显然,在回调中对所有案例进行排序的常用技术在这里不起作用。
目前设想的解决方案:
- 理想情况下,找到一个类似的设置,
zorder
以便“最高”轴获得事件。 - 丑陋的解决方法:将不可见轴的位置设置为
((0, 0, 1e-10, 1e-10))
. - 不那么难看:使用图形坐标将
event.x
,event.y
转换为event.xdata
,event.ydata
因为我知道唯一可见的斧头。基本上xdata1, ydata1 = ax1.transAxes.inverted().transform((event.x, event.y))
ifevent.inaxes
不是 None + 看看是否有边缘情况。
后者已经实现并且确实有效,因此如果您想使用该方法编写回复,请节省您的时间。我最感兴趣的是我会错过的令人惊叹的单线,比如ax2.set_silenced(True)
.
Python 3.8.5
Matplotlib 3.1.3
解决方案
推荐阅读
- javascript - 如何在Angular中的第一个服务响应成功时进行顺序服务调用
- python - 在 django 中迁移模型时发生错误
- docker - 在 Docker 中部署 Rasa
- reactjs - Formsy与react-select,提交后获取元素而不是值
- arrays - 这个数组伪代码的输出是什么,为什么?
- node.js - 如何安全地将权限和访问列表发送到我的 Web 应用程序?
- javascript - 我们如何在 dhtmlxscheduler 中按天、周或月的变化获得多个 section_id
- python - 在 Python 中,为什么取幂从右到左分组?
- sql-server - 从存储在另一个表的 varchar(max) 列中的 XML 文件将数据插入 SQL 表
- python - 在 Python 中创建列表时避免达到内存限制