После этих инструкций в интерпретаторе Python открывается окно с графиком:
from matplotlib.pyplot import *
plot([1,2,3])
show()
# other code
К сожалению, я не знаю, как продолжать интерактивно исследовать фигуру, созданную в show()
то время, когда программа выполняет дальнейшие вычисления.
Это вообще возможно? Иногда расчеты длинные, и было бы полезно, если бы они продолжались во время проверки промежуточных результатов.
python
matplotlib
plot
meteore
источник
источник
ion()
устраняет проблему.os.fork()
но имейте в виду, что использованиеos.fork()
может быть сложным, потому что вы создаете новый процесс путем копирования старого процесса.Ответы:
использование
matplotlib
звонки, которые не будут блокировать:Использование
draw()
:Использование интерактивного режима:
источник
draw()
у меня не работает, не открывается ни одно окно Однако использованиеshow(block=False)
вместо,draw()
кажется, делает трюк в Matplotlib 1.1.draw()
у меня тоже не сработало, толькоpause(0.001)
Используйте ключевое слово «блок», чтобы переопределить поведение блокировки, например
продолжить ваш код.
источник
Лучше всегда проверять библиотеку, которую вы используете, поддерживает ли она неблокирующее использование .
Но если вам нужно более общее решение, или если нет другого пути, вы можете запустить все, что блокирует отдельный процесс, используя
multprocessing
модуль, включенный в python. Вычисление будет продолжено:То есть накладные расходы на запуск нового процесса, а иногда труднее отлаживать на сложных сценариях, так что я предпочел бы другое решение ( с помощью
matplotlib
«s неблокирующих вызовов API )источник
if __name__ == '__main__':
?Пытаться
show()
Документация говорит:источник
ВАЖНО : Просто чтобы прояснить что-то. Я предполагаю, что команды находятся внутри
.py
скрипта и скрипт вызывается с помощью, например,python script.py
из консоли.Простой способ, который работает для меня:
Пример
script.py
файла:источник
Вы можете прочитать этот документ в
matplotlib
документации под названием:Использование matplotlib в оболочке Python
источник
В моем случае я хотел, чтобы несколько окон всплыли во время их вычисления. Для справки это так:
PS. Очень полезное руководство по OO-интерфейсу matplotlib .
источник
Ну, у меня были большие проблемы с выяснением неблокирующих команд ... Но, наконец, мне удалось переработать пример " Cookbook / Matplotlib / Animations - Animating selected plot elements ", чтобы он работал с потоками ( и передавал данные между потоками либо через глобальные переменные или через многопроцессорный
Pipe
) на Python 2.6.5 на Ubuntu 10.04.Сценарий можно найти здесь: Animating_selected_plot_elements-thread.py - в противном случае вставьте ниже ( с меньшим количеством комментариев ) для справки:
Надеюсь, это поможет кому-то,
ура!
источник
Во многих случаях удобнее сохранить изображение в виде файла .png на жестком диске. Вот почему:
Преимущества:
недостаток:
источник
Если вы работаете в консоли, то есть
IPython
вы можете использовать,plt.show(block=False)
как указано в других ответах. Но если вы ленивы, вы можете просто набрать:Который будет таким же.
источник
Мне также пришлось добавить
plt.pause(0.001)
в свой код, чтобы он действительно работал внутри цикла for (иначе он будет показывать только первый и последний график):источник
В моей системе show () не блокируется, хотя я хотел, чтобы скрипт ждал, пока пользователь не будет взаимодействовать с графиком (и собирает данные с помощью обратных вызовов 'pick_event'), прежде чем продолжить.
Чтобы заблокировать выполнение до закрытия окна графика, я использовал следующее:
Однако обратите внимание, что canvas.start_event_loop_default () выдает следующее предупреждение:
хотя сценарий все еще выполняется.
источник
Я также хотел, чтобы мои графики отображали выполнение остальной части кода (а затем продолжали отображать), даже если есть ошибка (я иногда использую графики для отладки). Я закодировал этот маленький хак, чтобы любые графики внутри этого
with
утверждения вели себя как таковые.Это, вероятно, слишком нестандартно и не рекомендуется для производственного кода. В этом коде, вероятно, много скрытых ошибок.
Если / когда я реализую правильное «держать графики открытыми (даже если возникает ошибка) и разрешать показ новых графиков», я бы хотел, чтобы скрипт корректно завершился, если никакое вмешательство пользователя не говорит об этом иначе (для целей пакетного выполнения).
Я могу использовать что-то вроде вопроса об истечении времени ожидания «Конец сценария! \ NНажмите p, если вы хотите приостановить вывод печати (у вас есть 5 секунд):» по адресу /programming/26704840/corner -cases-for-my-wait-for-user-прерывание-ввода-реализации .
источник
источник
ОП спрашивает об отстранении
matplotlib
участков. Большинство ответов предполагают выполнение команды из интерпретатора Python. Вариант использования, представленный здесь, является моим предпочтением для тестирования кода в терминале (например, bash), гдеfile.py
запускается a, и вы хотите, чтобы график (ы) появлялся, а скрипт python завершался и возвращался в командную строку.Этот автономный файл используется
multiprocessing
для запуска отдельного процесса отображения данных с помощьюmatplotlib
. Основной поток выходит с использованиемos._exit(1)
упомянутого в этом посте. Вos._exit()
силах основные для выхода , но оставляетmatplotlib
процесс ребенка живой и отзывчивой , пока окно участка не будет закрыто. Это отдельный процесс полностью.Этот подход немного похож на сеанс разработки Matlab с графическими окнами, которые предлагают отзывчивую командную строку. При таком подходе вы потеряли все контакты с процессом окна рисунка, но это нормально для разработки и отладки. Просто закройте окно и продолжайте тестирование.
multiprocessing
предназначен для выполнения кода только на Python, что делает его, возможно, лучше, чемsubprocess
.multiprocessing
является кроссплатформенным, так что это должно хорошо работать в Windows или Mac без каких-либо настроек. Нет необходимости проверять основную операционную систему. Это было проверено на Linux, Ubuntu 18.04LTS.Запуск
file.py
вызывает окно фигуры, затем__main__
выходит, ноmultiprocessing
matplotlib
окно с рисунком + реагирует на кнопки масштабирования, панорамирования и других операций, потому что это независимый процесс.Проверьте процессы в командной строке bash:
ps ax|grep -v grep |grep file.py
источник
.daemon=False
описанного здесь stackoverflow.com/a/49607287/1476932 Однако,sys.exit()
родительский процесс не был завершен, как описано там, пока я не закрыл дочернее окно. С другой стороны, использованиеos._exit(0)
из приведенного выше примера сработало.На мой взгляд, ответы в этой теме предоставляют методы, которые не работают для каждой системы и в более сложных ситуациях, таких как анимация. Я предлагаю взглянуть на ответ MiKTeX в следующей ветке, где был найден надежный метод: как дождаться окончания анимации matplotlib?
источник
Если вы хотите открыть несколько фигур, оставив их открытыми, этот код работает для меня:
источник
Не отвечая непосредственно на запрос OPs, я публикую этот обходной путь, поскольку он может помочь кому-то в этой ситуации:
Для этого я использую:
Где «var» определяет график в цикле, поэтому он не будет перезаписан.
источник
Используйте
plt.show(block=False)
и в конце вашего скрипта вызоваplt.show()
.Это гарантирует, что окно не будет закрыто после завершения скрипта.
источник