Matplotlib python show() немедленно возвращается
У меня есть простой python script, который отображает некоторые графики на том же рисунке. Все графики создаются с помощью draw(), и в конце я вызываю функцию show() для блокировки.
script используется для работы с Python 2.6.6, Matplotlib 0.99.3 и Ubuntu 11.04. Пытался запустить его под Python 2.7.2, Matplotlib 1.0.1 и Ubuntu 11.10, но функция show() немедленно возвращается, не дожидаясь, чтобы убить фигуру.
Это ошибка? Или новая функция, и нам придется менять наши скрипты? Любые идеи?
РЕДАКТИРОВАТЬ:. Он держит график открытым в интерактивном режиме, т.е. python -i..., но он работал без этого и пытался использовать plt.ion() в script и запустить его в обычном режиме, но не повезло.
Ответы
Ответ 1
У меня была такая же проблема, и она была вызвана вызовом show()
объекта Figure вместо объекта pyplot.
Неверный код. Заставляет график мгновенно мигать на экране:
import matplotlib.pyplot as plt
x = [1,2,3]
y = [5,6,7]
fig = plt.figure()
plt.plot(x, y)
fig.show()
Последняя строка должна быть следующей, чтобы отобразить график до его отклонения:
plt.show()
Ответ 2
Я думаю, что использование show(block=True)
должно устранить вашу проблему.
Ответ 3
Имела обратная проблема, и кажется, что matplotlib будет работать в интерактивном или неинтерактивном режиме, основываясь на ряде вещей, которые я не мог отслеживать (один способ в IDLE, другой в системной консоли, один путь в обычной консоли spyder, другой в выделенном...)
Это сработало для меня:
import matplotlib
matplotlib.interactive(False)
(На самом деле мне нужен интерактивный режим, но в вашем случае обратный должен помочь.)
ion()
и ioff()
должны делать то же самое, но выше на уровне matplotlib, а не только на pyplot или pylab. Это работает для меня, хотя я (позже) импортирую pyplot отдельно и никогда не называю matplotlib как таковой снова. Я думаю, что plt.ion() влияет только на pyplot, а не на другие компоненты matplotlib, которые могут или не могут быть задействованы при использовании pyplot.
Этот метод работает для меня в Windows 7, используя оба Python 2.65 с matplotlib 0.99 и Python 2.75 с matplotlib 1.3.1, на всех доступных консолях python и IDE на обеих системах (64-разрядные, оба из них). Однако он не работал в Linux (SuSe 11.3, 64 бит), поэтому определенная зависимость от платформы здесь играет здесь.
Ответ 4
Чтобы воспроизвести поведение matplotlib.show() с бэкэндом tkagg при вызове show() на объекте Figure:
import Tkinter as Tk
import matplotlib.pyplot as plt
fig = plt.figure()
... your plot commands...
fig.show()
Tk.mainloop()