Последние несколько дней я играл с Numpy и matplotlib. У меня возникли проблемы с попыткой построить график функции matplotlib без блокировки выполнения. Я знаю, что на SO уже есть много тем, задающих похожие вопросы, и я довольно много гуглил, но мне не удалось заставить эту работу.
Я пробовал использовать show (block = False), как предлагают некоторые люди, но все, что я получил, - это замороженное окно. Если я просто вызываю show (), результат отображается правильно, но выполнение блокируется до закрытия окна. Судя по другим темам, которые я читал, я подозреваю, что работает ли show (block = False) или нет, зависит от серверной части. Это верно? Моя серверная часть - Qt4Agg. Не могли бы вы взглянуть на мой код и сказать, видите ли вы что-то не так? Вот мой код. Спасибо за любую помощь.
from math import *
from matplotlib import pyplot as plt
print plt.get_backend()
def main():
x = range(-50, 51, 1)
for pow in range(1,5): # plot x^1, x^2, ..., x^4
y = [Xi**pow for Xi in x]
print y
plt.plot(x, y)
plt.draw()
#plt.show() #this plots correctly, but blocks execution.
plt.show(block=False) #this creates an empty frozen window.
_ = raw_input("Press [enter] to continue.")
if __name__ == '__main__':
main()
PS. Я забыл сказать, что хотел бы обновлять существующее окно каждый раз, когда что-то рисую, вместо того, чтобы создавать новое.
источник
plt.ion()
раньшеplt.show()
? Тогда он должен быть неблокирующим, поскольку каждый график порождается в дочернем потоке.matplotlib
.Ответы:
Я долго искал решения и нашел ответ .
Похоже, для того , чтобы получить то , что вы (и я) хочу, вам нужно сочетание
plt.ion()
,plt.show()
(не сblock=False
) и, самое главное,plt.pause(.001)
(или любой другой раз , когда вы хотите). Пауза необходима , потому что GUI события происходят в то время как основной код спит, в том числе рисунка. Возможно, это реализовано путем сбора времени из спящего потока, так что, возможно, IDE вмешиваются в это - я не знаю.Вот реализация, которая работает для меня на python 3.5:
источник
plt.draw
следил за ним,plt.show(block = False)
но потом он перестал работать: Рисунок не отвечает, закрытие привело к сбою iPython. Мое решение заключалось в удалении каждого экземпляраplt.draw()
и замене его наplt.pause(0.001)
. Вместо того, чтобы за ним следовалоplt.show(block = False)
какplt.draw
было раньше, ему предшествовали символыplt.ion()
иplt.show()
. Теперь у меня есть,MatplotlibDeprecationWarning
но он позволяет мне строить цифры, так что я доволен этим решением.raw_input
notinput
. Смотрите здесьВот простой прием, который мне подходит:
Пример :
Примечание :
plt.show()
это последняя строка моего скрипта.источник
Вы можете избежать блокировки выполнения, записав график в массив, а затем отобразив массив в другом потоке. Вот пример одновременного создания и отображения графиков с использованием pf.screen из pyformulas 0.2.8 :
Результат:
Отказ от ответственности: я сопровождаю pyformulas.
Ссылка: Matplotlib: сохранить график в массив numpy
источник
Многие из этих ответов слишком раздуты, и, судя по тому, что я могу найти, ответ не так уж и сложен для понимания.
Вы можете использовать,
plt.ion()
если хотите, но я нашел использованиеplt.draw()
столь же эффективнымДля моего конкретного проекта , я черчение изображения, но вы можете использовать
plot()
илиscatter()
или что - то вместо тогоfigimage()
, это не имеет значения.Или
Если вы используете реальную цифру.
Я использовал ответы @ krs013 и @Default Picture, чтобы понять это.
Надеюсь, это избавит кого-то от необходимости запускать каждую фигуру в отдельном потоке или от необходимости читать эти романы, чтобы понять это.
источник
Живой график
если объем данных слишком велик, вы можете снизить частоту обновления с помощью простого счетчика
Участок после выхода из программы
Это была моя настоящая проблема, на которую не мог найти удовлетворительный ответ, я хотел, чтобы график не закрывался после завершения сценария (например, MATLAB),
Если задуматься, то после завершения сценария программа завершается, и нет логического способа сохранить сюжет таким образом, поэтому есть два варианта
меня это не устроило, поэтому я нашел другое нестандартное решение
SaveToFile и просмотр во внешней программе просмотра
Для этого сохранение и просмотр должны быть быстрыми, а программа просмотра не должна блокировать файл и должна автоматически обновлять содержимое.
Выбор формата для сохранения
векторные форматы небольшие и быстрые
Быстрый легкий просмотрщик с обновлением в реальном времени
Для PDF есть несколько хороших вариантов
В Windows я использую SumatraPDF, который бесплатный, быстрый и легкий (в моем случае используется только 1,8 МБ ОЗУ)
В Linux есть несколько вариантов, таких как Evince (GNOME) и Ocular (KDE).
Образец кода и результаты
Пример кода для вывода графика в файл
после первого запуска откройте выходной файл в одной из упомянутых выше программ просмотра и наслаждайтесь.
Вот скриншот VSCode вместе с SumatraPDF, также процесс достаточно быстрый, чтобы получить частоту обновления в режиме полу-реального времени (я могу получить около 10 Гц на моей настройке, просто используйте
time.sleep()
между интервалами)источник
Ответ Игги был для меня самым простым, но я получил следующую ошибку при выполнении следующей
subplot
команды, которой не было, когда я просто выполнялshow
:Чтобы избежать этой ошибки, полезно закрыть (или очистить ) график после того, как пользователь нажмет Enter.
Вот код, который у меня сработал:
источник
Пакет Python drawow позволяет обновлять график в реальном времени без блокировки.
Он также работает с веб-камерой и OpenCV, например, для построения измерений для каждого кадра.
Смотрите исходный пост .
источник