28 votes

Matplotlib: Ajout d'un axe en utilisant les mêmes arguments que les axes précédents

Je veux tracer des données, dans les deux parcelles. Après le traçage, je veux revenir à la première intrigue secondaire et de l'intrigue un dataset supplémentaire en elle. Cependant, quand je le fais, alors je me mets cet avertissement:

MatplotlibDeprecationWarning: Ajout d'un des axes avec les mêmes arguments que d'une précédente axes actuellement réutilise l'instance précédente. Dans une future version, une nouvelle instance sera toujours créé et retourné. Pendant ce temps, cette alarme peut être supprimée, et le comportement futur assuré, par le passage d'un label unique pour chaque axes instance. mises en garde.avertir(message, mplDeprecation, stacklevel=1)

Je peux reproduire qu'avec un simple morceau de code:

import matplotlib.pyplot as plt
import numpy as np

# Generate random data
data = np.random.rand(100)

# Plot in different subplots
plt.figure()
plt.subplot(1, 2, 1)
plt.plot(data)

plt.subplot(1, 2, 2)
plt.plot(data)

plt.subplot(1, 2, 1) # Warning occurs here
plt.plot(data + 1)

Toutes les idées sur la façon d'éviter cet avertissement? J'utilise matplotlib 2.1.0. Ressemble au même problème que voici

18voto

DavidG Points 10145

C'est un bon exemple qui montre l'avantage d'utiliser l' API orientée objet de matplotlib .

 import numpy as np
import matplotlib.pyplot as plt

# Generate random data
data = np.random.rand(100)

# Plot in different subplots
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot(data)

ax2.plot(data)

ax1.plot(data+1)

plt.show()
 

Remarque: il est plus pythonique que les noms de variables commencent par une lettre minuscule, par exemple data = ... plutôt que Data = ... voir PEP8

6voto

James Points 12337

L'utilisation de plt.subplot(1,2,1) crée un nouvel axe dans la figure actuelle. L'avertissement de dépréciation indique que dans une version future, lorsque vous l'appellerez une deuxième fois, il n'accroche pas l'axe créé précédemment, mais le remplace.

Vous pouvez enregistrer une référence à la première instance de l'axe en l'affectant à une variable.

 plt.figure()
# keep a reference to the first axis
ax1 = plt.subplot(1,2,1)
ax1.plot(Data)

# and a reference to the second axis
ax2 = plt.subplot(1,2,2)
ax2.plot(Data)

# reuse the first axis
ax1.plot(Data+1)
 

2voto

Hugh Perkins Points 1050

Vous pouvez simplement appeler plt.clf() avant de tracer les choses. Cela effacera toutes les parcelles existantes.

2voto

Notez que dans ce cas, l'avertissement est un faux positif. Idéalement, il devrait ne pas être déclenchée dans le cas où vous utilisez plt.subplot(..) de réactiver une intrigue secondaire qui a déjà été créé.

La raison de cet avertissement se produit, c'est que plt.subplot et fig.add_subplot() prendre le même chemin de code en interne. L'avertissement est destiné pour le dernier, mais pas le premier.

Pour en savoir plus, consultez les questions 12513. Longue histoire courte, les gens sont au travail, mais il n'est pas aussi facile que d'abord pensé à dissocier les deux fonctions. Pour le moment, vous pouvez seulement sans crainte ignorer l'avertissement, si elle est déclenchée par l' plt.subplot().

1voto

Tommaso Di Noto Points 114

J'ai eu le même problème. J'avais l'habitude d'avoir le code suivant qui a déclenché l'avertissement:

(notez que la variable Image est simplement mon image enregistrée en tant que tableau numpy)

 import numpy as np
import matplotlib.pyplot as plt

plt.figure(1)  # create new image
plt.title("My image")  # set title
# initialize empty subplot
AX = plt.subplot()  # THIS LINE RAISED THE WARNING
plt.imshow(Image, cmap='gist_gray')  # print image in grayscale
...  # then some other operations
 

et je l'ai résolu, en modifiant comme ceci:

 import numpy as np
import matplotlib.pyplot as plt

fig_1 = plt.figure(1)  # create new image and assign the variable "fig_1" to it
AX = fig_1.add_subplot(111)  # add subplot to "fig_1" and assign another name to it
AX.set_title("My image")  # set title
AX.imshow(Image, cmap='gist_gray')  # print image in grayscale
...  # then some other operations
 

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: