Comment dire à Matplotlib de créer un deuxième (nouveau) tracé, puis un tracé ultérieur sur l'ancien?

147

Je veux tracer des données, puis créer une nouvelle figure et tracer des données2, et enfin revenir au tracé d'origine et tracer les données3, un peu comme ceci:

import numpy as np
import matplotlib as plt

x = arange(5)
y = np.exp(5)
plt.figure()
plt.plot(x, y)

z = np.sin(x)
plt.figure()
plt.plot(x, z)

w = np.cos(x)
plt.figure("""first figure""") # Here's the part I need
plt.plot(x, w)

FYI Comment puis-je dire à matplotlib que j'ai fini avec un complot? fait quelque chose de similaire, mais pas tout à fait! Cela ne me permet pas d'accéder à cette intrigue originale.

Peter D
la source

Réponses:

152

Si vous vous retrouvez à faire des choses comme ça régulièrement, il peut être intéressant d'étudier l'interface orientée objet vers matplotlib. Dans ton cas:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y = np.exp(x)
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_title("Axis 1 title")
ax1.set_xlabel("X-label for axis 1")

z = np.sin(x)
fig2, (ax2, ax3) = plt.subplots(nrows=2, ncols=1) # two axes on figure
ax2.plot(x, z)
ax3.plot(x, -z)

w = np.cos(x)
ax1.plot(x, w) # can continue plotting on the first axis

C'est un peu plus détaillé mais c'est beaucoup plus clair et plus facile à suivre, surtout avec plusieurs figures chacune avec plusieurs sous-graphiques.

Simonb
la source
2
Je préfère l'approche orientée objet car lorsque j'anticipe avoir de nombreux chiffres, il sera plus facile de les suivre en utilisant des noms plutôt que des nombres. Merci!
Peter D
1
Mais comment changer l'étiquette et les limites de l'axe avec cette approche. Si je l'utilise, ax1.ylabelcela dit qu'il ne se trouve pas. Idem avec fig1.ylabel...
George Datseris
3
@GeorgeDatseris La syntaxe est un peu différente. Il est ax1.set_xlabel("your x label"), ax1.set_ylabel("your y label")et ax1.set_title("your title").
simonb
1
pourquoi avez-vous utilisé 111?
Yash Sodha
2
@yashSodha - c'est une spécification de style matlab du nombre de sous-graphiques (lignes, col, index). Mais c'est beaucoup plus facile à utiliser maintenant plt.subplots(nrows, ncols). Ont mis à jour l'exemple.
simonb
120

Lorsque vous appelez figure, numérotez simplement l'intrigue.

x = arange(5)
y = np.exp(5)
plt.figure(0)
plt.plot(x, y)

z = np.sin(x)
plt.figure(1)
plt.plot(x, z)

w = np.cos(x)
plt.figure(0) # Here's the part I need
plt.plot(x, w)

Edit: Notez que vous pouvez numéroter les tracés comme vous le souhaitez (ici, à partir de 0) mais si vous ne fournissez pas du tout un chiffre lorsque vous en créez un nouveau, la numérotation automatique commencera à 1("Matlab Style" selon aux docs).

agf
la source
3
Cela semble fonctionner dans le mode interactif de matplotlib, contrairement à la méthode figure () ... add_subplot (). Merci!
chbrown
@SebMa Veuillez ne pas modifier le code sans le comprendre. Cette réponse concernait spécifiquement la transmission d'un numéro à figure, que vous avez supprimé. Les autres choses que vous avez modifiées ont été copiées à partir du message d'origine et non des erreurs dans ma réponse.
agf
@agf Salut, j'ai enlevé l' 1intérieur plt.figure(1)parce que je pensais que le nombre était automatiquement incrémenté et donc pas nécessaire. Désolé.
SebMa
18

Cependant, la numérotation commence à 1, donc:

x = arange(5)
y = np.exp(5)
plt.figure(1)
plt.plot(x, y)

z = np.sin(x)
plt.figure(2)
plt.plot(x, z)

w = np.cos(x)
plt.figure(1) # Here's the part I need, but numbering starts at 1!
plt.plot(x, w)

En outre, si vous avez plusieurs axes sur une figure, tels que des sous-tracés, utilisez la axes(h)commande où se htrouve la poignée de l'objet axes souhaité pour se concentrer sur ces axes.

(Je n'ai pas encore de privilèges de commentaire, désolé pour une nouvelle réponse!)

Ross B.
la source
10
0fonctionne, la numérotation automatique commence à 1, si vous ne lui donnez pas du tout un numéro.
agf
0

Une façon que j'ai trouvée après quelques difficultés consiste à créer une fonction qui obtient la matrice data_plot, le nom de fichier et l'ordre en tant que paramètre pour créer des boîtes à moustaches à partir des données données dans la figure ordonnée (ordres différents = chiffres différents) et l'enregistrer sous le nom de fichier donné.

def plotFigure(data_plot,file_name,order):
    fig = plt.figure(order, figsize=(9, 6))
    ax = fig.add_subplot(111)
    bp = ax.boxplot(data_plot)
    fig.savefig(file_name, bbox_inches='tight')
    plt.close()
émir
la source