【问题标题】:How to limit `mpl_connect` to an `axes` instead of a whole `figure`?如何将`mpl_connect`限制为`axes`而不是整个`figure`?
【发布时间】:2019-05-15 17:30:33
【问题描述】:

我正在编写一个程序,用户可以在其中交互式地修改绘图。我正在使用 3 个 mpl_connect 函数 (key_press_event button_press_event button_release_event) 加上 4 个文本框 (mwidgets.TextBox)。

每次我在文本框中输入文本时,这个过程很慢,我认为这是因为当我在文本框上单击和书写时,它不必要地触发了 3 个“mpl 连接”( key_press_eventbutton_press_eventbutton_release_event)。

3 个文本框在“轴对象”之外,所以我想知道是否有办法将“mpl 连接”限制在感兴趣的轴内。也就是说,而不是编写以下代码:

cid1 = figure.canvas.mpl_connect('key_press_event', onPressKey)
cid2 = figure.canvas.mpl_connect('button_press_event', onPressButton)
cid3 = figure.canvas.mpl_connect('button_release_event', onReleaseButton)

编写类似的代码(注意将canvas 替换为axes):

cid1 = figure.axes.mpl_connect('key_press_event', onPressKey)
cid2 = figure.axes.mpl_connect('button_press_event', onPressButton)
cid3 = figure.axes.mpl_connect('button_release_event', onReleaseButton)

有什么解决方法吗?

欢迎评论!

【问题讨论】:

  • 据我所知这是不可能的,但您没有提供函数onPressKey 和其他函数的代码。你能测试一下哪个 Axes 对象触发了这个事件,如果不是正在绘制的,就立即返回?
  • 您写道您“认为这是因为当我单击并在文本框上书写时,它会不必要地触发 3 个“mpl 连接”get_active() 方法来确定输入应该进入 TextBox 还是画布?
  • @DizietAsahi - 函数onPressKeyonPressButtononReleaseButton 只是返回按下的键盘键或鼠标键的值,实际上是立即返回。 @Asmus - 是的,正如你所说,我验证了它。当我在文本框中输入时,onPressKey 函数正在打印每个输入的字符,这是不必要的,因为当我将鼠标悬停在包含绘图的轴上时,我只使用按下的键盘键的值。跨度>

标签: python performance matplotlib widget interactive


【解决方案1】:

看看这个简单的例子,看看print 语句返回什么:

import numpy as np
import matplotlib as mpl

import matplotlib.pyplot as plt
from matplotlib.widgets import TextBox

fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.2)
t = np.arange(-2.0, 2.0, 0.001)
s = t ** 2
initial_text = "t ** 2"
l, = plt.plot(t, s, lw=2)

def submit(text):
    ydata = eval(text)
    l.set_ydata(ydata)
    ax.set_ylim(np.min(ydata), np.max(ydata))
    plt.draw()

def onPressKey(event):
    print('you pressed key {0} in ax {1}'.format( event.key, event.inaxes ))
    if event.inaxes in [ax]:
        print("in ax")
    elif event.inaxes in [fig.axes[1]]:
        print("in cid1")
    else:
        print("outside")


axbox = plt.axes([0.1, 0.05, 0.8, 0.075])
text_box = TextBox(axbox, 'Evaluate', initial=initial_text)
text_box.on_submit(submit)

fig.canvas.mpl_connect('key_press_event', onPressKey)

plt.show()

如果您将鼠标悬停在“绘图区域”(即 axfig.axes[0])上,您按下的每个键都会触发默认键绑定(即 s 会触发保存对话框) .

onPressKey(event) 处理程序已经可以用来决定如何处理这个输入,因为它知道event.inaxes,即在key_press_event 期间你的鼠标在哪里。 但是请注意,一旦您在 TextBox 小部件内单击,它将捕获您的输入(即 s 写入其中,不会触发保存对话框)。 如果您现在将鼠标 移出 texboxonPressKey(event) 处理程序仍然会在文本输入期间让您知道您的 鼠标ax 内(或者可能是“外部”),但这不会改变事实 TextBox 小部件仍然捕获您的输入,直到您例如按输入

简短的回答:您不想将key_press_event 连接到特定轴,而是想让onPressKey(event) 处理程序,处理它。每次击键都应注册为 一个 key_press_event,因此这可能不是您的情况的罪魁祸首(除非您的实际代码被设置为例如对键 e 进行一些昂贵的计算 kbd> 向下,您忘记首先在TextBox 内单击。)

【讨论】:

    猜你喜欢
    • 2021-01-28
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多