web-dev-qa-db-fra.com

Jupyter Notebook: graphique interactif avec des widgets

J'essaie de générer un graphique interactif qui dépend de widgets. Le problème que j'ai, c'est que lorsque je modifie les paramètres à l'aide du curseur, un nouveau tracé est créé après le précédent. Au lieu de cela, je m'attendrais à ce qu'un seul tracé change en fonction des paramètres.

Exemple:

from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets

import matplotlib.pyplot as plt
%matplotlib inline

import numpy as np

def plot_func(freq):
    x = np.linspace(0, 2*np.pi)
    y = np.sin(x * freq)
    plt.plot(x, y)

interact(plot_func, freq = widgets.FloatSlider(value=7.5,
                                               min=1,
                                               max=5.0,
                                               step=0.5))

Après avoir déplacé le curseur vers 4.0, j'ai:

enter image description here

alors que je veux juste un chiffre à changer que je déplace le curseur. Comment puis-je atteindre cet objectif?

(J'utilise Python 2.7, matplotlib 2.0 et je viens de mettre à jour notebook et jupyter vers la dernière version. Laissez-moi savoir si d'autres informations sont nécessaires.)

19
FLab

Si vous souhaitez modifier le chiffre, au lieu d'en créer un nouveau, permettez-moi de vous suggérer le chemin suivant:

  1. Utilisez un serveur interactif; %matplotlib notebook
  2. Mettez à jour la ligne dans l'intrigue, au lieu d'en dessiner de nouvelles.

Donc, le code pourrait ressembler à quelque chose comme ça:

%matplotlib notebook
from ipywidgets import *
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
line, = ax.plot(x, np.sin(x))

def update(w = 1.0):
    line.set_ydata(np.sin(w * x))
    fig.canvas.draw_idle()

interact(update);

enter image description here

Sinon, vous pouvez utiliser plt.show() comme dans cette réponse .

Ceci est un problème (?) Introduit dans la dernière version de jupyter et/ou ipywidgets. Une solution de contournement que j'ai trouvée consistait à ajouter la ligne plt.show() à la fin de plot_func.

2
Stelios