python - FuncAnimation 现在在 matplotlib 更新 (3.2.2 -> 3.3.4) 后在每一帧重新调整轴限制
问题描述
我正在使用 matplotlib FuncAnimation 显示从传感器实时接收的数据。
在更新 matplotlib 之前,我使用的是 matplotlib 3.2.2,行为如下:
- 图表打开并自动缩放轴对来自传感器的数据的限制
- 如果我以交互方式放大图形,图形将保留在我定义的区域上(便于检查一小部分数据)。
现在,在更新到 matplotlib 3.3.4 后,图表仍然会打开并自动缩放,但如果我放大数据,图表会立即自动缩放回数据的全部范围,这使得检查变得不可能。
我尝试将轴自动缩放设置为False
,但随后图形根本不自动缩放,这很不方便。
我在下面放了一些重现上述现象的示例代码:
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from random import random
def test():
"""Test live matplotlib animation"""
fig, (ax1, ax2) = plt.subplots(2, 1)
# for ax in ax1, ax2: # uncomment to deactivate autoscale
# ax.set_autoscale_on(False)
def animate(i):
x = random() # Fake sensor 1
y = 10 * random() + 3 # Fake sensor 2
ax1.plot(i, x, 'ok')
ax2.plot(i, y, 'ob')
ani = FuncAnimation(fig, animate, interval=100)
plt.show()
return ani
知道如何在保持更新版本的 matplotlib 的同时恢复初始行为吗?非常感谢您!
解决方案
我发现的解决方法是对 matplotlib 图上的鼠标事件使用回调,在左键单击时停用自动缩放,并通过右键单击重新激活它们。
def onclick(event):
ax = event.inaxes
if ax is None:
pass
elif event.button == 1: # left click
ax.set_autoscale_on(False)
elif event.button == 3: # right click
ax.set_autoscale_on(True)
else:
pass
cid = fig.canvas.mpl_connect('button_press_event', onclick)
这意味着每当用户在图形的某些轴上使用交互式缩放(通过左键单击定义缩放区域)时,自动缩放将被禁用,并且可以进行检查、平移等操作。然后,用户只需右键单击即可返回自动缩放的实时数据。
事实上,这甚至比我最初在 matplotlib 3.2.2 中的效果还要好,在 matplotlib 3.2.2 中,一旦完成缩放,就无法回到自动缩放的轴限制。
推荐阅读
- arrays - TypeScript 如何推断数组字面量的元素类型?
- c++ - 使用opengl显示3D点
- node.js - 访问 JSON 返回 undefined
- php - Laravel Nova - 创建新记录时如何过滤 BelongsTo 字段选择?
- java - 设置单选按钮值
- email - golang net/smtp 获取 smtp 服务器响应 DSN
- c - 检查指针是否到达字符串结尾时出错
- php - 为什么 Docker 和 Heroku 会为我的小型测试应用程序推送这么大的层?
- multithreading - 对数据竞争定义的困惑
- powershell-3.0 - 将本地路径中的文件批量上传到 SharePoint Online 允许与号和磅吗?