Подтвердить что ты не робот

Как отображать графики в реальном времени в простом пользовательском интерфейсе для программы python?

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

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

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

4b9b3361

Ответ 1

Изменить: В настоящее время проще и удобнее использовать 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 кадрами в секунду, используя первый код <. Хитрость заключается в том, чтобы избежать запроса matplotlib для рисования полных фигур. Вместо этого вызовите plt.hist один раз, затем выполните управление существующим matplotlib.patches.Rectangle в patches, чтобы обновить гистограмму, и вызовите fig.canvas.draw(), чтобы сделать обновления видимыми.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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