web-dev-qa-db-fra.com

Comment afficher séparément les chiffres dans matplotlib?

Disons que j'ai deux chiffres dans matplotlib, avec un graphique par chiffre:

import matplotlib.pyplot as plt

f1 = plt.figure()
plt.plot(range(0,10))
f2 = plt.figure()
plt.plot(range(10,20))

Ensuite, je montre les deux en un seul coup

plt.show()

Existe-t-il un moyen de les montrer séparément, c'est-à-dire de montrer simplement f1?

Ou mieux: comment puis-je gérer les chiffres séparément comme dans le code 'wishful' suivant (qui ne fonctionne pas):

f1 = plt.figure()
f1.plot(range(0,10))
f1.show()
44

Sûr. Ajoutez un Axes à l'aide de add_subplot. (Modifié import.) (Modifié 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()

Vous pouvez également utiliser 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))
39
Steve Tjoa

Avec Matplotlib antérieur à la version 1.0.1, show()ne devrait être appelé qu'une seule fois par programme , même s'il semble fonctionner dans certains environnements (certains backends, sur certaines plateformes, etc.) ).

La fonction de dessin appropriée est en fait 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

Il est important de reconnaître que show() est une boucle infinie, conçue pour gérer les événements dans les différentes figures (redimensionnement, etc.). Notez qu'en principe, les appels à draw() sont facultatifs si vous appelez matplotlib.ion() au début de votre script (j'ai cependant vu cela échouer sur certaines plateformes et backends).

Je ne pense pas que Matplotlib offre un mécanisme pour créer une figure et éventuellement l'afficher; cela signifie que toutes les figures créées avec figure() seront affichées. Si vous avez seulement besoin d'afficher séquentiellement des figures distinctes (dans la même fenêtre ou non), vous pouvez faire comme dans le code ci-dessus.

Maintenant, la solution ci-dessus peut être suffisante dans des cas simples et pour certains backends Matplotlib. Certains backends sont assez agréables pour vous permettre d'interagir avec la première figure même si vous n'avez pas appelé show(). Mais, pour autant que je comprends, ils ne doivent pas nécessairement être Nice. L'approche la plus robuste serait de lancer chaque dessin de figure dans un thread séparé, avec une show() finale dans chaque thread. Je crois que c'est essentiellement ce que fait IPython .

Le code ci-dessus devrait être suffisant la plupart du temps.

[~ # ~] ps [~ # ~] : maintenant, avec Matplotlib version 1.0.1+, show() peut être appelé plusieurs fois (avec la plupart des backends).

25
Eric O Lebigot

Je pense que je suis un peu en retard à la fête mais ... À mon avis, ce dont vous avez besoin est l'API orientée objet de matplotlib. Dans matplotlib 1.4.2 et en utilisant IPython 2.4.1 avec le backend Qt4Agg, je peux faire ce qui suit:

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.

Dans ce cas, plt.show () montre quoi que ce soit dans la pile "courante". Vous pouvez spécifier figure.show () UNIQUEMENT si vous utilisez un backend GUI (par exemple Qt4Agg). Sinon, je pense que vous devrez vraiment creuser dans les tripes de matplotlib pour monkeypatch une solution.

N'oubliez pas que la plupart (toutes?) Des fonctions plt. * Ne sont que des raccourcis et des alias pour les méthodes de figure et d'axes. Ils sont très utiles pour la programmation séquentielle, mais vous trouverez très bientôt des murs de blocage si vous prévoyez de les utiliser de manière plus complexe.

6

Peut-être avez-vous besoin de lire tilisation interactive de Matplotlib . Cependant, si vous allez créer une application, vous devez utiliser API et incorporer les chiffres dans les fenêtres de la boîte à outils GUI que vous avez choisie (voir examples/embedding_in_tk.py, etc).

2

Aucune des solutions ci-dessus ne semble fonctionner dans mon cas, avec matplotlib 3.1.0 Et Python 3.7.3. Soit les deux chiffres apparaissent lors de l'appel de show(), soit aucun n'apparaît dans les différentes réponses publiées ci-dessus.

En s'appuyant sur la réponse de @ Ivan et en prenant un indice de ici , les éléments suivants semblaient bien fonctionner pour moi:

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