Как показать две фигуры с помощью matplotlib?

81

У меня проблемы с одновременным рисованием двух фигур, которые не показаны на одном графике. Но согласно документации, я написал код и показывает только тот рисунок. Я думаю, что я потерял что-то важное. Может ли кто-нибудь помочь мне разобраться? Благодарю. (* Tlist_first *, используемый в коде, представляет собой список данных.)

plt.figure(1)
plt.hist(tlist_first, bins=2000000, normed = True, histtype ="step", cumulative = True, color = 'g',label = 'first answer')
plt.ylabel('Percentage of answered questions')
plt.xlabel('Minutes elapsed after questions are posted')

plt.axvline(x = 30, ymin = 0, ymax = 1, color = 'r', linestyle = '--', label = '30 min')
plt.axvline(x = 60, ymin = 0, ymax = 1, color = 'c', linestyle = '--', label = '1 hour')
plt.legend()
plt.xlim(0,120)
plt.ylim(0,1) 
plt.show()
plt.close() ### not working either with this line or without it

plt.figure(2)
plt.hist(tlist_first, bins=2000000, normed = True, histtype ="step", cumulative = True, color = 'g',label = 'first answer')

plt.ylabel('Percentage of answered questions')
plt.xlabel('Minutes elapsed after questions are posted')

plt.axvline(x = 240, ymin = 0, ymax = 1, color = 'r', linestyle = '--', label = '30 min')
plt.axvline(x = 1440, ymin = 0, ymax = 1, color = 'c', linestyle = '--', label = '1 hour')
plt.legend(loc= 4)
plt.xlim(0,2640)
plt.ylim(0,1)
plt.show()
AnneS
источник

Ответы:

91

В качестве альтернативы вызову plt.show()в конце скрипта вы также можете управлять каждой фигурой отдельно, выполнив:

f = plt.figure(1)
plt.hist........
............
f.show()

g = plt.figure(2)
plt.hist(........
................
g.show()

raw_input()

В этом случае вы должны позвонить, raw_inputчтобы фигурки остались живы. Таким образом вы можете динамически выбирать, какие цифры вы хотите показать.

Примечание: raw_input()был переименован input()в Python 3

Хоакин
источник
1
К сожалению, с python3.6 и последней версией matplotlib вызов нескольких fig.show (), похоже, ничего не показывает. Мне все еще нужно вызвать plt.show () в конце.
kakyo
1
@kakyo - Использование Python 3.6.6с Matplotlib 2.2.2(это была последняя версия на момент написания статьи); решение выше работает для меня. Ваша проблема должна быть связана с чем-то другим, например, с используемой серверной частью . Бегу matplotlib.get_backend(), получаю'Qt5Agg'
n1k31t4 04
Ко figure=gвторому тоже пришлось добавить plt.hist().
Майкл Литвин
мне нужны другие пакеты? NameError: name 'raw_input' is not defined
zheyuanWang
1
@zheyuanWang Если вы используете python 3, вы должны использовать input(). См. Последнее примечание в сообщении
Хоакин
61

Звонить следует plt.show()только в конце после создания всех сюжетов.

Яннеб
источник
8
Я нашел это довольно раздражающим, так как если я позвонил show()один раз, я не смогу позвонить снова, если я хочу снова показать сюжет, мне придется заново его воспроизвести?
Alcott
23

У меня была такая же проблема.


Сделал:

f1 = plt.figure(1)

# code for figure 1

# don't write 'plt.show()' here


f2 = plt.figure(2)

# code for figure 2

plt.show()


Пишите plt.show () только один раз после последней цифры. Работал у меня.

Нихил Ананд
источник
6
Это то же самое, что и ответ от janneb в 2011 году
n1k31t4
Это показывает его в одном окне, а не в двух отдельных окнах. Однако отвечает на вопрос OP. Проголосуйте поэтому.
Майк де Клерк
Но что делать, если вам нужен отдельный сюжет? это было построено по тому же сюжету
Nhoj_Gonk
8

В качестве альтернативы я бы посоветовал включить интерактив в начале, а в самом последнем сюжете - выключить. Все появятся, но не исчезнут, так как ваша программа останется, пока вы не закроете цифры.

import matplotlib.pyplot as plt
from matplotlib import interactive

plt.figure(1)
... code to make figure (1)

interactive(True)
plt.show()

plt.figure(2)
... code to make figure (2)

plt.show()

plt.figure(3)
... code to make figure (3)

interactive(False)
plt.show()
Том Моздзен
источник