web-dev-qa-db-fra.com

Comment afficher les graphiques matplotlib dans un widget onglet Jupyter?

J'ai du mal à afficher des tracés à l'intérieur des widgets de l'onglet Jupyter. Considérez l'extrait de code suivant:

import matplotlib.pyplot as plt
import pandas as pd
import ipywidgets as widgets
import numpy as np

out1 = widgets.Output()
out2 = widgets.Output()
data1 = pd.DataFrame(np.random.normal(size = 50))
data2 = pd.DataFrame(np.random.normal(size = 100))

with out1:
    fig1, axes1 = plt.subplots()
    data1.hist(ax = axes1)
    display(fig1)

with out2:
    fig2, axes2 = plt.subplots()
    data2.hist(ax = axes2)
    display(fig2)

tab = widgets.Tab(children = [out1, out2])
tab.set_title(0, 'First')
tab.set_title(1, 'Second')
display(tab)

(J'exécute Python 3.5.2, Jupyter 4.4.0, ipywidgets 7.2.1 sur Ubuntu 16.04 dans un environnement virtuel.)

Si je mets ce code sur la première ligne du cahier et l'exécute, je vois un widget d'onglet avec deux onglets, chacun affichant une chaîne, mais pas l'intrigue:

No plots

Si je l'exécute une deuxième fois, ou si je le relance en mettant tout après l'importation de matplotlib dans une deuxième cellule, je vois un widget d'onglet avec un tracé sur chaque onglet, mais j'obtiens les deux tracés affichés une deuxième fois en dehors des onglets.

Too many plots

Je peux me débarrasser des affichages supplémentaires en enveloppant mon code dans des appels à plt.ioff et plt.ion, mais il m'a été suggéré qu'il s'agit d'un hack. Et en tout cas, cela ne fait pas afficher à matplotlib les tracés dans la première cellule.

Question : Quelle est la bonne façon d'afficher les tracés à l'intérieur des onglets?

10

J'ai ajouté quelques éléments pour que votre code fonctionne comme vous le souhaitez

  • Ajoutez %matplotlib inline En haut de la cellule
  • Remplacez vos appels display(fig) par des appels plt.show(fig).
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
import ipywidgets as widgets
import numpy as np

out1 = widgets.Output()
out2 = widgets.Output()
data1 = pd.DataFrame(np.random.normal(size = 50))
data2 = pd.DataFrame(np.random.normal(size = 100))

tab = widgets.Tab(children = [out1, out2])
tab.set_title(0, 'First')
tab.set_title(1, 'Second')
display(tab)

with out1:
    fig1, axes1 = plt.subplots()
    data1.hist(ax = axes1)
    plt.show(fig1)

with out2:
    fig2, axes2 = plt.subplots()
    data2.hist(ax = axes2)
    plt.show(fig2)
10
ac24