Comment ouvrir la fenêtre interactive matplotlib dans le notebook IPython?

125

J'utilise IPython avec --pylab=inlineet j'aimerais parfois passer rapidement à l'interface graphique interactive et zoomable matplotlib pour visualiser les tracés (celui qui apparaît lorsque vous tracez quelque chose dans une console Python de terminal). Comment pourrais-je faire ça? De préférence sans quitter ni redémarrer mon notebook.

Le problème avec les tracés en ligne dans le notebook IPy est qu'ils ont une résolution limitée et que je ne peux pas les agrandir pour voir des parties plus petites. Avec l'interface graphique de maptlotlib qui commence à partir d'un terminal, je peux sélectionner un rectangle du graphique sur lequel je veux zoomer et les axes s'ajustent en conséquence. J'ai essayé d'expérimenter avec

from matplotlib import interactive
interactive(True)

et

interactive(False)

mais cela n'a rien fait. Je n'ai pas non plus trouvé d'indice en ligne.

metakermit
la source
4
Une autre solution possible à votre problème initial consiste à activer le zoom dans vos tracés en ligne, ce qui est maintenant possible comme je l'ai décrit ici: stackoverflow.com/a/22949003/145823
yonilevy
3
%matplotlib notebook works
muon

Réponses:

140

Selon la documentation , vous devriez pouvoir basculer d'avant en arrière comme ceci:

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

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

et cela fera apparaître une fenêtre de tracé régulière (un redémarrage sur le portable peut être nécessaire).

J'espère que ça aide.

Adrian Martin
la source
2
C'est %pylab qt. Ne fonctionne pas sous OS X. Peut-être que dans Ubuntu, cela aidera.
metakermit
11
Malheureusement, vous ne pouvez pas basculer entre les deux. Si vous essayez de basculer après avoir démarré avec pylab = inline ou pylab = qt, vous obtenez: Cet appel à matplotlib.use () n'a aucun effet car le backend a déjà été choisi; matplotlib.use () doit être appelé avant l' importation de pylab, matplotlib.pyplot ou matplotlib.backends pour la première fois.
Charl Botha
3
J'ai voté contre cela parce que cela n'a pas fonctionné pour moi, et ne fonctionne toujours pas, mais apparemment, c'est le problème 1927 et il aurait dû être corrigé avec la fusion 2179 . @yarox, si vous modifiez votre réponse pour intégrer cette information, j'annulerai mon vote défavorable.
askewchan
2
fonctionne bien ici sur OSX aussi, en utilisant ipython v1.1.0 et MPL 1.3.0
K.-Michael Aye
1
Fonctionne pour moi maintenant (2014-08) en utilisant la version actuelle de Python 2.7 sur Win7 x64.
nerdfever.com
65

Si tout ce que vous voulez faire est de passer des graphiques en ligne aux graphiques interactifs et inversement (pour pouvoir faire un panoramique / zoomer), il est préférable d'utiliser la magie de% matplotlib.

#interactive plotting in separate window
%matplotlib qt 

et retour au html

#normal charts inside notebooks
%matplotlib inline 

% pylab magic importe un tas d'autres choses et peut même entraîner un conflit. Il fait "from pylab import *".

Vous pouvez également utiliser un nouveau backend de notebook (ajouté dans matplotlib 1.4):

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

Si vous souhaitez avoir plus d'interactivité dans vos graphiques, vous pouvez consulter mpld3 et bokeh . mpld3 est génial, si vous n'avez pas des tonnes de points de données (par exemple <5k +) et que vous voulez utiliser la syntaxe normale de matplotlib, mais plus d'interactivité, par rapport au notebook% matplotlib. Bokeh peut gérer beaucoup de données, mais vous devez apprendre sa syntaxe car il s'agit d'une bibliothèque séparée.

Vous pouvez également consulter pivottablejs (pip install pivottablejs)

from pivottablejs import pivot_ui
pivot_ui(df)

Aussi cool que soit l'exploration de données interactive, elle peut totalement gâcher la reproductibilité. Cela m'est arrivé, alors j'essaie de ne l'utiliser que très tôt et de passer à matplotlib / seaborn en ligne pur, une fois que j'ai pris connaissance des données.

volodymyr
la source
1
Warning: Cannot change to a different GUI toolkit: notebook. Using qt instead.pour %matplotlib notebook.
mLstudent33
1
ImportError: Failed to import any qt bindingpour la commande magique qt
mLstudent33
31

À partir de matplotlib 1.4.0, il existe maintenant un backend interactif à utiliser dans le notebook

%matplotlib notebook

Il existe quelques versions d'IPython qui n'ont pas cet alias enregistré, la solution de rechange est:

%matplotlib nbagg

Si cela ne fonctionne pas, mettez à jour IPython.

Pour jouer avec ça, allez sur tmpnb.org

et coller

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

dans une cellule de code (ou simplement modifier le cahier de démonstration Python existant)

Tacaswell
la source
6

Une meilleure solution à votre problème pourrait être la bibliothèque de graphiques . Il vous permet d'utiliser l'excellente bibliothèque javascript Highcharts pour créer de superbes graphiques interactifs. Highcharts utilise la svgbalise HTML pour que tous vos graphiques soient en fait des images vectorielles.

Certaines fonctionnalités:

  • Graphiques vectoriels que vous pouvez télécharger aux formats .png, .jpg et .svg pour ne jamais rencontrer de problèmes de résolution
  • Graphiques interactifs (zoom, glissement, survol des points, ...)
  • Utilisable dans un notebook IPython
  • Explorez des centaines de structures de données en même temps à l'aide des capacités de traçage asynchrone.

Avertissement: je suis le développeur de la bibliothèque

arnoutaertgeerts
la source
Une jolie bibliothèque! Je ne manquerai pas de l'essayer :)
metakermit
Merci! Faites-moi savoir ce que vous pensez sur github et soumettez un problème si vous rencontrez des problèmes :)
arnoutaertgeerts
1
Bien que cette réponse soit certainement pertinente, je ne l'appellerais pas nécessairement «une meilleure solution». C'est probablement ce qui a provoqué un vote négatif dans le passé.
volodymyr
1
Voté contre, car cet article ne me dit pas comment utiliser la bibliothèque de graphiques pour ouvrir une fenêtre de tracé interactif.
Robert Hönig
4

J'utilise ipython dans "jupyter QTConsole" d'Anaconda à www.continuum.io/downloads le 28/05/2011.

Voici un exemple pour basculer entre une fenêtre séparée et un mode de tracé en ligne à l'aide de la magie 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
la source
1
Lorsque j'essaie d'utiliser, %matplotlibj'obtiens une erreur qui se termine parImportError: No module named 'PyQt4'
user3731622
J'obtiens exactement le même problème que user3731622. Ce qui peut être fait? C'est pour la plupart des réponses sur cette page
bernando_vialli
@mkheifetz @ user3731622 Vous devrez peut-être installer le paquet: sudo apt-get install python-pyqt5ousudo apt-get install python-pyqt5
ttb
2

Redémarrez le noyau et effacez la sortie (si vous ne démarrez pas avec un nouveau notebook), puis exécutez

%matplotlib tk

Pour plus d'informations, accédez à Tracer avec matplotlib

Marcin Lentner
la source
0

Vous pouvez utiliser

%matplotlib qt

Si vous obtenez l'erreur, ImportError: Failed to import any qt bindinginstallez PyQt5 en tant que: pip install PyQt5et cela fonctionne pour moi.

susan097
la source