web-dev-qa-db-fra.com

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

Je veux tracer des données, dans deux sous-parcelles différentes. Après avoir tracé, je veux revenir à la première sous-parcelle et y tracer un jeu de données supplémentaire. Cependant, lorsque je le fais, je reçois cet avertissement:

MatplotlibDeprecationWarning: l'ajout d'un axe utilisant les mêmes arguments qu'un axe précédent réutilise actuellement l'instance précédente. Dans une version ultérieure, une nouvelle instance sera toujours créée et renvoyée. En attendant, cet avertissement peut être supprimé et le comportement futur assuré en transmettant une étiquette unique à chaque instance d'axes . warnings.warn (message, mplDeprecation, stacklevel = 1)

Je peux reproduire cela 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)

Des idées sur la façon d'éviter cet avertissement? J'utilise matplotlib 2.1.0. On dirait le même problème que ici

18
Nickj

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

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 courant que les noms de variables commencent par une lettre minuscule, par exemple en Pythonic data = ... plutôt que Data = ... voir PEP8

15
DavidG

Utiliser 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 ultérieure, lorsque vous l'appelez une seconde fois, la récupération de l'axe précédemment créé ne sera pas effectuée. Au lieu de cela, elle sera écrasée.

Vous pouvez enregistrer une référence à la première instance de l'axe en l'attribuant à 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)
4
James

Notez que dans ce cas, l'avertissement est un faux positif. Il ne devrait idéalement pas être déclenché si vous utilisez plt.subplot(..) pour réactiver une sous-parcelle créée précédemment. 

Cet avertissement se produit parce que plt.subplot et fig.add_subplot() acceptent le même chemin de code en interne. L'avertissement est destiné au dernier, mais pas le premier. 

Pour en savoir plus à ce sujet, voir numéros 12513 . En résumé, les gens y travaillent, mais il n’est pas aussi facile que prévu de dissocier les deux fonctions. Pour le moment, vous pouvez simplement ignorer l'avertissement s'il est déclenché par plt.subplot().

1

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

1
Hugh Perkins

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
0
Tommaso Di Noto