Как я могу показать числам отдельно в 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()
46
задан Steve Tjoa 7 March 2010 в 11:08
поделиться

3 ответа

Конечно. Добавьте 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))
40
ответ дан 7 November 2019 в 14:16
поделиться

Возможно, вам нужно прочитать об интерактивном использовании Matplotlib . Однако, если вы собираетесь создать приложение, вы должны использовать API и встраивать рисунки в окна выбранного вами набора инструментов графического интерфейса (см. examples / embedding_in_tk.py и т. Д. ).

2
ответ дан 7 November 2019 в 14:16
поделиться

В 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() может быть вызван несколько раз (с большинством бэкендов).

25
ответ дан 7 November 2019 в 14:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: