Como posso abrir a janela matplotlib interativa no notebook IPython?

125

Estou usando IPython com --pylab=inlinee às vezes gostaria de mudar rapidamente para a GUI matplotlib interativa e com zoom para visualizar plotagens (aquela que aparece quando você plota algo em um console Python de terminal). Como posso fazer isso? De preferência sem sair ou reiniciar meu notebook.

O problema com plotagens embutidas em notebooks IPy é que eles têm uma resolução limitada e não consigo ampliá-los para ver algumas partes menores. Com a GUI do maptlotlib que começa em um terminal, posso selecionar um retângulo do gráfico no qual desejo ampliar e os eixos se ajustam de acordo. Eu tentei experimentar

from matplotlib import interactive
interactive(True)

e

interactive(False)

mas isso não fez nada. Não consegui encontrar nenhuma dica online também.

metakermit
fonte
4
Outra solução possível para o seu problema original é habilitar o zoom em seus gráficos embutidos, que agora é possível conforme descrito aqui: stackoverflow.com/a/22949003/145823
yonilevy
3
%matplotlib notebook funciona
muon

Respostas:

140

De acordo com a documentação , você deve ser capaz de alternar desta forma:

In [2]: %matplotlib inline 
In [3]: plot(...)

In [4]: %matplotlib qt  # wx, gtk, osx, tk, empty uses default
In [5]: plot(...) 

e isso irá abrir uma janela normal de plotagem (pode ser necessário reiniciar o notebook).

Eu espero que isso ajude.

Adrian Martin
fonte
2
É %pylab qt. Não funciona no OS X. Talvez no Ubuntu ajude.
metakermit
11
Infelizmente, você não pode ir e vir. Se você tentar mudar depois de iniciar com pylab = inline ou pylab = qt, obterá: Esta chamada para matplotlib.use () não tem efeito porque o backend já foi escolhido; matplotlib.use () deve ser chamado antes de pylab, matplotlib.pyplot ou matplotlib.backends ser importado pela primeira vez.
Charl Botha,
3
Eu votei contra isso porque não funcionou para mim e ainda não funciona, mas aparentemente esse é o problema de 1927 e deveria ter sido corrigido com o merge 2179 . @yarox, se você editar sua resposta para incorporar essas informações, desfarei meu voto negativo.
askewchan de
2
funciona bem aqui no OSX também, usando ipython v1.1.0 e MPL 1.3.0
K.-Michael Aye
1
Funciona para mim agora (2014-08) usando a versão atual do Python 2.7 no Win7 x64.
nerdfever.com
65

Se tudo o que você deseja fazer é alternar de gráficos embutidos para interativos e vice-versa (para que você possa aplicar panorâmica / zoom), é melhor usar a magia% matplotlib.

#interactive plotting in separate window
%matplotlib qt 

e de volta ao html

#normal charts inside notebooks
%matplotlib inline 

% pylab magic importa um monte de outras coisas e pode até resultar em um conflito. Ele faz "da importação do pylab *".

Você também pode usar o novo back-end do notebook (adicionado no matplotlib 1.4):

#interactive charts inside notebooks, matplotlib 1.4+
%matplotlib notebook 

Se você quiser ter mais interatividade em seus gráficos, pode olhar para mpld3 e bokeh . mpld3 é ótimo, se você não tem toneladas de pontos de dados (por exemplo, <5k +) e deseja usar a sintaxe matplotlib normal, mas mais interatividade, em comparação com o bloco de notas% matplotlib. O Bokeh pode lidar com muitos dados, mas você precisa aprender sua sintaxe, pois é uma biblioteca separada.

Além disso, você pode verificar pivottablejs (pip install pivottablejs)

from pivottablejs import pivot_ui
pivot_ui(df)

Por mais interessante que seja a exploração de dados interativa, ela pode bagunçar totalmente a reprodutibilidade. Aconteceu comigo, então tento usá-lo apenas no estágio inicial e mudar para matplotlib / seaborn puro em linha, assim que tenho os dados.

