Регулировка диапазона оси x для прямого графика (последовательный поток данных) в matplotlib - PullRequest
2 голосов
/ 17 июня 2011

Я играл с этим битом кода со страницы примеров matplotlib. Я пытаюсь получить ось х, чтобы сохранить заданное окно. Например, холст будет отображаться с x = 0 до 30, с 1 по 31, с 2 до 32. Прямо сейчас мой x растет. Я не смог определить установленный размер окна. Кто-нибудь может направить меня в правильном направлении.

Из моих испытаний кажется, что какое бы значение х ни имело, у должно быть одинаковой длины. Хорошо для моей программы, я просто хочу иметь последовательный поток данных, отображаемых на графике. Я иду по этому пути?

import time
import matplotlib
matplotlib.use('TkAgg') # do this before importing pylab
import matplotlib.pyplot as plt
import random

fig = plt.figure()
ax = fig.add_subplot(111)

y = []

def animate():

    while(1):
        data = random.random()
        y.append(data)
        x = range(len(y))

        line, = ax.plot(y)
        line.set_ydata(y)
        fig.canvas.draw()

win = fig.canvas.manager.window
fig.canvas.manager.window.after(100, animate)
plt.show()

Ответы [ 2 ]

1 голос
/ 17 июня 2011

Вы также можете изменить как данные x, так и y, а затем обновить пределы графика. Я не знаю, как долго вы собираетесь это запускать, но вам, вероятно, стоит подумать о сбросе ненужных y-данных в какой-то момент.

import matplotlib
matplotlib.use('TkAgg') # do this before importing pylab
import matplotlib.pyplot as plt
import random

fig = plt.figure()
ax = fig.add_subplot(111)

x = range(30)
y = [random.random() for i in x]
line, = ax.plot(x,y)

def animate(*args):
    n = len(y)
    for 1:
        data = random.random()
        y.append(data)

        n += 1
        line.set_data(range(n-30, n), y[-30:])
        ax.set_xlim(n-31, n-1)
        fig.canvas.draw()

fig.canvas.manager.window.after(100, animate)
plt.show()
0 голосов
/ 17 июня 2011

Это простая версия, которая отображает последние 30 точек y (фактически она просто отбрасывает все данные, кроме последних 30 точек, так как кажется, что вам не нужно их хранить), но метки оси x остаютсяна 0-30 навсегда, что, по-видимому, не то, что вы хотите:

def animate(y, x_window):
    while(1):
        data = random.random()
        y.append(data)
        if len(y)>x_window:  
            y = y[-x_window:]
        x = range(len(y))
        ax.clear()
        line, = ax.plot(y)
        line.set_ydata(y)
        fig.canvas.draw()

fig = plt.figure()
ax = fig.add_subplot(111)
y = []
win = fig.canvas.manager.window
fig.canvas.manager.window.after(100, animate(y,30))

Поэтому я добавляю переменную смещения, чтобы отследить, сколько у вас вырезано, и просто добавлю это число ко всемметки оси x с set_xticklabels:

def animate(y, x_window):
    offset = 0
    while(1):
        data = random.random()
        y.append(data)
        if len(y)>x_window:  
            offset += 1
            y = y[-x_window:]
        x = range(len(y))
        ax.clear()
        line, = ax.plot(y)
        line.set_ydata(y)
        ax.set_xticklabels(ax.get_xticks()+offset)
        fig.canvas.draw()

fig = plt.figure()
ax = fig.add_subplot(111)
y = []
win = fig.canvas.manager.window
fig.canvas.manager.window.after(100, animate(y,30))

Это работает?

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