[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot

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.

Où je n'ai pas compris personnellement

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

output.png

Cela produit l'image comme ʻoutput.png`, mais personnellement, le comportement à ce moment ne m'est pas venu à l'esprit. Par exemple

(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é?

Qu'est-ce qui se passe vraiment

Découvrez qui est chacun des éléments du premier script de travail (omettez la partie numpy).

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.

prime

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

Résumé

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.

Recommended Posts

[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot
Note Python: Le mystère de l'attribution d'une variable à une variable
[Python] Un programme qui fait pivoter le contenu de la liste vers la gauche
Écrire une note sur la version python de python virtualenv
[Python] Un programme qui calcule le nombre de chaussettes jumelées
[Python] Note: Fonction auto-conçue pour trouver la zone de distribution normale
[Python] Un programme qui compte le nombre de vallées
Un mémo pour comprendre visuellement l'axe des pandas.
14 quiz pour comprendre la portée étonnamment compliquée de Python
[Python] Un programme qui compare les positions des kangourous.
Remarque sur le comportement par défaut de collate_fn dans PyTorch
Facilitez la compréhension de l'affichage des exceptions du module Python
[Note] Importation de fichiers dans le répertoire parent en Python
[Python3] Liste des sites auxquels j'ai fait référence lorsque j'ai lancé Python
Script Python qui compare le contenu de deux répertoires
[Python] Programmation pour trouver le nombre de a dans une chaîne de caractères qui se répète un nombre spécifié de fois.
Script Python qui peut vérifier l'état du serveur à partir du navigateur
[Python] Un programme pour trouver le nombre de pommes et d'oranges qui peuvent être récoltées
L'histoire selon laquelle la version de python 3.7.7 n'était pas adaptée à Heroku
Comment déterminer l'existence d'un élément sélénium en Python
Comment vérifier la taille de la mémoire d'une variable en Python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Une fonction qui mesure le temps de traitement d'une méthode en python
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
Un script qui renvoie 0, 1 attaché au premier Python prime
L'histoire de la création d'un module qui ignore le courrier avec python
[Python] Une fonction simple pour trouver les coordonnées du centre d'un cercle
Vérifiez le comportement du destroyer en Python
[Python3] Comprendre les bases de Beautiful Soup
[python] [meta] Le type de python est-il un type?
L'histoire du traitement A du blackjack (python)
Note Python: le rôle secret de Kamma
[Python] Un programme qui arrondit le score
[Python3] Comprendre les bases des opérations sur les fichiers
Je suis abasourdi par le comportement de filter () en raison des différentes versions de Python
Remarque Python: lorsque vous souhaitez connaître les attributs d'un objet
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
Comment créer un wrapper qui préserve la signature de la fonction à envelopper
Une note sur les fonctions de la bibliothèque Linux standard qui gère le temps
Code Python pour déterminer les signaux mensuels pour les investissements de force relative
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
D'un livre qui apprend de manière intéressante la façon de penser du programmeur (Python)
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
Notez que je comprends l'algorithme du classificateur Naive Bayes. Et je l'ai écrit en Python.
Comment calculer la volatilité d'une marque
[Note] Exportez le html du site avec python.
Récupérer l'appelant d'une fonction en Python
Remarque Python: lors de l'attribution d'une valeur à une chaîne
[Note] À propos du rôle du trait de soulignement "_" en Python
Sortie sous la forme d'un tableau python
amateur python tente de résumer la liste ②
Prise en compte des forces et faiblesses de Python
[Python] Lancer un message sur le canal Slack
Zubu amateur veut démarrer Python