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

#python #python-2.7 #python-3.x #matplotlib #plot

#python #python-2.7 #python-3.x #matplotlib #график

Вопрос:

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

 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. Я не могу воссоздать проблему с этим кодом, но вы пробовали использовать ax0.set_xlim для перемещения оси x, чтобы отобразить окно данных, которые вы хотите просмотреть?

2. Нет, это заставит его автоматически перемещаться слева направо по мере поступления данных?

3. ОК. Я не совсем понимаю, что вы пытаетесь сделать тогда. Вы хотите сделать его интерактивным? Есть ли шанс, что вы можете создать какие-то поддельные данные, чтобы ваш приведенный выше пример был полностью воспроизводимым?

4. в этом видео показано все, первые 7 секунд показывают, как данные продолжают поступать справа, в то время как они не поступают с левой стороны, это точно мой случай и проблема, остальная часть видео (после 7-й секунды) показывает, как я хочу, чтобы это было.

Ответ №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()
  

Комментарии:

1. Хорошо, это может быть решением, в моем случае у меня есть csv-файл, содержащий два столбца Time, value … Как это решение может работать для меня, поскольку у меня есть время по оси x.. Если вы хотите, я могу загрузить пример файла, из которого я беру данные

2. Измените цикл for на for t, d in zip(times, values): where times — это массив времен, которые вы хотите отобразить (столбец Time вашего набора данных), и values это массив значений, которые вы хотите отобразить.