Como colocar o gráfico matplotlib do notebook IPython em linha

831

Estou tentando usar o notebook IPython no MacOS X com Python 2.7.2 e IPython 1.1.0.

Não consigo exibir gráficos matplotlib em linha.

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

Eu também tentei %pylab inlinee os argumentos da linha de comando ipython, --pylab=inlinemas isso não faz diferença.

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

Em vez de gráficos embutidos, recebo o seguinte:

<matplotlib.figure.Figure at 0x110b9c450>

E matplotlib.get_backend()mostra que eu tenho o 'module://IPython.kernel.zmq.pylab.backend_inline'back - end.

Ian Fiske
fonte
seu snippet de código não deve produzir, <matplotlib.figure.Figure at 0x110b9c450>mas <matplotlib.text.Text at 0x94f9320>(porque sua última linha está imprimindo um título). De qualquer forma, o seu código (com linha% matplotlib e plt.show ()) funciona como esperado no Windows
joaquin
Obrigado por essas sugestões, mas elas não funcionam para mim. Ainda recebo a saída acima sem gráficos em linha. Você tem algum conselho para solução de problemas?
21813 Ian Fiske
nenhuma pista. O mesmo python, o mesmo ipython (e o mesmo back-end), mas no Windows, e funciona .... Suponho que o plot esteja funcionando para você quando não estiver embutido, certo?
Joaquin #
2
sem o %matplotlib inline, o kernel permanece ocupado permanentemente e não recebo saída. Tem que ser morto. Isso está tentando usar o MacOSXback - end, mas acho que não pode ser aberto por algum motivo. Quando não está usando o notebook ipython, o back-end do MacOSX para o matplotlib funciona perfeitamente.
22613 Ian Fiske
1
Eu tinha um sintoma idêntico, mas acabei instalando uma versão de 32 bits do Canopy no OSX 10.8. A reinstalação com a versão de 64 bits foi corrigida.
Vicky T

Respostas:

1130

Eu usei %matplotlib inlinena primeira célula do notebook e funciona. Eu acho que você deveria tentar:

%matplotlib inline

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

