Подтвердить что ты не робот

Как я могу показать цифры отдельно в 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()
4b9b3361

Ответ 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()