volodymyr
fonte
1
Warning: Cannot change to a different GUI toolkit: notebook. Using qt instead.para %matplotlib notebook.
mLstudent33
1
ImportError: Failed to import any qt bindingpara o comando qt magic
mLstudent33
31

A partir do matplotlib 1.4.0, agora há um backend interativo para uso no notebook

%matplotlib notebook

Existem algumas versões do IPython que não têm esse alias registrado, o fallback é:

%matplotlib nbagg

Se isso não funcionar, atualize seu IPython.

Para brincar com isso, vá para tmpnb.org

e colar

%matplotlib notebook

import pandas as pd
import numpy as np
import matplotlib

from matplotlib import pyplot as plt
import seaborn as sns

ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()

df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index,
                  columns=['A', 'B', 'C', 'D'])
df = df.cumsum()
df.plot(); plt.legend(loc='best')    

em uma célula de código (ou apenas modifique o bloco de notas de demonstração Python existente)

Tacaswell
fonte
6

Uma solução melhor para o seu problema pode ser a biblioteca de gráficos . Ele permite que você use a excelente biblioteca javascript Highcharts para fazer plotagens bonitas e interativas. Highcharts usa a svgtag HTML para que todos os seus gráficos sejam, na verdade, imagens vetoriais.

Algumas funcionalidades:

  • Gráficos vetoriais que você pode baixar nos formatos .png, .jpg e .svg para que você nunca tenha problemas de resolução
  • Gráficos interativos (zoom, slide, foco sobre pontos, ...)
  • Pode ser usado em um notebook IPython
  • Explore centenas de estruturas de dados ao mesmo tempo usando os recursos de plotagem assíncrona.

Isenção de responsabilidade: eu sou o desenvolvedor da biblioteca

Arnoutaertgeerts
fonte
Uma biblioteca bem legal! Eu vou ter a certeza de experimentá-lo :)
metakermit
Obrigado! Deixe-me saber o que você acha no github e envie um problema se você tiver algum problema :)
arnoutaertgeerts
1
Embora essa resposta seja definitivamente relevante, eu não a chamaria necessariamente de "uma solução melhor". Isso é o que provavelmente causou um downvote no passado.
volodymyr
1
Votos negativos, já que este post não me diz como posso realmente usar a biblioteca de gráficos para abrir uma janela de enredo interativo.
Robert Hönig
4

Estou usando ipython no "jupyter QTConsole" do Anaconda em www.continuum.io/downloads em 28/05/20117.

Aqui está um exemplo para alternar entre uma janela separada e um modo de plotagem embutida usando magia ipython.

>>> import matplotlib.pyplot as plt

# data to plot
>>> x1 = [x for x in range(20)]

# Show in separate window
>>> %matplotlib
>>> plt.plot(x1)
>>> plt.close() 

# Show in console window
>>> %matplotlib inline
>>> plt.plot(x1)
>>> plt.close() 

# Show in separate window
>>> %matplotlib
>>> plt.plot(x1)
>>> plt.close() 

# Show in console window
>>> %matplotlib inline
>>> plt.plot(x1)
>>> plt.close() 

# Note: the %matplotlib magic above causes:
#      plt.plot(...) 
# to implicitly include a:
#      plt.show()
# after the command.
#
# (Not sure how to turn off this behavior
# so that it matches behavior without using %matplotlib magic...)
# but its ok for interactive work...
Bill Moore
fonte
1
Quando tento usar %matplotlib, recebo um erro que termina comImportError: No module named 'PyQt4'
user3731622
Eu recebo exatamente o mesmo problema do user3731622. O que pode ser feito? Isso é para a maioria das respostas nesta página
bernando_vialli
@mkheifetz @ user3731622 Você pode precisar instalar o pacote: sudo apt-get install python-pyqt5ousudo apt-get install python-pyqt5
ttb
2

Reinicie o kernel e limpe a saída (se não estiver começando com o novo notebook), então execute

%matplotlib tk

Para obter mais informações, vá para Plotando com matplotlib

Marcin Lentner
fonte
0

Você pode usar

%matplotlib qt

Se você obteve o erro ImportError: Failed to import any qt binding, instale o PyQt5 como: pip install PyQt5e ele funciona para mim.

susan097
fonte