Как я могу показать цифры отдельно в matplotlib?
Скажем, что у меня две цифры в 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()
Ответы
Ответ 1
Конечно. Добавьте 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))
Ответ 2
С 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()
в начале вашего script (я видел, что это не удалось на некоторых платформах и бэкэнд).
Я не думаю, что Matplotlib предлагает механизм для создания фигуры и, необязательно, ее отображение; это означает, что будут отображаться все цифры, созданные с помощью figure()
. Если вам нужно только последовательно отображать отдельные цифры (либо в том же окне, либо нет), вы можете сделать это, как в приведенном выше коде.
Теперь указанное решение может быть достаточно в простых случаях и для некоторых баз данных Matplotlib. Некоторые серверы достаточно хороши, чтобы вы могли взаимодействовать с первой фигурой, даже если вы не вызывали show()
. Но, насколько я понимаю, они не должны быть хорошими. Самый надежный подход - запустить каждый рисунок чертежа в отдельном потоке с конечным show()
в каждом потоке. Я считаю, что это по существу то, что делает IPython.
Приведенный выше код должен быть достаточным в течение большей части времени.
PS: теперь, с Matplotlib версии 1.0.1+, show()
можно вызывать несколько раз (с большинством бэкэндов).
Ответ 3
Думаю, я немного опоздал на вечеринку, но... На мой взгляд, вам нужен объектно-ориентированный API matplotlib. В matplotlib 1.4.2 и использовании IPython 2.4.1 с бэкэндом Qt4Agg я могу сделать следующее:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1) # Creates figure fig and add an axes, ax.
fig2, ax2 = plt.subplots(1) # Another figure
ax.plot(range(20)) #Add a straight line to the axes of the first figure.
ax2.plot(range(100)) #Add a straight line to the axes of the first figure.
fig.show() #Only shows figure 1 and removes it from the "current" stack.
fig2.show() #Only shows figure 2 and removes it from the "current" stack.
plt.show() #Does not show anything, because there is nothing in the "current" stack.
fig.show() # Shows figure 1 again. You can show it as many times as you want.
В этом случае plt.show() показывает что-либо в "текущем" стеке. Вы можете указать figure.show() ТОЛЬКО если вы используете серверную часть GUI (например, Qt4Agg). В противном случае, я думаю, вам нужно будет по-настоящему копаться в кишках matplotlib, чтобы найти решение.
Помните, что большинство (все?) Функций plt. * Являются просто ярлыками и псевдонимами для методов фигур и осей. Они очень полезны для последовательного программирования, но вы найдете блокирующие стены очень скоро, если планируете использовать их более сложным способом.
Ответ 4
Возможно, вам нужно прочитать о интерактивном использовании Matplotlib. Однако, если вы собираетесь создавать приложение, вы должны использовать API и встраивать цифры в окна выбранного вами инструментария GUI ( см. examples/embedding_in_tk.py
и т.д.).
Ответ 5
Похоже, что ни одно из приведенных выше решений не работает в моем случае с matplotlib 3.1.0
и Python 3.7.3
. Либо обе цифры отображаются при вызове show()
либо ни одна из них не отображается в разных ответах, опубликованных выше.
Основываясь на @Ivan ответ, и принимая намек здесь, следующий, казалось, работает хорошо для меня:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1) # Creates figure fig and add an axes, ax.
fig2, ax2 = plt.subplots(1) # Another figure
ax.plot(range(20)) #Add a straight line to the axes of the first figure.
ax2.plot(range(100)) #Add a straight line to the axes of the first figure.
# plt.close(fig) # For not showing fig
plt.close(fig2) # For not showing fig2
plt.show()