Python Matplotlib зависает, когда его просят построить второй график (после закрытия первого окна графика)

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

Я Запускаю следующий код для создания очень простого окна графика с помощью 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 и / или matplotlib не хотят, чтобы я закрывал окно вручную. Кто-нибудь знает, что происходит и что я должна делать? То, что я хотел бы сделать, - это поиграть с разными сюжетами из интерпретатора, и, очевидно, это поведение не помогает. Я знаю, что мог бы использовать "Ipython-pylab", но в интересах обучения я хочу понять вышеуказанную ошибку.

спасибо.

6 ответов


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


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

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

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


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

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

easy_install ipython

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

ipython -pylab

In[1]: ...

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


ты:

plt.close()

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


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

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

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

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

удачи с этим!


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

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

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

plt.switch_backend('Qt4Agg')

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