python - 如何更新子图?
问题描述
我需要绘制许多图,查看它们并按“y”或“n”。我无法让 matplotlib 在循环中一个接一个地显示图。循环必须向我展示一个情节,然后我将按下某个按钮并重新开始。我现在的代码是:
def press_event(event):
answer = event.key
if answer=='y':
pass
sys.stdout.flush()
print(answer)
files = os.listdir(folder)
fig, ax = plt.subplots(14,2, figsize=(10,30))
fig.canvas.mpl_connect('key_press_event', press_event)
for file in files:
target = file
data = pd.read_csv(folder + target)
fig.suptitle(target, fontsize=30)
r = 0
for key in data:
sample = data[key]
ts = [sample[i+1] - sample[i] for i in range(len(sample)-1)]
decs,ts,point = cusum(sample,10)
ax[r,0].plot(sample)
ax[r,0].axvline(point,color='red')
ax[r,1].plot(decs)
ax[r,1].axvline(point, color='red')
r += 1
plt.show()
fig.canvas.draw()
plt.waitforbuttonpress()
plt.pause(0.1)
fig.clear()
现在它向我展示了第一个情节。我按下一个按钮,下一个窗口是空白的,内核崩溃了。
解决方案
这是此画廊示例的改编,使用plt.waitforbuttonpress()
阻止调用与图形交互。等待用户输入,如果按下键则返回 True,如果按下鼠标按钮则返回 False,如果在超时秒内没有输入则返回 None。负值禁用超时。
只要你按下一个键,图形就会更新,如果你用鼠标点击循环就会中断。
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(5, 2)
for i in range(10):
x = np.random.random((5, 2, 100))
for r, xx in enumerate(x):
ax[r, 0].plot(xx[0], 'ro')
ax[r, 1].plot(xx[1], 'bx')
plt.show()
fig.canvas.draw()
if plt.waitforbuttonpress(): # True for key, False for mouse
for axx in ax.flat:
axx.clear()
else:
break
另一种可能性是使用key_press_event
. 为此,您需要将绘图更新组合在一个单独的函数中并相应地调用它。在本例中,我使用left
和right
键来切换数据。
import numpy as np
import matplotlib.pyplot as plt
n = 10
x = np.random.random((n, 5, 2, 100))
global i
i = 0
fig, ax = plt.subplots(5, 2)
def update(j):
for axx in ax.flat:
axx.clear()
for r, xx in enumerate(x[j]):
ax[r, 0].plot(xx[0], 'ro')
ax[r, 1].plot(xx[1], 'bx')
def press_event(event):
global i
if event.key == 'left':
i -= 1
elif event.key == 'right':
i += 1
else:
return
i %= n
update(i)
fig.canvas.mpl_connect('key_press_event', press_event)
update(0)
推荐阅读
- javascript - 一旦有值使用 javascript 填充或在输入字段中使用键盘输入时检测
- ssl - 从 GoDaddy 颁发的私钥和通配符证书创建 PFX 文件
- python-3.x - 如何从dict列表中获取列表值
- javascript - 如何在javascript中按日期范围从对象数组中获取唯一数据
- python - 根据多个条件拆分 DF 中的列
- python - browsermobproxy的python客户端可以在真机上使用吗?[解决]
- android - 迁移到 ViewBinding 后无法切换片段(未找到视图 nav_host_fragment)
- huawei-mobile-services - 如何使用 DevEco Studio 在华为手机上运行我的应用程序?
- python - Python CLR WinForms - 从现有表单打开另一个
- r - 使用 R 中的几行代码获取提供者和状态的平均金额