首页 > 解决方案 > 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 的同时恢复初始行为吗?非常感谢您!

标签: pythonmatplotlibmatplotlib-animation

解决方案


我发现的解决方法是对 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 中,一旦完成缩放,就无法回到自动缩放的轴限制。


推荐阅读