86 votes

Comment montrer deux figures en utilisant matplotlib ?

J'ai quelques problèmes lorsque je dessine deux figures en même temps, qui ne sont pas affichées dans un seul graphique. Mais selon la documentation, j'ai écrit le code et seule la première figure s'affiche. Je pense que j'ai peut-être perdu quelque chose d'important. Quelqu'un peut-il m'aider à comprendre ? Merci. (Le *tlist_first* utilisé dans le code est une liste de données).

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()

97voto

joaquin Points 22450

Au lieu d'appeler plt.show() à la fin du script, vous pouvez également contrôler chaque figure séparément en faisant :

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

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

raw_input()

Dans ce cas, vous devez appeler raw_input pour maintenir les chiffres en vie. De cette façon, vous pouvez sélectionner de manière dynamique les chiffres que vous souhaitez afficher.

Note : raw_input() a été renommé en input() dans Python 3

1 votes

Malheureusement, avec python3.6 et la dernière version de matplotlib, l'appel de plusieurs fig.show() semble ne rien montrer. Je dois toujours appeler plt.show() à la fin.

1 votes

@kakyo - Utilisation de Python 3.6.6 avec Matplotlib 2.2.2 (qui était la dernière version au moment de votre rédaction) ; la solution ci-dessus fonctionne pour moi. Votre problème doit provenir de quelque chose d'autre, par exemple le fichier backend utilisé. Exécution matplotlib.get_backend() j'obtiens 'Qt5Agg'

0 votes

J'ai également dû ajouter figure=g au deuxième plt.hist() .

63voto

janneb Points 17303

Vous devez appeler plt.show() seulement à la fin, après avoir créé toutes les parcelles.

10 votes

Je trouvais cela assez ennuyeux, car si j'appelais show() une fois, je ne peux pas l'appeler à nouveau, si je veux montrer le graphique à nouveau, je dois le redessiner à nouveau ?

0 votes

Je pense qu'il est raisonnable d'avoir la fonctionnalité d'afficher le tracé chaque fois que je l'appelle.

33voto

Nikhil Anand Points 366

J'ai eu le même problème.

Je l'ai fait :

f1 = plt.figure(1)

# code for figure 1

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

f2 = plt.figure(2)

# code for figure 2

plt.show()

Écrire 'plt.show()' une seule fois, après la dernière figure. Cela a marché pour moi.

7 votes

C'est la même chose que la réponse de janneb en 2011

0 votes

Cela le montre dans la même fenêtre, et non dans deux fenêtres distinctes. Cela répond à la question de l'OP. Upvote donc.

0 votes

Mais que se passe-t-il si vous voulez une parcelle séparée ? Elle a été tracée sur la même parcelle.

9voto

Tom Mozdzen Points 244

Sinon, je vous suggère d'activer l'interactivité au début et de la désactiver à la toute dernière parcelle. Toutes les figures apparaîtront, mais elles ne disparaîtront pas car votre programme restera en place jusqu'à ce que vous fermiez les figures.

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()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X