2017-02-01 2 views
1

Arbeiten in einem Bokeh-Diagramm, das 35 Zeilen enthält, beim Versuch, sie sichtbar und unsichtbar mit Checkbox Widget diesen Fehler entsteht, wenn in einem der Elemente des Kontrollkästchens, und keine Zeile verschwindet. Die Protokolle sind:Wert Fehler beim Versuch, Bokeh Widget Checkbox-Gruppe mit mehreren Zeilen und ihre Attribute "sichtbar"

PS C:\Users\407334\pad-s100> bokeh serve plot4.py 
2017-02-01 14:42:36,759 Starting Bokeh server version 0.12.4 
2017-02-01 15:09:13,523 Starting Bokeh server on port 5006 with applications at paths ['/plot4'] 
2017-02-01 15:09:13,525 Starting Bokeh server with process id: 11116 
2017-02-01 15:10:05,821 200 GET /plot4 (::1) 6733.00ms 
2017-02-01 15:10:06,246 WebSocket connection opened 
2017-02-01 15:10:06,247 ServerConnection created 
2017-02-01 15:10:30,026 error handling message Message 'PATCH-DOC' (revision 1): ValueError('too many values to unpack', 
) 

Das Skript Python verwendet beeinflusst wird durch this example:

from bokeh.layouts import row 
from bokeh.plotting import figure 
from bokeh.io import curdoc 
from bokeh.palettes import inferno 
from bokeh.models.widgets import CheckboxGroup 
import pandas as pd 

p = figure(title="Motor-Block Monitorization", width=900, plot_height=900, x_axis_type='datetime') 

numlines = len(df.columns) 
mypalette = inferno(numlines) 
line_set = dict() 

for (x, column_names, colores) in zip(range(0, numlines), df.columns.values, mypalette): 
    if column_names != 'Date' and column_names != 'Time': 
     line_set["line{0}".format(x)] = p.line(df.index, df[column_names], color=colores) 

act = range(0, numlines) 
checkbox = CheckboxGroup(labels=list(df.columns.values), 
        active=act) 


def update(attr, old, new): 
    for i, element in line_set: 
     element.visible = i in checkbox.active 

checkbox.on_change('active', update) 
main_column = row(p, checkbox) 
curdoc().add_root(main_column) 

Verschiedene Möglichkeiten zeichnen sie getestet wurden, aber der Fehler ist immer noch da.

Dies ist das Grundstück Arbeits: Bokeh Plot

+0

welche Möglichkeiten getestet wurden? – WhatsThePoint

+0

@WhatsThePoint nach Optionen Ich meine verschiedene Möglichkeiten, die Linien zu zeichnen. Entschuldigung, wenn ich dich verwirrt habe. – BSP

+0

Nur als ein FYI, Bokeh '0.12.5' wird eine" interaktive Legende "Fähigkeit eingebaut haben. – bigreddot

Antwort

1

checkbox.active ist eine Liste von ganzen Zahlen von 0 bis n-1, so dass, wenn Sie nach einer Übereinstimmung suchen LINE0, line1 ... konvertieren, dass in Integer, das heißt:

Anstatt ein Wörterbuch zu erstellen, kann eine Liste ausgefüllt werden. Dadurch bleibt die Reihenfolge erhalten, sodass der Schlüssel des Wörterbuchs nicht mit dem aktiven Kontrollkästchen übereinstimmen muss. Ich habe einige Panda-Daten erstellt, mit denen ich spielen kann. Der folgende Code der spätere Idee funktioniert, zumindest in Bokeh Version 0.12.4 mit python2.7 Umsetzung:

import bokeh 
import bokeh.plotting 

# Begin Creating some panda data 
# ------------------------------ 
import datetime 
import pandas as pd 
todays_date = datetime.datetime.now().date() 
cols = 20;rows = 10. 
index = pd.date_range(todays_date, periods=rows, freq='D') 
columns = ['col%d'%x for x in range(cols)] 
data = [pd.np.arange(cols)/10.+x for x in pd.np.arange(rows)/rows] 
df = pd.DataFrame(data, index=index, columns=columns) 
# ---------------------------- 
# End Creating some panda data 

p = bokeh.plotting.figure(title="Motor-Block Monitorization", 
          width=500, plot_height=500, x_axis_type='datetime') 

numlines = len(df.columns) 
mypalette = bokeh.palettes.inferno(numlines) 
line_list = [] 

for (column_names, colores) in zip(df.columns.values, mypalette): 
    if column_names != 'Date' and column_names != 'Time': 
     line_list += [p.line(df.index, df[column_names], color=colores)] 

act = range(0, numlines) 
checkbox = bokeh.models.CheckboxGroup(labels=list(df.columns.values), 
        active=act) 

def update(attr, old, new): 
    for i, element in enumerate(line_list): 
     element.visible = i in checkbox.active 

checkbox.on_change('active', update) 
main_column = bokeh.layouts.row(p, checkbox) 
bokeh.io.curdoc().add_root(main_column) 

enter image description here

+0

Danke! Jetzt funktioniert es großartig! Und Ihr Code in dem Beispiel ist viel sauberer und klarer als meiner. – BSP

+0

Danke. Dies gibt mir die Möglichkeit, zum ersten Mal eine Bokeh-Server-Anwendung zu erstellen. Zuvor verwendete ich statische Bokeh-Seiten mit viel JavaScript, um die Interaktion zu verwalten. Verwenden Sie auch XMLHttpRequest, um mit CGI-Programmen auf dem Server zu kommunizieren. Ich wusste, dass Bokeh-Server die einzige Möglichkeit war, mit Python umzugehen, aber ich musste ein Beispiel erstellen. Nun, hier ist es. –

Verwandte Themen