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

StackOverflow https://stackoverflow.com/questions/4129697

  •  29-09-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

РЕДАКТИРОВАТЬ: В настоящее время проще и лучше использовать 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.RectangleS в patches обновить гистограмму и вызоватьfig.canvas.draw() Чтобы сделать обновления видимыми.

Другие советы

Для заговора в реальном времени я рекомендую попробовать Chaco, Pyqtgraph или любую из библиотек на основе OpenGL, таких как Glumpy или Visvis. Matplotlib, как ни странно, обычно не подходит для такого рода применения.

Редактировать: Разработчики Glumpy, Visvis, Galry и Pyqtgraph сотрудничают в библиотеке визуализации под названием под названием виспи. Анкет Это все еще рано в разработке, но многообещающий и уже довольно мощный.

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

Оу, теперь, посмотри, когда вы говорите в реальном времени, вы имеете в виду, что хотите, чтобы уровень обновления выше 5 Гц Matplotlib не выполнит работу. У меня была эта проблема раньше, я пошел на Pyqwt Это работает с Pyqt.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top