Come posso aprire la finestra matplotlib interattiva nel notebook IPython?


125

Sto usando IPython con --pylab=inlineea volte vorrei passare rapidamente alla GUI matplotlib interattiva e zoomabile per visualizzare i grafici (quello che si apre quando si traccia qualcosa in una console Python del terminale). Come potrei farlo? Preferibilmente senza lasciare o riavviare il mio notebook.

Il problema con i grafici in linea nei notebook IPy è che hanno una risoluzione limitata e non posso ingrandirli per vedere alcune parti più piccole. Con la GUI maptlotlib che parte da un terminale, posso selezionare un rettangolo del grafico che voglio ingrandire e gli assi si adattano di conseguenza. Ho provato a sperimentare

from matplotlib import interactive
interactive(True)

e

interactive(False)

ma questo non ha fatto nulla. Neanche online sono riuscito a trovare alcun suggerimento.


4
Un'altra possibile soluzione al problema originale sta consentendo lo zoom nelle vostre trame in linea, che ora è possibile, come ho descritto qui: stackoverflow.com/a/22949003/145823
yonilevy

3
%matplotlib notebook funziona
muone

Risposte:


140

Secondo la documentazione , dovresti essere in grado di passare avanti e indietro in questo modo:

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

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

e questo farà apparire una normale finestra di trama (potrebbe essere necessario un riavvio del notebook).

Spero che aiuti.


2
È %pylab qt. Non funziona in OS X. Forse in Ubuntu aiuterà.
metakermit

11
Sfortunatamente, non puoi passare avanti e indietro. Se provi a cambiare dopo aver iniziato con pylab = inline o pylab = qt, ottieni: Questa chiamata a matplotlib.use () non ha effetto perché il backend è già stato scelto; matplotlib.use () deve essere chiamato prima che pylab, matplotlib.pyplot o matplotlib.backends vengano importati per la prima volta.
Charl Botha

3
Ho downvotato questo perché non ha funzionato per me, e ancora non funziona, ma a quanto pare questo è il problema 1927 e avrebbe dovuto essere risolto con l' unione 2179 . @yarox, se modifichi la tua risposta per incorporare queste informazioni annullerò il mio voto negativo.
askewchan

2
funziona bene qui anche su OSX, utilizzando ipython v1.1.0 e MPL 1.3.0
K.-Michael Aye

1
Funziona per me ora (2014-08) utilizzando la versione corrente di Python 2.7 su Win7 x64.
nerdfever.com

65

Se tutto ciò che vuoi fare è passare dai grafici in linea a quelli interattivi e viceversa (in modo da poter eseguire la panoramica / zoom), è meglio usare% matplotlib magic.

#interactive plotting in separate window
%matplotlib qt 

e torna a html

#normal charts inside notebooks
%matplotlib inline 

% pylab magic importa un sacco di altre cose e può persino provocare un conflitto. Funziona "da pylab import *".

Puoi anche usare il nuovo backend per notebook (aggiunto in matplotlib 1.4):

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

Se vuoi avere più interattività nei tuoi grafici, puoi guardare mpld3 e bokeh . mpld3 è ottimo, se non si hanno tonnellate di punti dati (ad esempio <5k +) e si desidera utilizzare la normale sintassi matplotlib, ma più interattività, rispetto a% matplotlib notebook. Bokeh può gestire molti dati, ma devi imparare la sua sintassi in quanto è una libreria separata.

Inoltre puoi controllare pivottablejs (pip install pivottablejs)

from pivottablejs import pivot_ui
pivot_ui(df)

Per quanto interessante sia l'esplorazione interattiva dei dati, può compromettere completamente la riproducibilità. È successo a me, quindi cerco di usarlo solo nella fase iniziale e passare al puro matplotlib / seaborn in linea, una volta che ho avuto la sensazione dei dati.


1
Warning: Cannot change to a different GUI toolkit: notebook. Using qt instead.per %matplotlib notebook.
mLstudent33

1
ImportError: Failed to import any qt bindingper il comando qt magic
mLstudent33

31

A partire da matplotlib 1.4.0 è ora disponibile un backend interattivo da utilizzare nel notebook

%matplotlib notebook

Ci sono alcune versioni di IPython che non hanno quell'alias registrato, il fallback è:

%matplotlib nbagg

Se non funziona aggiorna il tuo IPython.

Per giocare con questo, vai su tmpnb.org

e incolla

%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')    

in una cella di codice (o semplicemente modificare il notebook demo Python esistente)


6

Una soluzione migliore per il tuo problema potrebbe essere la libreria dei grafici . Ti consente di utilizzare l'eccellente libreria javascript di Highcharts per creare grafici belli e interattivi. Highcharts utilizza il svgtag HTML in modo che tutti i tuoi grafici siano in realtà immagini vettoriali.

Alcune caratteristiche:

  • Grafici vettoriali che puoi scaricare nei formati .png, .jpg e .svg in modo da non incorrere mai in problemi di risoluzione
  • Grafici interattivi (zoom, scorrimento, passaggio del mouse su punti, ...)
  • Utilizzabile in un notebook IPython
  • Esplora centinaia di strutture di dati contemporaneamente utilizzando le funzionalità di plottaggio asincrono.

Disclaimer: sono lo sviluppatore della libreria


Una libreria davvero carina! Mi assicurerò di provarlo :)
metakermit

Grazie! Fammi sapere cosa ne pensi su GitHub e
inviaci

1
Sebbene questa risposta sia decisamente pertinente, non la chiamerei necessariamente "una soluzione migliore". Questo è ciò che ha causato un downvote in passato, molto probabilmente.
volodymyr

1
Downvoted, poiché questo post non mi dice come posso effettivamente utilizzare la libreria Charts per aprire una finestra di trama interattiva.
Robert Hönig

4

Sto usando ipython in "jupyter QTConsole" da Anaconda su www.continuum.io/downloads il 28/5/2017.

Ecco un esempio per spostarsi avanti e indietro tra una finestra separata e una modalità di trama in linea usando ipython magic.

>>> 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...

1
Quando provo a utilizzare, %matplotlibricevo un errore che termina conImportError: No module named 'PyQt4'
user3731622

Ottengo lo stesso identico problema di user3731622. Cosa si può fare? Questo è per la maggior parte delle risposte in questa pagina
bernando_vialli

@mkheifetz @ user3731622 Potrebbe essere necessario installare il pacchetto: sudo apt-get install python-pyqt5oppuresudo apt-get install python-pyqt5
ttb


0

Puoi usare

%matplotlib qt

Se hai ricevuto l'errore, ImportError: Failed to import any qt bindinginstalla PyQt5 come: pip install PyQt5e funziona per me.

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.