web-dev-qa-db-fra.com

Quelle est la différence entre dessiner des tracés en utilisant un tracé, des axes ou une figure dans matplotlib?

Je suis un peu confus quant à ce qui se passe à l'arrière-plan lorsque je dessine des parcelles dans matplotlib, tbh, je ne comprends pas bien la hiérarchie des parcelles, des axes et des figures. J'ai lu la documentation et c'était utile mais je suis toujours confus ...

Le code ci-dessous dessine la même parcelle de trois manières différentes -

#creating the arrays for testing
x = np.arange(1, 100)
y = np.sqrt(x)
#1st way
plt.plot(x, y)
#2nd way
ax = plt.subplot()
ax.plot(x, y)
#3rd way
figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

Maintenant ma question est -

  1. Quelle est la différence entre les trois, je veux dire ce qui se passe sous le capot lorsque l’une des 3 méthodes est appelée?

  2. Quelle méthode faut-il utiliser quand et quels sont les avantages et les inconvénients d'en utiliser?

61
hashcode55

Méthode 1

plt.plot(x, y)

Cela vous permet de tracer un seul chiffre avec les coordonnées (x, y). Si vous voulez seulement obtenir un graphique, vous pouvez utiliser cette méthode.

Méthode 2

ax = plt.subplot()
ax.plot(x, y)

Cela vous permet de tracer une ou plusieurs figures dans la même fenêtre. Au fur et à mesure que vous l'écrivez, vous n'allez tracer qu'un seul chiffre, mais vous pouvez faire quelque chose comme ceci:

fig1, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)

Vous allez tracer 4 figures nommées ax1, ax2, ax3 et ax4, mais sur la même fenêtre. Cette fenêtre sera juste divisée en 4 parties avec mon exemple.

Méthode 3

fig = plt.figure()
new_plot = fig.add_subplot(111)
new_plot.plot(x, y)

Je ne l'ai pas utilisé, mais vous pouvez trouver de la documentation.

Exemple:

import numpy as np
import matplotlib.pyplot as plt

# Method 1 #

x = np.random.Rand(10)
y = np.random.Rand(10)

figure1 = plt.plot(x,y)

# Method 2 #

x1 = np.random.Rand(10)
x2 = np.random.Rand(10)
x3 = np.random.Rand(10)
x4 = np.random.Rand(10)
y1 = np.random.Rand(10)
y2 = np.random.Rand(10)
y3 = np.random.Rand(10)
y4 = np.random.Rand(10)

figure2, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
ax1.plot(x1,y1)
ax2.plot(x2,y2)
ax3.plot(x3,y3)
ax4.plot(x4,y4)

plt.show()

enter image description hereenter image description here

Autre exemple:

enter image description here

35
Essex

Les noms d'objets

Matplotlib est fortement orienté objet et ses objets principaux sont le chiffre et les axes (je trouve le nom axes un peu trompeur, mais probablement c'est juste moi).

Vous pouvez considérer la figure comme un toile, dont vous spécifiez généralement les dimensions et éventuellement, par exemple, la couleur de l’arrière-plan, etc. Vous utilisez la toile , la figure , essentiellement de deux manières, en plaçant d’autres objets dessus (principalement les axes , mais aussi les étiquettes de texte, etc.) et en sauvegardant son contenu avec savefig.

Vous pouvez considérer un axe comme une sorte de couteau suisse, un objet pratique offrant un outil (par exemple, .plot, .scatter, .hist Etc) pour tout, surtout. Vous pouvez placer un, deux, ... plusieurs axes dans une figure à l'aide de l'une des nombreuses méthodes différentes.

L'interface plt

L’interface procédurale plt a été développée à l’origine pour imiter l’interface MATLAB ™, mais elle n’est pas très différente de l’interface orientée objet, même si vous ne faites pas de référence directe aux objets principaux (c.-à-d. , un chiffre et un axe ), ces objets sont automatiquement instanciés et chaque méthode plt est essentiellement traduit en appel de l’une des méthodes des objets fondamentaux sous-jacents: par exemple, une plt.plot() est un hidden_axes.plot et un plt.savefig est un hidden_figure.savefig.

À tout moment, vous pouvez avoir une poignée sur ces objets cachés en utilisant plt.gcf Et plt.gca, Et cela est parfois nécessaire quand une des méthodes objet n'a pas été portée à une méthode dans espace de noms plt .

Je voudrais ajouter que l’espace de noms plt contient également un certain nombre de méthodes pratiques pour instancier, de différentes manières, la figure et axes .

Vos exemples

1er chemin

plt.plot(x, y)

Ici, vous n’utilisez que l’interface plt , vous ne pouvez utiliser qu’un seul axe dans chaque figure , mais C’est ce que vous voulez lorsque vous explorez vos données, une recette rapide pour faire le travail ...

2ème voie

ax = plt.subplot()
ax.plot(x, y)

Ici, vous utilisez une méthode pratique dans l’espace de noms plt pour attribuer un nom (et un descripteur) à votre objet axes , mais il existe également un figure cachée . Vous pouvez utiliser ultérieurement l’objet pour tracer, pour créer un histogramme, etc., tout ce que vous pouvez faire avec l’interface plt , mais vous pouvez accédez également à tous ses attributs et modifiez-les avec une plus grande liberté.

3ème voie

figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

Ici, vous commencez à instancier une figure à l'aide d'une méthode pratique dans l'espace de noms plt , puis vous n'utilisez plus que l'interface orientée objet.

Il est possible de contourner la méthode de commodité plt (matplotlib.figure.Figure), Mais vous devez ensuite modifier le chiffre pour une meilleure expérience interactive (après tout, c'est un commodité méthode).

Recommandations personnelles

Je suggère nu plt.plot, plt.scatter Dans le contexte d'une session interactive, en utilisant éventuellement IPython avec ses %matplotlib magie commande, ainsi que dans le contexte d’un cahier de recherche Jupyter.

D'autre part, l'approche orientée objet, plus quelques méthodes de commodité plt, est la voie à suivre

  • si vous avez un problème permanent à résoudre une fois pour toutes avec un arrangement personnalisé de sous-placettes parfaitement ajustées,
  • si vous voulez intégrer Matplotlib dans l'interface utilisateur d'un programme que vous écrivez.

Il y a une grande zone grise entre ces extrêmes et si vous me demandez quoi faire, je dirais simplement "Cela dépend" ...

6
gboffi