2016-10-08 2 views
2

je peux tracer des données à partir d'un fichier CSV avec le code suivant:modules connaissent

import pandas as pd 
import matplotlib.pyplot as plt 
df = pd.read_csv('test0.csv',delimiter='; ', engine='python') 
df.plot(x='Column1', y='Column3') 
plt.show() 

Mais je ne comprends pas une chose. Comment plt.show() sait environ df? Je vais faire plus de sens pour me voir, quelque part, une expression comme:

plt = something(df) 

Je dois mentionner que je suis en train d'apprendre Python.

+0

Fondamentalement '' df' Les importations ont également plt' et modifie directement. 'plt' utilise beaucoup d'état global accessible aux utilisateurs et au code. – MisterMiyagi

Répondre

2

De Pandas docs plotting:

La méthode plot sur la série et dataframe est juste une simple enveloppe autour de: meth: plt.plot() <matplotlib.axes.Axes.plot>

Ainsi, comme il est, la méthode est un appel de haut niveau à plt.plot (en utilisant un emballage ), et par la suite, en appelant plt.show sera simplement:

affichage

tous les chiffres et le bloc jusqu'à ce que les chiffres ont été fermés

comme il le ferait avec tous les chiffres tracés avec plt.plot.


Par conséquent, vous ne voyez pas plt = something(df) comme on peut s'y attendre, parce que matpotlib.pyplot.plot est appelé derrière la scène par .

+1

Je l'ai eu. Mais je voudrais demander, est-il possible d'écrire le code pour que la magie devienne plus explicite? – KcFnMi

+0

@KcFnMi Je ne pense pas que vous ayez besoin de la magie explicite. Ce wrapper nous évite de passer les arguments et kwargs requis à 'plt.plot' comme requis pour des dataframes parfois compliquées. –

3

Matplotlib a deux «interfaces»: un Matlab-style interface et un object-oriented interface.

Traçage avec l'interface de style Matlab ressemble à ceci:

import matplotlib.pyplot as plt 
plt.plot(x, y) 
plt.show() 

L'appel à plt.plot crée implicitement une figure et un axe sur lequel dessiner. L'appel à plt.show affiche toutes les figures.

Pandas prend en charge l'interface de type Matlab en créant implicitement une figure et des axes lorsque df.plot(x='Column1', y='Column3') est appelée.

Pandas peut également utiliser l'interface orientée objet plus souple, auquel cas votre code ressemblerait à ceci:

import pandas as pd 
import matplotlib.pyplot as plt 
df = pd.read_csv('test0.csv',delimiter='; ', engine='python') 
fig, ax = plt.subplots() 
df.plot(ax=ax, x='Column1', y='Column3') 
plt.show() 

Voici les axes, ax, est explicitement créé et transmis à , qui a ensuite appelle ax.plot sous le capot.

un cas où l'interface orientée objet est utile est lorsque vous souhaitez utiliser plus d'une fois tout en tirant toujours sur les mêmes axes:

fig, ax = plt.subplots() 
df.plot(ax=ax, x='Column1', y='Column3') 
df2.plot(ax=ax, x='Column2', y='Column4') 
plt.show() 
+0

Quelle est la signification de 'fig, ax = plt.subplots()'? Je m'attendais à une chose à gauche. – KcFnMi

+0

La figure est responsable de l'ensemble de l'image affichée. Les axes sont responsables d'une zone de traçage. Une figure peut contenir plusieurs axes. Voir http://stackoverflow.com/a/14846126/190597 pour plus d'informations sur la façon dont la hiérarchie des objets de matplotlib est organisée. – unutbu

+1

@KcFnMi 'plt.subplots' renvoie deux objets, qui peuvent être assignés à un nom pour créer un tuple, ou assignés à deux noms séparément. – MisterMiyagi