Python Matplotlib зависает, когда его просят построить второй график (после закрытия первого окна графика) - PullRequest
9 голосов
/ 02 августа 2009

Странное поведение, я уверен, что это я облажался, но я бы хотел докопаться до сути происходящего:

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

>>> import matplotlib.pyplot as plt
>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> ax.plot((1, 3, 1))
[<matplotlib.lines.Line2D object at 0x0290B750>]
>>> plt.show()

и, как и ожидалось, я получаю график, который можно ожидать, в новом всплывающем окне, содержащем очень простую синюю линию, идущую от 1 до 3 обратно к 1 снова по оси y, с 0, 1, 2 в качестве Точки оси X (как в примере). Теперь я закрываю окно графика (используя крестик в правом верхнем углу под окнами). Это дает мне контроль над переводчиком, и я начинаю снова, создавая новые объекты:

>>>
>>> fig1 = plt.figure()
>>> bx = fig1.add_subplot(111)
>>> bx.plot((1, 3, 1))
[<matplotlib.lines.Line2D object at 0x029E8210>]
>>> plt.show()

На этот раз я получаю оконную раму, в которой ничего нет (только рама, нет белого фона), и висит целый выстрел. Мне нужно «завершить задачу», интерпретатор python завершается системой, и я получаю командную строку обратно. Подобное поведение на Mac (за исключением того, что он на самом деле сначала строит график, прежде чем также повесить).

Так что каким-то образом Python и / или matplotlib не хотят, чтобы я закрывал окно вручную. Кто-нибудь знает, что происходит и что я должен делать? То, что я хотел бы сделать, это поиграть с разными сюжетами внутри переводчика, и, очевидно, это поведение не помогает. Я знаю, что могу использовать «Ipython -pylab», но в интересах обучения я хочу понять вышеуказанную ошибку.

Спасибо.

Ответы [ 6 ]

8 голосов
/ 24 ноября 2009

Три месяца с опозданием на вечеринку, но я нашел предложение в документации по matlibplot использовать draw () вместо show (); первый, по-видимому, просто выполняет рендеринг текущего графика, в то время как последний запускает все интерактивные инструменты, и именно здесь начинаются проблемы.

Это не очень заметно в документации, но вот ссылка: http://matplotlib.sourceforge.net/faq/howto_faq.html#use-show

Что бы это ни стоило, я попробовал pylab.show (), и у меня возникла точно такая же проблема, как и у вас, в то время как pylab.draw (), кажется, работает нормально, если я просто хочу увидеть вывод.

2 голосов
/ 09 августа 2009

Очевидно, это вызвано ошибкой в ​​бэкенде tkinter. См., Например, https://bugs.launchpad.net/ubuntu/+source/matplotlib/+bug/313834. Это работает над ... Если вы можете вернуться к немного более старой библиотеке tkinter, то это должно стать временным решением (я столкнулся с тем же самым пару недель назад, и это была моя единственная надежда).

2 голосов
/ 03 августа 2009

Вы пытались использовать ipython вместо стандартного интерпретатора python?

Вы можете установить ipython с помощью следующей команды:

easy_install ipython

и затем, ipython имеет специальный режим для запуска с pylab, называемый -pylab:

ipython -pylab

In[1]: ...

Я думаю, что большинство людей используют это решение для построения графиков с помощью Python, это командная строка, аналогичная R / Matlab, Завершение и т. Д., И она запускает отдельный поток для каждого графика, поэтому не должно быть проблемы, которую вы описали.

0 голосов
/ 05 сентября 2016

У меня была эта проблема при использовании TkAgg в качестве бэкэнда. После использования plt.close('all') мой компьютер завис.

Решением было переключиться на другой бэкэнд. Теперь я использую Qt4Agg вместо этого.

Если у вас установлен Qt4Agg , можно переключить бэкэнд, набрав:

plt.switch_backend('Qt4Agg')

перед построением данных

0 голосов
/ 13 декабря 2009

Как написано где-то выше:

Используйте plt.draw() для всех ваших графиков, кроме последнего.

Для вашего последнего сюжета используйте plt.show()

Это странно, но если вы не используете plt.show() в последнем и попробуйте plt.draw() вместо этого, вы не увидите никаких графиков.

Удачи с этим!

0 голосов
/ 02 августа 2009

вы пробовали:

plt.close()

чтобы убедиться, что вы закрыли объект сюжета?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...