2017-12-20 28 views
0

Ich möchte eine Bokeh-App mit einem interaktiven Widget ausführen, kann es aber nicht voll funktionsfähig machen.Laufendes Bokeh mit interaktiven Widgets

Mein Code demo.py:

# imports 
import pandas as pd 
from bokeh.io import curdoc 
from bokeh.layouts import column 
from bokeh.models import ColumnDataSource, Dropdown 
from bokeh.plotting import figure 
from bokeh.sampledata.iris import flowers 

# Data 
df = pd.DataFrame({'x': flowers['sepal_length'], 'y': flowers['sepal_width'], 'species': flowers['species']}) 

# Source 
SPECIES = 'versicolor' 
source = ColumnDataSource(df.loc[df.species == SPECIES]) 

# Create plots and widgets 
plot = figure() 
plot.circle(x= 'x', y='y', source=source) 

menu = [("setosa", "setosa"), ("versicolor", "versicolor"), None, ("virginica", "virginica")] 
dropdown = Dropdown(label="Dropdown species", button_type="warning", menu=menu) 

# Add callback to widgets 
def callback(attr, old, new): 
    SPECIES = dropdown.value 
    source.data=ColumnDataSource(df.loc[df.species == SPECIES]) 
dropdown.on_change('value', callback) 

# Arrange plots and widgets in layouts 
layout = column(dropdown, plot) 
curdoc().add_root(layout) 

Wenn ich diese App aus der Kommandozeilen-Schnittstelle ausgeführt mit bokeh serve --show demo.py, es gibt eine HTML-Seite mit einem Grundstück. Das Dropdown scheint zu funktionieren, aber das Diagramm ändert sich nicht, wenn ein Wert aus dem Dropdown ausgewählt wird.

Irgendwelche Vorschläge, wie Sie das beheben können?

Antwort

1

Sie geben source.data nicht den richtigen Wert zu. Der Wert muss ein reguläres Python-Dict sein, das Spaltennamen Listen/Datenfeldern zuordnet. Es gibt eine Vielzahl von Möglichkeiten, die in der Dokumentation und Beispielen demonstriert zu tun, aber ein guter Weg ist, um die from_df Klassenmethode von CDS zu verwenden, um die richtige Art von dict zu generieren:

source.data = ColumnDataSource.from_df(df.loc[df.species == SPECIES]) 

Diese Linie macht den Code Arbeit wie erwartet.

Als FYI, erzeugt der Code einen Fehler in der Serverkonsole Ausgang (wie erwartet werden sollte):

Fehlerbehandlung Nachricht Message 'PATCH-DOC' (Revision 1): Valueerror ("ein erwarteter Element ColumnData (String, Seq (Any)), bekam ColumnDataSource (id = '44e09b5e-133b-4c1b-987b-cbf80b803401', ...)“,)

Als sanften Vorschlag, es ist immer ein gute Idee, solche Fehler in SO-Fragen einzubeziehen.

+0

Vielen Dank für Ihre Hilfe und sanften Vorschlag ;-) – Rene