使用Matplotlib在Python中的key_event上切换水平轴

7y4bm7vi  于 2023-08-06  发布在  Python
关注(0)|答案(1)|浏览(110)

我试图绘制一些数据,当我点击某个键时,我希望水平轴出现,作为边界。
这工作正常,但我也想然后按下按钮第二次,并删除边界线。这是否可以通过Matplotlib的事件回调来实现?
到目前为止我有:

def on_key(event):
    
    if event.key == 'b':   

        plot.axhline(y = boundary, color = 'green', linestyle = '-')
 
    plot.draw()

字符串
我试过为axhline可见性设置一个布尔变量,以切换回调的每个条目,但不幸的是似乎不起作用。
我也试过将颜色设置为白色,但这会影响底层数据,在情节中仍然相当引人注目。
有没有一种方法可以简单地删除这个axhline,甚至与serperate按钮按下例如?

yb3bgrhw

yb3bgrhw1#

基于this documentation page,我们可以创建axhline并在每次按键时切换其可见性。

import numpy as np
import matplotlib.pyplot as plt

def on_press(event):
    visible = line.get_visible()
    line.set_visible(not visible)
    fig.canvas.draw()

rng = np.random.default_rng(42)

N = 10
x = np.linspace(0, 5, N)
y = rng.random(N)
y_mean = np.mean(y)

fig, ax = plt.subplots()
fig.canvas.mpl_connect("key_press_event", on_press)

ax.plot(x, y, ".")
line = ax.axhline(y_mean, color="g")
line.set_visible(False)
fig.show()

字符串
注意:on_press函数从全局作用域获取line变量。这不是最好的做法。如果你想显式传递这一行,我们可以使用functools.partial创建一个自动传递变量的事件版本。

import numpy as np
import matplotlib.pyplot as plt
from functools import partial

def on_press_with_line(event, line):
    visible = line.get_visible()
    line.set_visible(not visible)
    fig.canvas.draw()

rng = np.random.default_rng(42)

N = 10
x = np.linspace(0, 5, N)
y = rng.random(N)
y_mean = np.mean(y)

fig, ax = plt.subplots()

ax.plot(x, y, ".")
line = ax.axhline(y_mean, color="g")
line.set_visible(False)
on_press = partial(on_press_with_line, line=line)
fig.canvas.mpl_connect("key_press_event", on_press)
fig.show()


或者我们可以使用lambda函数。

fig.canvas.mpl_connect("key_press_event", lambda event: on_press_with_line(event, line))

相关问题