208 votes

Comment dire à Matplotlib de créer un deuxième (nouveau) tracé, puis de tracer plus tard 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é d'origine 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)

Pour info, comment 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'accéder à cette intrigue originale.

191voto

simonb Points 677

Si vous vous retrouvez à faire des choses comme ça régulièrement, cela peut valoir la peine d'étudier 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 détaillé mais c'est beaucoup plus clair et plus facile à suivre, surtout avec plusieurs figures avec chacune plusieurs sous-intrigues.

182voto

agf Points 45052

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 tracés comme vous le souhaitez (ici, à partir de 0 ) mais si vous ne fournissez pas du tout de chiffre lorsque vous en créez un nouveau, la numérotation automatique commencera à 1 ("Matlab Style" d'après la doc).

25voto

Ross B. Points 182

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)

De plus, si vous avez plusieurs axes sur une figure, tels que des sous-parcelles, utilisez la commande axes(h)h est 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 la nouvelle réponse !)

3voto

Amirkhm Points 96

Un moyen simple de tracer une image distincte pour chaque itération pourrait être :

 import matplotlib.pyplot as plt  
for grp in list_groups:
        plt.figure()
        plt.plot(grp)
        plt.show()

Ensuite, python tracera différentes images.

1voto

emir Points 91

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

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