web-dev-qa-db-fra.com

Pandas l'intrigue ne montre pas

Lorsque vous utilisez ceci dans un script (pas IPython), rien ne se passe, c'est-à-dire que la fenêtre de tracé ne s'affiche pas:

import numpy as np
import pandas as pd
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts.plot()

Même en ajoutant time.sleep(5), il n'y a toujours rien. Pourquoi?

Y a-t-il un moyen de le faire, sans avoir à appeler manuellement matplotlib?

50
Basj

Une fois que vous avez fait votre tracé, vous devez dire à matplotlib de le faire show. La manière habituelle de faire les choses est d’importer matplotlib.pyplot et appelez show à partir de là:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts.plot()
plt.show()

Puisque vous avez demandé de ne pas le faire (pourquoi?), Vous pouvez utiliser le code suivant [NOTE: Ceci ne semble plus fonctionner avec les versions plus récentes de pandas]:

import numpy as np
import pandas as pd
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts.plot()
pd.tseries.plotting.pylab.show()

Mais tout ce que vous faites est de trouver quelque part que matplotlib a été importé dans pandas et d’appeler la même fonction show à partir de là.

Essayez-vous d'éviter d'appeler matplotlib pour accélérer les choses? Si c'est le cas, vous n'accélérez vraiment rien, puisque pandas importe déjà pyplot:

python -mtimeit -s 'import pandas as pd'
100000000 loops, best of 3: 0.0122 usec per loop

python -mtimeit -s 'import pandas as pd; import matplotlib.pyplot as plt'
100000000 loops, best of 3: 0.0125 usec per loop

Enfin, = exemple de lien dans les commentaires ne nécessite pas l’appel de matplotlib, car il est exécuté de manière interactive dans un iPython notebook, pas dans un script.

98
tmdavison

Si vous utilisez matplotlib, Et que, malgré tout, les choses ne s'affichent pas dans le cahier iPython (ni dans Jupyter Lab), n'oubliez pas de définir l'option en ligne pour matplotlib dans le cahier.

import matplotlib.pyplot as plt

%matplotlib inline

Ensuite, le code suivant fonctionnera parfaitement:

fig, ax = plt.subplots(figsize=(16,9));
change_per_ins.plot(ax=ax, kind='hist')

Si vous ne définissez pas l'option inline, elle ne s'affichera pas et en ajoutant un plt.show() à la fin, vous obtiendrez des résultats en double.

5
Hamed MP