Come rendere in linea il diagramma matplotlib per notebook IPython


831

Sto cercando di utilizzare il notebook IPython su MacOS X con Python 2.7.2 e IPython 1.1.0.

Non riesco a visualizzare la grafica matplotlib da mostrare in linea.

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

Ho anche provato %pylab inlinee gli argomenti della riga di comando di ipython --pylab=inlinema questo non fa differenza.

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

Invece di grafica in linea, ottengo questo:

<matplotlib.figure.Figure at 0x110b9c450>

E matplotlib.get_backend()dimostra che ho il 'module://IPython.kernel.zmq.pylab.backend_inline'backend.


lo snippet di codice non dovrebbe produrre <matplotlib.figure.Figure at 0x110b9c450>ma <matplotlib.text.Text at 0x94f9320>(poiché l'ultima riga sta stampando un titolo). Ad ogni modo, il tuo codice (con% matplotlib inline e plt.show ()) funziona come previsto su Windows
Joaquin,

Grazie per questi suggerimenti, ma non funzionano per me. Ottengo ancora l'output sopra senza grafica in linea. Hai qualche consiglio per la risoluzione dei problemi?
Ian Fiske,

nessun indizio. Stesso pitone, stesso ipython (e stesso backend) ma su Windows, e funziona .... Suppongo che la trama funzioni per te quando non è in linea, giusto?
Joaquin,

2
senza il %matplotlib inline, il kernel rimane occupato in modo permanente e non ottengo alcun output. Deve essere ucciso. Questo sta provando a usare il MacOSXbackend ma immagino che non possa essere aperto per qualche motivo. Quando non si utilizza il notebook ipython, il backend MacOSX per matplotlib funziona perfettamente.
Ian Fiske,

1
Avevo un sintomo identico ma alla fine avevo installato una versione a 32 bit di Canopy su OSX 10.8. La reinstallazione con la versione a 64 bit l'ha risolto.
Vicky T,

Risposte:


1130

Ho usato %matplotlib inlinenella prima cella del notebook e funziona. Penso che dovresti provare:

%matplotlib inline

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

Puoi anche avviare sempre tutti i tuoi kernel IPython in modalità in linea per impostazione predefinita impostando le seguenti opzioni di configurazione nei tuoi file di configurazione:

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.

7
Vorrei contrassegnare questa come la risposta giusta. L'alternativa --pylab inlinefunziona, ma ti accoglie con il seguente avviso: L' avvio di tutti i kernel in modalità pylab non è raccomandato e verrà disabilitato in una versione futura. Utilizza invece la magia% matplotlib per abilitare matplotlib. pylab implica molte importazioni, che possono avere effetti collaterali confusi e danneggiare la riproducibilità dei notebook.
mpavlov,

1
@ eNord9 @mightwolf: sto imparando ad usare iPython (e la programmazione Python invece di Matlab); che cosa import matplotlib' do versus importa matplotlib come [nome] '? Perdona per un commento semplicistico
TSGM,

1
@ eNord9 @mightwolf: e anche come si confronta con `from matplotlib import mpl '.
TSGM,

2
@TSGM La migliore spiegazione che ho visto per la tua domanda è: effbot.org/zone/import-confusion.htm
mpavlov,

Grazie @ eNord9. Ho appena testato i tuoi comandi poiché è passato un po 'di tempo con gli aggiornamenti e tutto il resto. Ora tutto funziona bene su Python 2.7.9 e IPython 3.1.0.
Ian Fiske,

216

Se la versione di matplotlib è precedente alla 1.4, è anche possibile utilizzarla

IPython 3.xe versioni successive

%matplotlib notebook

import matplotlib.pyplot as plt

versioni precedenti

%matplotlib nbagg

import matplotlib.pyplot as plt

Entrambi attiveranno il back-end nbagg , che consente l'interattività.

Esempio di trama con il back-end nbagg


Questo non sembra funzionare %config InlineBackend.figure_format='retina'. Qualche idea su come ottenere figure interattive della Retina?
orome

Hmm ... Non ho molta esperienza con le figure della retina. L'unica cosa su cui mi sono imbattuto in questo link , ma potrebbe essere deprecato. Se più persone si chiedono lo stesso, collego la tua domanda SO qui e ti auguro buona fortuna con le risposte lì. Migliore
Løiten,

31
Questa risposta è sottovalutata. %matplotlib notebookfornisce la visualizzazione migliore di %matplotlib inline.
Hieu,

9
l'utilizzo %matplotlib notebooknon funziona (in qualche modo mostra qualcosa, quindi vuoto) su jupyter notebook 4.1.1 / ubuntu 16.04 / chrome, %matplotlib inlinemostra le immagini, ma vengono dopo il testo di markdown, non letteralmente "in linea".
michael

6
Se hai provato %matplotlib inlineprima e poi passa a %matplotlib notebook, potresti ottenere risultati vuoti. Riavvia il kernel ed esegui di nuovo.
Cecologia

91

Ctrl + Enter

%matplotlib inline

Linea magica: D

Vedi: Stampa con Matplotlib .


1
@BradleyKreider Non ancora morto. In alternativa, puoi visitare il repository ipython su github, andare nella cartella "esempio", trovare il blocco appunti "Stampa con Matplotlib".
CodeFarmer il

24

Usa il %pylab inlinecomando magico.


14
Non più: "ipython notebook --pylab inline [E 15: 01: 18.182 NotebookApp] Il supporto per specificare --pylab sulla riga di comando è stato rimosso. [E 15: 01: 18.182 NotebookApp] Utilizzare %pylab inlineo %matplotlib inlinenel notebook stesso. "
Dave X,

14

Per rendere matplotlib in linea per impostazione predefinita in Jupyter (IPython 3):

  1. Modifica file ~/.ipython/profile_default/ipython_config.py

  2. Aggiungi linea c.InteractiveShellApp.matplotlib = 'inline'

Si noti che l'aggiunta di questa riga a ipython_notebook_config.pynon funzionerebbe. Altrimenti funziona bene con Jupyter e IPython 3.1.0




5

Ho fatto l'installazione di anaconda ma matplotlib non sta tramando

Inizia a tramare quando l'ho fatto

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

2

È possibile simulare questo problema con un errore di sintassi, tuttavia %matplotlib inlinenon risolverà il problema.

Innanzitutto un esempio del modo giusto per creare una trama. Tutto funziona come previsto con le importazioni e la magia fornite da eNord9 .

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

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

Tuttavia, lasciando la ()fine del tipo di trama si riceve un non errore un po 'ambiguo.

Codice erroneo:

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

Esempio di errore:

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

Oltre a questo messaggio a una riga, non esiste alcuna traccia dello stack o altri ovvi motivi per pensare di aver commesso un errore di sintassi. La trama non viene stampata.


Questo non è un errore di sintassi - senza ()per invocare kde , ipython ti sta dicendo ciò che kde è , vale a dire, un metodo vincolato. Quindi, in effetti, dal punto di vista di iPython, questo non è affatto un "errore", quindi perché non c'è traccia dello stack.
Kyle Strand,

1
@KyleStrand Grazie. Dopo aver riletto il mio post quello che avrei dovuto dire è: "Pensavo di avere il problema di non mostrare i miei grafici in linea usando il %matplotlib inlinecomando. Davvero mi sono dimenticato di mettere () alla fine del tipo di trama. Quindi se tutto il resto fallisce, guarda le parentesi per un errore. "
Blake M,

1

Ho avuto lo stesso problema quando stavo eseguendo i comandi di stampa in celle separate in 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 :(

Il problema è stato risolto unendo i comandi di stampa in una singola cella:

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 :)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.