2016-07-22 22 views
0

Wie kann ich ähnliche Plots mit ipywidgets effizient mit Jupyter Notebook anzeigen?Wie man Element im Diagramm mit ipywidgets effizient ersetzt?

Ich möchte interaktiv ein schweres Diagramm (schwer in dem Sinne, dass es viele Datenpunkte hat und einige Zeit dauert, um es zu plotten) und ein einzelnes Element davon mit Interaktion von ipywidgets ändern, ohne die komplizierte Handlung neu zu plotten. Gibt es dafür eine eingebaute Funktionalität?

im Grunde, was ich versuche zu tun ist,

import numpy as np 
import matplotlib.pyplot as plt 
from ipywidgets import interact 
import matplotlib.patches as patches 
%matplotlib inline #ideally nbagg 

def complicated plot(t): 
    plt.plot(HEAVY_DATA_SET) 
    ax = plt.gca() 
    p = patches.Rectangle(something_that_depends_on_t) 
    ax.add_patch(p) 

interact(complicatedplot, t=(1, 100)); 

Gerade jetzt ist es bis zu 2 Sekunden für jede Replot nimmt. Ich erwarte, dass es Möglichkeiten gibt, die Figur dort zu halten und nur das Rechteck zu ersetzen.

Ein Hack wäre, eine Figur des konstanten Teils zu erstellen, es zum Hintergrund der Handlung zu machen und den rechteckigen Teil nur grafisch darzustellen. aber die Geräusche zu schmutzig

Danke

+0

Können Sie weitere Details darüber hinzufügen, was Sie wirklich tun möchten? In Streudiagrammen zum Beispiel, wenn Ihr Plot in der 'p'-Variable referenziert wird, könnten Sie einfach' p.set_offsets' verwenden, um die Daten neu zu definieren. Vielleicht kannst du etwas wie "ax.get_children()" machen und eines dieser Objekte verändern. Und für die Widgets denke ich, dass ipywidgets eine 'observe'-Methode haben, in der Sie eine Funktion definieren können, in Ihrem Fall können Sie die Funktion zum Ändern Ihres Plots definieren. –

+0

Ich möchte 100 Liniendiagramme anzeigen (plt.plot (HEAVY_DATA_SET)) und dann fügen Sie einfach ein vertikales Rechteck über diese Linien hinzu. – gota

+0

Vielleicht können Sie das Rechteck aus 'ax.get_children()' entfernen und das Rechteck einfach neu zeichnen? Zum Beispiel, wenn Sie 'ax.get_children()' aufrufen, werden Sie in der Liste einige '

Antwort

1

Dies ist ein grobes Beispiel einer interaktiven Art und Weise ein Rechteck Breite zu ändern (ich nehme an, Sie sind in einem IPython oder Jupyter Notebook):

import matplotlib 
import matplotlib.pyplot as plt 
import matplotlib.patches as patches 

import ipywidgets 
from IPython.display import display 

%matplotlib nbagg 

f = plt.figure() 
ax = plt.gca() 

ax.add_patch(
    patches.Rectangle(
     (0.1, 0.1), # (x,y) 
     0.5,   # width 
     0.5,   # height 
    ) 
) 

# There must be an easier way to reference the rectangle 
rect = ax.get_children()[0] 

# Create a slider widget 
my_widget = ipywidgets.FloatSlider(value=0.5, min=0.1, max=1, step=0.1, description=('Slider')) 

# This function will be called when the slider changes 
# It takes the current value of the slider 
def change_rectangle_width(): 
    rect.set_width(my_widget.value) 
    plt.draw() 

# Now define what is called when the slider changes 
my_widget.on_trait_change(change_rectangle_width) 

# Show the slider 
display(my_widget) 

Wenn Sie dann den Schieberegler verschieben, ändert sich die Breite des Rechtecks. Ich werde versuchen, den Code aufzuräumen, aber Sie haben vielleicht die Idee. Um die Koordinaten zu ändern, müssen Sie rect.xy = (x0, y0) eingeben, wobei x0 und y0 neue Koordinaten sind.

Verwandte Themen