Você também pode sempre iniciar todos os seus kernels IPython no modo embutido por padrão, definindo as seguintes opções de configuração em seus arquivos de configuração:

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
fonte
7
Eu marcaria isso como a resposta certa. A alternativa --pylab inlinefunciona, mas recebe o seguinte aviso: Iniciar todos os kernels no modo pylab não é recomendado e será desativado em uma versão futura. Por favor, use a% matplotlib magic para ativar o matplotlib. O pylab implica muitas importações, que podem ter efeitos colaterais confusos e prejudicar a reprodutibilidade de seus notebooks.
22414
1
@ eNord9 @mightwolf: Estou aprendendo a usar o iPython (e programação Python em vez do Matlab); o que import matplotlib' do versus importa matplotlib como [name] '? Perdoe para comentar simplista
TSGM
1
@ eNord9 @mightwolf: e também como isso se compara ao `from matplotlib import mpl '.
TSGM
2
@TSGM A melhor explicação que eu vi para sua pergunta é: effbot.org/zone/import-confusion.htm
mpavlov
Obrigado @ eNord9. Acabei de testar seus comandos, já que faz um tempo com atualizações e tudo. Agora tudo funciona bem no Python 2.7.9 e no IPython 3.1.0.
Ian Fiske
216

Se a sua versão do matplotlib estiver acima de 1.4, também é possível usar

IPython 3.xe acima

%matplotlib notebook

import matplotlib.pyplot as plt

versões mais antigas

%matplotlib nbagg

import matplotlib.pyplot as plt

Ambos ativarão o back-end nbagg , que permite interatividade.

Exemplo de plotagem com o back-end nbagg

Løiten
fonte
Isso não parece funcionar %config InlineBackend.figure_format='retina'. Alguma idéia de como obter figuras interativas da Retina?
Orome 01/04
Hmm ... eu realmente não tenho muita experiência com figuras de retina. A única coisa que me deparei foi com esse link , mas pode ser preterido. Se mais pessoas estiverem se perguntando sobre o mesmo, vinculo sua pergunta ao SO aqui e desejo-lhe boa sorte com as respostas lá. Melhor
Løiten 02/04
31
Esta resposta é subestimada. %matplotlib notebookfornece a melhor visualização do que %matplotlib inline.
21716
9
using %matplotlib notebooknão funciona (meio que mostra algo, depois fica em branco) no notebook jupyter 4.1.1 / ubuntu 16.04 / chrome, %matplotlib inlinemostra imagens, mas elas vêm após o texto de remarcação, não literalmente "inline".
22616 Michael
6
Se você tentou %matplotlib inlineprimeiro e depois mudou para %matplotlib notebook, poderá obter um resultado vazio. Reinicie o kernel e execute novamente.
Czechnology
91

Ctrl + Enter

%matplotlib inline

Linha Mágica: D

Consulte: Plotagem com Matplotlib .

CodeFarmer
fonte
1
@BradleyKreider Ainda não está morto. Como alternativa, você pode visitar o repo ipython no github, entrar na pasta 'example', encontrar o bloco de anotações 'Plotting with Matplotlib'.
CodeFarmer
24

Use o %pylab inlinecomando mágico.

foobarbecue
fonte
14
Não é mais: "ipython notebook --pylab inline [E 15: 01: 18.182 NotebookApp] O suporte para especificar --pylab na linha de comando foi removido. [E 15: 01: 18.182 NotebookApp] Use %pylab inlineou %matplotlib inlineno próprio notebook. "
Dave X
14

Para tornar o matplotlib embutido por padrão no Jupyter (IPython 3):

  1. Editar arquivo ~/.ipython/profile_default/ipython_config.py

  2. Adicionar linha c.InteractiveShellApp.matplotlib = 'inline'

Observe que adicionar esta linha a ipython_notebook_config.pynão funcionaria. Caso contrário, ele funciona bem com Jupyter e IPython 3.1.0

volodymyr
fonte
10

Eu tenho que concordar com foobarbecue (não tenho recs suficientes para poder simplesmente inserir um comentário em seu post):

Agora é recomendado que o notebook python não seja iniciado com o argumento --pylabe, de acordo com Fernando Perez (criador do ipythonnb), %matplotlib inlinedeve ser o comando inicial do notebook.

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

thescoop
fonte
7

Encontrei uma solução alternativa bastante satisfatória. Eu instalei o Anaconda Python e isso agora funciona imediatamente para mim.

Ian Fiske
fonte
5

Eu fiz a instalação do Anaconda, mas o Matplotlib não está plotando

Começa a traçar quando eu fiz isso

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

Você pode simular esse problema com um erro de sintaxe, no entanto, %matplotlib inlinenão resolverá o problema.

Primeiro, um exemplo da maneira correta de criar um gráfico. Tudo funciona como esperado com as importações e a magia que a eNord9 forneceu.

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

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

No entanto, deixando de ()fora o final do tipo de plotagem, você recebe um erro não ambíguo.

Código incorreto:

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

Exemplo de erro:

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

Além desta mensagem de uma linha, não há rastreamento de pilha ou outro motivo óbvio para pensar que você cometeu um erro de sintaxe. A plotagem não é impressa.

Blake M
fonte
Este não é um erro de sintaxe - sem ()a invocar kde , ipython está dizendo a você o que kde é , ou seja, um método vinculado. Portanto, na perspectiva do iPython, esse não é um "erro", portanto, por que não há rastreamento de pilha.
Kyle Strand
1
@KyleStrand Thanks. Depois de reler minha postagem, o que eu deveria ter dito é: "Eu pensei que tinha o problema de não exibir minhas plotagens em linha usando o %matplotlib inlinecomando. Realmente, simplesmente esqueci de colocar () no final do tipo de plotagem. Portanto, se tudo o mais falhar, olhe para os parênteses por um erro. "
Blake M
1

Eu tive o mesmo problema ao executar os comandos de plotagem em células separadas no 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 :(

O problema foi resolvido mesclando os comandos de plotagem em uma única célula:

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
fonte