Comment rendre le tracé matplotlib du bloc-notes IPython en ligne

831

J'essaie d'utiliser le bloc-notes IPython sur MacOS X avec Python 2.7.2 et IPython 1.1.0.

Je n'arrive pas à faire apparaître les graphiques matplotlib en ligne.

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline  

J'ai également essayé %pylab inlineet les arguments de la ligne de commande ipython --pylab=inlinemais cela ne fait aucune différence.

x = np.linspace(0, 3*np.pi, 500)
plt.plot(x, np.sin(x**2))
plt.title('A simple chirp')
plt.show()

Au lieu de graphiques en ligne, j'obtiens ceci:

<matplotlib.figure.Figure at 0x110b9c450>

Et matplotlib.get_backend()montre que j'ai le 'module://IPython.kernel.zmq.pylab.backend_inline'backend.

Ian Fiske
la source
votre extrait de code ne devrait pas produire <matplotlib.figure.Figure at 0x110b9c450>mais <matplotlib.text.Text at 0x94f9320>(car votre dernière ligne imprime un titre). Quoi qu'il en soit, votre code (avec% matplotlib inline et plt.show ()) fonctionne comme prévu sur Windows
joaquin
Merci pour ces suggestions, mais elles ne fonctionnent pas pour moi. J'obtiens toujours la sortie ci-dessus sans graphiques en ligne. Avez-vous des conseils de dépannage?
Ian Fiske
aucune idée. Même python, même ipython (et même backend) mais sur Windows, et ça marche .... Je suppose que l'intrigue fonctionne pour vous quand il n'est pas en ligne, non?
joaquin
2
sans le %matplotlib inline, le noyau reste occupé en permanence et je n'obtiens aucune sortie. Il faut le tuer. Cela essaie d'utiliser le MacOSXbackend mais je suppose qu'il ne peut pas être ouvert pour une raison quelconque. Lorsqu'il n'utilise pas le bloc-notes ipython, le backend MacOSX pour matplotlib fonctionne très bien.
Ian Fiske
1
J'avais un symptôme identique mais il s'est avéré que j'avais installé une version 32 bits de Canopy sur OSX 10.8. La réinstallation avec la version 64 bits l'a corrigé.
Vicky T

Réponses:

1130

Je l'ai utilisé %matplotlib inlinedans la première cellule du cahier et ça marche. Je pense que vous devriez essayer:

%matplotlib inline

import matplotlib
import numpy as np
import matplotlib.pyplot as plt

Vous pouvez également toujours démarrer tous vos noyaux IPython en mode en ligne par défaut en définissant les options de configuration suivantes dans vos fichiers de configuration:

c.IPKernelApp.matplotlib=<CaselessStrEnum>
  Default: None
  Choices: ['auto', 'gtk', 'gtk3', 'inline', 'nbagg', 'notebook', 'osx', 'qt', 'qt4', 'qt5', 'tk', 'wx']
  Configure matplotlib for interactive use with the default matplotlib backend.
