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