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.draw()
для всех участков, кроме последнего.
для вашего последнего сюжета используйте plt.show()
Это странно, но если вы не используете plt.show()
в последнем и попробуйте plt.draw()
вместо этого вы не видите никаких сюжетов.
удачи с этим!
у меня была эта проблема при использовании TkAgg в качестве бэкэнда. После использования plt.close('all')
мой компьютер завис.
решение состояло в том, чтобы переключиться на другой сервер. Теперь я вместо того, чтобы использовать Qt4Agg.
Если у вас Qt4Agg установлен можно переключать бэкэнды, набрав:
plt.switch_backend('Qt4Agg')
перед построением данных