繁体   English   中英

如何将“ mpl_connect”限制为“ axes”而不是整个“ figure”?

[英]How to limit `mpl_connect` to an `axes` instead of a whole `figure`?

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

每次我在文本框中键入文本时,过程都很缓慢,我认为这是因为当我单击并在文本框中书写时,它会不必要地触发3个“ mpl连接”( key_press_event button_press_event button_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)

有一些解决方法吗?

欢迎任何评论!

看一下这个简单的例子,看看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期间鼠标所处的位置,因此可以使用onPressKey(event)处理程序来决定对该输入进行key_press_event 但是请注意,一旦在TextBox小部件内单击,它将捕获您的输入(即, s被写入其中,不会触发保存对话框)。 如果现在将鼠标移到texbox之外 ,则onPressKey(event)处理程序仍将让您知道在文本输入过程中鼠标位于ax之内(或者可能是“外部”),但这不会改变 TextBox小部件的事实。仍然会捕获您的输入,直到您按Enter键。

简短的答案:您不想将key_press_event连接到特定的轴,而是希望让onPressKey(event)处理程序很好地处理它 每个击键都应注册为一个key_press_event ,因此这可能不是您的罪魁祸首(好吧,除非您将实际代码设置为例如对e按下进行一些昂贵的计算,并且您忘记了首先在TextBox单击) 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM