Обновление анимации Matplotlib Ограничение оси X не работает - PullRequest
0 голосов
/ 23 июня 2019

Я хочу автоматически обновить ограничение даты и времени по оси X.При использовании set_xlim в функции __init__ она работает, но та же команда не действует при использовании в функции __call__.

Код:

import datetime
import time
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.animation import FuncAnimation

def data():
    target_time = datetime.datetime.now()
    n=0
    while True:
        target_time = target_time + datetime.timedelta(seconds=1)
        x = target_time
        y=np.sin(n)*10
        yield (x, y)
        n+=0.05
        time.sleep(2)

class Update(object):
    def __init__(self, ax):
        self.x=[datetime.datetime.now()]
        self.y=[0]
        self.line, = ax.plot(self.x, self.y, 'k-')
        self.ax = ax

        # Set up plot parameters
        now = self.x[0]
        minxlim = now - datetime.timedelta(seconds=60)
        maxxlim = now + datetime.timedelta(seconds=60)
        print(minxlim)
        self.ax.set_xlim(left=minxlim, right=maxxlim) # it's works
        self.ax.set_ylim(-15, 15)
        self.ax.grid(True)
        self.counter=0

    def init(self):

        self.line.axes.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M:%S"))
        return self.line,

    def __call__(self, args):

        self.counter += 1
        i = self.counter
        win = 60
        imin = max(0, i - win)
        self.x.append(args[0])
        self.y.append(args[1])
        xdata = self.x[imin:i]
        ydata = self.y[imin:i]
        self.line.set_data(xdata, ydata)
        self.line.set_color("red")
        now = xdata[-1]
        minxlim = now - datetime.timedelta(seconds=60)
        maxxlim = now + datetime.timedelta(seconds=60)
        self.ax.set_xlim(left=minxlim, right=maxxlim) #  not work
        self.ax.relim()
        self.ax.autoscale_view()

        return self.line,

fig, ax = plt.subplots()
ud = Update(ax)
anim = FuncAnimation(fig, ud, frames=data,init_func=ud.init,interval=1000, blit=True)
plt.show()

Github link

При запуске он все равно выглядит как начальная ось X, хотя пределы должны менять каждый кадр.

1 Ответ

0 голосов
/ 23 июня 2019

Блиттинг меняет содержимое осей, а не декораторов.Это означает, что такие декораторы, как галочки и метки, остаются неизменными.
Поскольку ваша анимация в любом случае довольно медленная, нет необходимости в блиттинге.Так что вы можете просто выключить его,

FuncAnimation(..., blit=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...