Как отобразить графики в реальном времени в простом пользовательском интерфейсе для программы на Python? - PullRequest
18 голосов
/ 09 ноября 2010

У меня есть сложный алгоритм, который обновляет 3 гистограммы, которые хранятся в массивах.Я хочу отладить свой алгоритм, поэтому я думал показать массивы в виде гистограмм в пользовательском интерфейсе.Какой самый простой способ сделать это.(Быстрая разработка приложений важнее оптимизированного кода.)

У меня есть некоторый опыт работы с Qt (в C ++) и некоторый опыт работы с matplotlib.

(я собираюсь оставить этот вопрос открытымв течение дня или двух, потому что мне сложно оценить решения без большого опыта, которого у меня нет. Надеюсь, голоса сообщества помогут выбрать лучший ответ.)

Ответы [ 4 ]

21 голосов
/ 09 ноября 2010

Редактировать: В настоящее время проще и лучше использовать matplotlib.animation:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation


def animate(frameno):
    x = mu + sigma * np.random.randn(10000)
    n, _ = np.histogram(x, bins, normed=True)
    for rect, h in zip(patches, n):
        rect.set_height(h)
    return patches    

mu, sigma = 100, 15
fig, ax = plt.subplots()
x = mu + sigma * np.random.randn(10000)
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='green', alpha=0.75)

ani = animation.FuncAnimation(fig, animate, blit=True, interval=10,
                              repeat=True)
plt.show()

Существует пример создания анимированного графика здесь .Основываясь на этом примере, вы можете попробовать что-то вроде:

import numpy as np
import matplotlib.pyplot as plt

plt.ion()
mu, sigma = 100, 15
fig = plt.figure()
x = mu + sigma*np.random.randn(10000)
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='green', alpha=0.75)
for i in range(50):
    x = mu + sigma*np.random.randn(10000)
    n, bins = np.histogram(x, bins, normed=True)
    for rect,h in zip(patches,n):
        rect.set_height(h)
    fig.canvas.draw()

Таким образом, я могу получить около 14 кадров в секунду, по сравнению с 4 кадрами в секунду, используя код I , впервые опубликованный .Хитрость заключается в том, чтобы не просить matplotlib рисовать полные фигуры.Вместо этого вызовите plt.hist один раз, затем манипулируйте существующими matplotlib.patches.Rectangle s в patches, чтобы обновить гистограмму, и вызовите fig.canvas.draw(), чтобы сделать обновления видимыми.

9 голосов
/ 10 февраля 2013

Для печати в реальном времени я рекомендую попробовать Chaco, pyqtgraph или любую из библиотек на основе opengl, таких как glumpy или visvis. Matplotlib, какой бы замечательной она ни была, обычно не подходит для такого рода приложений.

Редактировать: разработчики glumpy, visvis, galry и pyqtgraph совместно работают над библиотекой визуализации vispy . Он все еще находится на ранней стадии разработки, но перспективен и уже достаточно силен.

1 голос
/ 09 ноября 2010

Ой, теперь видите, когда вы говорите в режиме реального времени, вы имеете в виду, что вы хотите, чтобы частота обновления выше 5 Гц matplotlib не выполняла эту работу. У меня была эта проблема раньше, я пошел на PyQwt , который работает с PyQt.

1 голос
/ 09 ноября 2010

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

...