Как динамически отображать поток данных времени на matplotlib

Я использую matplotlib для периодического отображения данных, сохраненных в csv-файле,
теперь данные строятся хорошо, но ось времени практически не движется
скрипт пытается показать все данные, хранящиеся в этом файле, я хочу видеть только последние данные и иметь возможность scrol horizontaly, чтобы увидеть старые данные
это часть сценария :

style.use('grayscale')

fig = plt.figure()
ax0= fig.add_subplot(511)


def animate(i):
    graph_data = open('filelocation','r').read()
    lines = graph_data.split('n')
    xs = []
    ys = []

    for line in lines :
        if len(line)>1:
            time0 , quantity0 = line.split (',')
            xs.append(dt.datetime.strptime(time0,'%H:%M:%S.%f'))
            ys.append(quantity0)

    ax0.clear()
    ax0.plot(xs,ys)


xs = matplotlib.dates.date2num(xs)
hfmt = matplotlib.dates.DateFormatter('%H:%M:%S')
ax0.ticklabel_format(style='sci', axis='y', scilimits=(0, 0))
ax0.set_ylabel('risk')
ax0.xaxis.set_major_formatter(hfmt)
ani =  animation.FuncAnimation(fig, animate, interval=1000)
plt.ticklabel_format(style='sci',axis ='y' , scilimits = (0,0))
plt.show()
plt.clear()

1 ответ

  1. Из этого видео, похоже, вы хотите что — то вроде следующего-я все еще вижу окно прокрутки в видео, которое вы опубликовали, поэтому я все еще немного смущен относительно того, что вы хотите. Это используетfig.canvas.draw, но есть и другие варианты использования модуля анимации matplotlib (вы не указали, что он должен использовать этот модуль).

    import numpy as np, time
    from matplotlib import pyplot as plt
    
    import matplotlib
    matplotlib.interactive(True)
    
    rest_time = 0.001
    data_stream = np.random.randn(200)
    
    # Define the width of the viewing window (xaxis limits), 
    # and the number of points to be displayed until a scrolling window starts
    window_width = 40
    n = 60
    
    fig, ax = plt.subplots()
    plotted_data, = ax.plot([], [], 'bo-', lw = 1.5)
    
    x = []
    y = []
    
    ax.set_xlim([0, window_width])
    ax.set_ylim([-4, 4])
    
    for t, d in enumerate(data_stream):
    
        x.append(t)
        y.append(d)
    
        plotted_data.set_xdata(x)
        plotted_data.set_ydata(y)
    
        if t > window_width:
            ax.set_xlim([0, t])
    
        if len(x) > n:
            ax.set_xlim([t-n, t])
    
        time.sleep(rest_time)
        fig.canvas.draw()