Скажите, что у меня есть два числа в matplotlib с одним графиком на число:
import matplotlib.pyplot as plt
f1 = plt.figure()
plt.plot(range(0,10))
f2 = plt.figure()
plt.plot(range(10,20))
Тогда я показываю обоим в одном выстреле
plt.show()
Есть ли способ показать им отдельно, т.е. показать просто f1
?
Или лучше: как может я управлять числами отдельно как в следующем 'желательном' коде (который не работает):
f1 = plt.figure()
f1.plot(range(0,10))
f1.show()
Конечно. Добавьте Axes
, используя add_subplot
. (Изменено import
.) (Изменено show
.)
import matplotlib.pyplot as plt
f1 = plt.figure()
f2 = plt.figure()
ax1 = f1.add_subplot(111)
ax1.plot(range(0,10))
ax2 = f2.add_subplot(111)
ax2.plot(range(10,20))
plt.show()
В качестве альтернативы используйте add_axes
.
ax1 = f1.add_axes([0.1,0.1,0.8,0.8])
ax1.plot(range(0,10))
ax2 = f2.add_axes([0.1,0.1,0.8,0.8])
ax2.plot(range(10,20))
Возможно, вам нужно прочитать об интерактивном использовании Matplotlib . Однако, если вы собираетесь создать приложение, вы должны использовать API и встраивать рисунки в окна выбранного вами набора инструментов графического интерфейса (см. examples / embedding_in_tk.py
и т. Д. ).
В Matplotlib до версии 1.0.1, show()
должен вызываться только один раз в программе, даже если кажется, что это работает в определенных средах (некоторые бэкенды, на некоторых платформах и т.д.).
Соответствующей функцией рисования является draw()
:
import matplotlib.pyplot as plt
plt.plot(range(10)) # Creates the plot. No need to save the current figure.
plt.draw() # Draws, but does not block
raw_input() # This shows the first figure "separately" (by waiting for "enter").
plt.figure() # New window, if needed. No need to save it, as pyplot uses the concept of current figure
plt.plot(range(10, 20))
plt.draw()
# raw_input() # If you need to wait here too...
# (...)
# Only at the end of your program:
plt.show() # blocks
Важно понимать, что show()
- это бесконечный цикл, предназначенный для обработки событий в различных фигурах (изменение размера и т.д.). Обратите внимание, что в принципе вызовы draw()
необязательны, если вы вызовете matplotlib.ion()
в начале вашего сценария (я видел, что это не работает на некоторых платформах и бэкендах).
Я не думаю, что Matplotlib предлагает механизм для создания рисунка и его опционального отображения; это означает, что все рисунки, созданные с помощью figure()
, будут отображены. Если вам нужно только последовательно отобразить отдельные фигуры (либо в одном окне, либо нет), вы можете сделать так, как в приведенном выше коде.
Итак, приведенного выше решения может быть достаточно в простых случаях и для некоторых бэкендов Matplotlib. Некоторые бэкенды достаточно добры, чтобы позволить вам взаимодействовать с первым рисунком, даже если вы не вызывали show()
. Но, насколько я понимаю, они не обязаны быть хорошими. Наиболее надежным подходом будет запуск каждого рисунка фигуры в отдельном потоке, с финальным show()
в каждом потоке. Я полагаю, что по сути это то, что делает IPython.
Приведенного выше кода должно быть достаточно большую часть времени.
PS: теперь, с версией Matplotlib 1.0.1+, show()
может быть вызван несколько раз (с большинством бэкендов).