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.