Pyplot, un module pour dessiner des graphiques, est parfois pris en charge, mais je n'y étais pas habitué. J'ai enfin pu éliminer cette brume récemment, je vais donc la laisser comme une note de ma conscience.
Le premier est la sortie graphique de base.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-np.pi, np.pi)
y = np.sin(x)
fig = plt.figure()
plt.plot(x, y)
plt.title("y = sin(x)")
plt.xlabel("x")
plt.ylabel("y")
fig.savefig("output.png ")
Cela produit l'image comme ʻoutput.png`, mais personnellement, le comportement à ce moment ne m'est pas venu à l'esprit. Par exemple
plt
a été crééeplt
pour changer le titre du graphique, mais j'ai appelé la méthode fig
pour l'enregistrer en tant qu'image.
--La cible lors de l'accès avec plt
simplement en générant fig1
, fig2
, ... comme fig
change dans l'ordre comme fig1
, fig2
, ...(Au fait, je ne pensais pas que title ()
et xlabel ()
soient des méthodes de classe).
Personnellement, je suis habitué au flux de création d'instances → appel de méthode, donc je pense que j'aurais compris sans hésitation si la méthode était comme ci-dessous.
#Cela ne fonctionne pas correctement.
import matplotlib
import numpy as np
x = np.linspace(-np.pi, np.pi)
y = np.sin(x)
plt = matplotlib.pyplot() #Je veux que vous créiez une instance ici
plt.plot(x, y)
plt.title("y = sin(x)")
plt.xlabel("x")
plt.ylabel("y")
plt.figure.savefig("output.png ") #Je veux que ce soit une méthode de l'instance plt
Pourquoi réussit-il dans un premier temps? Et pourquoi cela ne fonctionne-t-il pas comme je l'avais imaginé?
Découvrez qui est chacun des éléments du premier script de travail (omettez la partie numpy).
matplotlib
--Bibliothèque pour dessiner des graphiquespyplot
--Modules dans la bibliothèque matplotlib
--ʻImport Importer et utiliser avec matplotlib.pyplot` etc.plt
--Alias pour matplotlib.pyplot
(donc le type est module)fig
--Une instance de la classe matplotlib.figure.Figure
--Généré par fig = pyplot.figure ()
L'important est que ** plt
soit un module **, pas une classe. Si plt
était une classe, j'aimerais que vous créiez une instance quelque part, mais comme c'était un module, il a déjà été créé lorsque vous l'avez importé sur la deuxième ligne, donc tout à coup fig = plt.figure () ʻand
Cela a bien fonctionné avec plt.plot (x, y) . C'est aussi une spéculation, mais il semble que d'autres questions peuvent être convaincues si vous pensez que la destination d'accès est mise à jour dans
plt lorsque l'instance
fig` est créée.
Désormais, en python, les modules sont créés en tant que singletons, ils font donc référence à des objets avec le même identifiant, peu importe où ils sont appelés. Par conséquent, si vous appelez pyplot
ailleurs, vous pourrez toujours accéder aux graphiques que vous avez déjà créés.
Par exemple, supposons que les deux fichiers suivants se trouvent dans le même répertoire:
graph.py
import matplotlib.pyplot as plt
import numpy as np
def edit_graph():
x = np.linspace(-np.pi, np.pi)
y = np.sin(x)
plt.plot(x, y)
plt.title("y = sin(x)")
plt.xlabel("x")
plt.ylabel("y")
main.py
import matplotlib.pyplot as plt_main
import graph
graph.edit_graph()
plt_main.show()
Si vous exécutez python main.py
dans cet état, le même graphe sinusoïdal qu'avant sera affiché. En d'autres termes, il est possible de sortir un graphique généré / édité dans un fichier de script dans un autre fichier de script sans créer / transmettre une instance (bien que cela ne soit pas recommandé par conception).
Vous pouvez également appeler la méthode savefig ()
dans la classe matplotlib.figure.Figure
après avoir exécuté fig = pyplot.figure ()
.
La raison principale de cette question était que j'avais mal compris «plt» comme une sorte de classe ou d'instance. Je ne sais pas pourquoi je le pensais maintenant ... Ce n'est pas un gros problème si vous réalisez que plt
est un module, mais je pense qu'il sera mieux compris si vous y réfléchissez à nouveau. ..
Enfin, un résumé de ce que j'ai remarqué cette fois.
--pyplot
est un module et est généralement utilisé avec un nom comme plt
.
pyplot
lui-même se comporte comme une classe ou son instancefig = pyplot.figure ()
, une instance fig
de la classe matplotlib.figure.Figure
est créée, et chaque fois que vous l'exécutez, la cible d'accès par le module pyplot
change.Recommended Posts