wake-up-neo.com

Jupyter Notebook: Interaktiver Plot mit Widgets

Ich versuche ein interaktives Diagramm zu erstellen, das von Widgets abhängt. Das Problem, das ich habe, ist, dass wenn ich Parameter mit dem Schieberegler ändere, ein neues Diagramm nach dem vorherigen erstellt wird, stattdessen würde ich nur ein Diagramm erwarten, das sich entsprechend den Parametern ändert.

Beispiel:

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

Nach dem Verschieben des Schiebereglers auf 4.0 habe ich:

enter image description here

ich möchte nur, dass sich eine Figur ändert, wenn ich den Schieberegler bewege. Wie kann ich das erreichen?

(Ich verwende Python 2.7, matplotlib 2.0 und habe gerade Notebook und Jupyter auf die neueste Version aktualisiert. Lassen Sie mich wissen, wenn weitere Informationen benötigt werden.)

19
FLab

Da Sie die Abbildung ändern möchten, anstatt eine neue zu erstellen, kann ich Folgendes vorschlagen:

  1. Verwenden Sie ein interaktives Backend. %matplotlib notebook
  2. Aktualisieren Sie die Linie im Plot, anstatt neue zu zeichnen.

Der Code könnte also so aussehen:

%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

Alternativ können Sie plt.show() wie in diese Antwort verwenden.

Dies ist ein Problem (?), Das in der letzten Version von jupyter und/oder ipywidgets eingeführt wurde. Eine Problemumgehung, die ich gefunden habe, war das Hinzufügen der Zeile plt.show() am Ende von plot_func.

2
Stelios