eNord9
la source
7
Je dirais que c'est la bonne réponse. L'alternative --pylab inlinefonctionne, mais vous accueille avec l'avertissement suivant: Le démarrage de tous les noyaux en mode pylab n'est pas recommandé et sera désactivé dans une prochaine version. Veuillez utiliser la magie% matplotlib pour activer à la place matplotlib. pylab implique de nombreuses importations, ce qui peut avoir des effets secondaires déroutants et nuire à la reproductibilité de vos ordinateurs portables.
mpavlov
1
@ eNord9 @mightwolf: j'apprends à utiliser iPython (et la programmation Python au lieu de Matlab); qu'est-ce qui import matplotlib' do versus importe matplotlib en tant que [nom] '? Pardonnez pour un commentaire simpliste
TSGM
1
@ eNord9 @mightwolf: et comment cela se compare-t-il à `from matplotlib import mpl '.
TSGM
2
@TSGM La meilleure explication que j'ai vue pour votre question est: effbot.org/zone/import-confusion.htm
mpavlov
Merci @ eNord9. Je viens de tester vos commandes depuis un certain temps avec les mises à jour et tout. Maintenant, tout fonctionne bien sur Python 2.7.9 et IPython 3.1.0.
Ian Fiske
216

Si votre version de matplotlib est supérieure à 1.4, il est également possible d'utiliser

IPython 3.x et supérieur

%matplotlib notebook

import matplotlib.pyplot as plt

Versions plus anciennes

%matplotlib nbagg

import matplotlib.pyplot as plt

Les deux activeront le backend nbagg , ce qui permet l'interactivité.

Exemple d'intrigue avec le backend nbagg

Løiten
la source
Cela ne semble pas fonctionner %config InlineBackend.figure_format='retina'. Une idée de comment obtenir des figurines interactives de la rétine?
orome
Hmm ... Je n'ai pas vraiment trop d'expertise avec les figurines de rétine. La seule chose sur laquelle je suis tombé est ce lien , mais il est peut-être obsolète. Si plus de gens se demandent la même chose, je relie votre question SO ici , et je vous souhaite bonne chance avec les réponses là-bas. Meilleur
Løiten
31
Cette réponse est sous-estimée. %matplotlib notebookfournit la meilleure visualisation que %matplotlib inline.
Hieu
9
l'utilisation %matplotlib notebookne fonctionne pas (sorte de montre quelque chose, puis vide) sur le cahier jupyter 4.1.1 / ubuntu 16.04 / chrome, %matplotlib inlinemontre des images, mais elles viennent après le texte de démarque, pas littéralement "en ligne".
michael
6
Si vous avez d' %matplotlib inlineabord essayé puis basculé sur %matplotlib notebook, vous pourriez obtenir un résultat vide. Redémarrez le noyau et exécutez à nouveau.
Czechnology
91

Ctrl + Enter

%matplotlib inline

Ligne magique: D

Voir: Tracer avec Matplotlib .

CodeFarmer
la source
1
@BradleyKreider Pas encore mort. Alternativement, vous pouvez visiter le repo d'ipython sur github, aller dans le dossier 'example', trouver le bloc-notes 'Plotting with Matplotlib'.
CodeFarmer
24

Utilisez la %pylab inlinecommande magique.

barbecue
la source
14
Plus: "ipython notebook --pylab inline [E 15: 01: 18.182 NotebookApp] La prise en charge de la spécification de --pylab sur la ligne de commande a été supprimée. [E 15: 01: 18.182 NotebookApp] Veuillez utiliser %pylab inlineou %matplotlib inlinedans le bloc-notes lui-même. "
Dave X
14

Pour rendre matplotlib inline par défaut dans Jupyter (IPython 3):

  1. Modifier le fichier ~/.ipython/profile_default/ipython_config.py

  2. Ajouter une ligne c.InteractiveShellApp.matplotlib = 'inline'

Veuillez noter que l'ajout de cette ligne à ipython_notebook_config.pyne fonctionnerait pas. Sinon, cela fonctionne bien avec Jupyter et IPython 3.1.0

volodymyr
la source
10

Je dois être d'accord avec foobar barbecue (je n'ai pas assez de recs pour pouvoir simplement insérer un commentaire sous son post):

Il est maintenant recommandé de ne pas démarrer le bloc-notes python avec l'argument --pylab, et selon Fernando Perez (créateur d'ipythonnb) %matplotlib inlinedevrait être la commande initiale du bloc-notes.

Voir ici: http://nbviewer.ipython.org/github/ipython/ipython/blob/1.x/examples/notebooks/Part%203%20-%20Plotting%20with%20Matplotlib.ipynb

le scoop
la source
7

J'ai trouvé une solution de contournement assez satisfaisante. J'ai installé Anaconda Python et cela fonctionne maintenant hors de la boîte pour moi.

Ian Fiske
la source
5

J'ai fait l'installation anaconda mais matplotlib ne trace pas

Ça commence à tracer quand j'ai fait ça

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline  
Raymond
la source
2

Vous pouvez simuler ce problème avec une erreur de syntaxe, mais %matplotlib inlinene résoudra pas le problème.

D'abord un exemple de la bonne façon de créer un tracé. Tout fonctionne comme prévu avec les importations et la magie fournies par eNord9 .

df_randNumbers1 = pd.DataFrame(np.random.randint(0,100,size=(100, 6)), columns=list('ABCDEF'))

df_randNumbers1.ix[:,["A","B"]].plot.kde()

Cependant, en laissant la ()fin du type de tracé, vous obtenez une non-erreur quelque peu ambiguë.

Code érronieux:

df_randNumbers1.ix[:,["A","B"]].plot.kde

Exemple d'erreur:

<bound method FramePlotMethods.kde of <pandas.tools.plotting.FramePlotMethods object at 0x000001DDAF029588>>

À part ce message d'une ligne, il n'y a pas de trace de pile ou autre raison évidente de penser que vous avez fait une erreur de syntaxe. L'intrigue ne s'imprime pas.

Blake M
la source
Ce n'est pas une erreur de syntaxe - sans ()pour invoquer kde , ipython vous dit kde c'est , à savoir une méthode liée. Donc, en fait, du point de vue d'iPython, ce n'est pas du tout une "erreur", c'est pourquoi il n'y a pas de trace de pile.
Kyle Strand
1
@KyleStrand Merci. Après avoir relu mon article, j'aurais dû dire: "Je pensais que j'avais le problème de ne pas afficher mes tracés en ligne à l'aide de la %matplotlib inlinecommande. Vraiment, j'ai juste oublié de mettre () à la fin du type de tracé. Donc si tout le reste échoue, regardez vos parenthèses pour une erreur. "
Blake M
1

J'ai eu le même problème lorsque j'exécutais les commandes de traçage dans des cellules distinctes dans Jupyter:

In [1]:  %matplotlib inline
         import matplotlib
         import matplotlib.pyplot as plt
         import numpy as np
In [2]:  x = np.array([1, 3, 4])
         y = np.array([1, 5, 3])
In [3]:  fig = plt.figure()
         <Figure size 432x288 with 0 Axes>                      #this might be the problem
In [4]:  ax = fig.add_subplot(1, 1, 1)
In [5]:  ax.scatter(x, y)
Out[5]:  <matplotlib.collections.PathCollection at 0x12341234>  # CAN'T SEE ANY PLOT :(
In [6]:  plt.show()                                             # STILL CAN'T SEE IT :(

Le problème a été résolu en fusionnant les commandes de traçage dans une seule cellule:

In [1]:  %matplotlib inline
         import matplotlib
         import matplotlib.pyplot as plt
         import numpy as np
In [2]:  x = np.array([1, 3, 4])
         y = np.array([1, 5, 3])
In [3]:  fig = plt.figure()
         ax = fig.add_subplot(1, 1, 1)
         ax.scatter(x, y)
Out[3]:  <matplotlib.collections.PathCollection at 0x12341234>
         # AND HERE APPEARS THE PLOT AS DESIRED :)
krubo
la source