web-dev-qa-db-fra.com

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

Je veux tracer des données, puis créer une nouvelle figure et tracer des données2, et enfin revenir au tracé initial et tracer des 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'en ai fini avec un complot? fait quelque chose de similaire, mais pas tout à fait! Cela ne me permet pas d'avoir accès à l'intrigue originale.

113
Peter D

Si vous vous trouvez régulièrement dans cette situation, il peut être intéressant d’examiner l’interface orientée objet de 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 verbeux, mais c'est beaucoup plus clair et facile à suivre, surtout avec plusieurs chiffres, chacun avec plusieurs intrigues secondaires.

135
simonb

Lorsque vous appelez figure, numérotez simplement le tracé.

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 parcelles comme vous le souhaitez (ici, à partir de 0) mais si vous ne fournissez pas de chiffre avec un nombre lors de la création, la numérotation automatique commencera à 1 ("Style Matlab" selon la documentation).

92
agf

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

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)

De plus, si vous avez plusieurs axes sur une figure, tels que des sous-graphes, utilisez la commande axes(h)h représente la poignée de l'objet d'axes souhaité sur lequel se focaliser.

(ne pas avoir les privilèges de commentaire pour le moment, désolé pour la nouvelle réponse!)

13
Ross B.

Après avoir eu des difficultés, j'ai trouvé un moyen de créer une fonction qui récupère la matrice data_plot, le nom du fichier et la commande pour créer des boîtes à moustaches à partir des données fournies dans la figure ordonnée (ordres différents = différentes figures) et les enregistre sous le nom de fichier indiqué.

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