2016-08-01 35 views
2

Ich arbeite mit vier Sätze von Daten, jeder von ihnen haben mehrere Anzahl von Zeitreihen. Ich verwende Bokeh für alle von ihnen zusammen, sieht das Ergebnis wie folgt aus Plotten:mit MultiSelect Widget zum Ausblenden und Anzeigen von Linien in Bokeh

multiline graph bokeh with widget

from bokeh.plotting import figure, output_file, show 
from bokeh.palettes import RdYlGn4 
from bokeh.models import CustomJS, ColumnDataSource, MultiSelect 
from bokeh.layouts import row, widgetbox 

output_file("graph.html") 
p = figure(plot_width=1000, plot_height=400, x_axis_type="datetime", title="title") 
cadena=range(4) 
for i,comp in enumerate(cadena): 
    ts=[t for t in data_plu_price.columns if int(t) in df.T[df.C==comp].values] 
    n_lines=len(data[ts].columns) 
    p.multi_line(xs=[data[ts].index.values]*n_lines, ys=[data[t].values for t in ts],line_color=RdYlGn4[i], legend=str(i)) 
p.title.align = "center" 
p.title.text_font_size = "20px" 
p.xaxis.axis_label = 'date' 
p.yaxis.axis_label = 'price' 

callback = CustomJS("""Some Code""") 
multi_select = MultiSelect(title="Select:", value=cadena, 
         options=[(str(i), str(i)) for i in range(4)]) 
layout = row(p,widgetbox(multi_select)) 
show(layout) 

das Problem ist, dass es wirklich chaotisch aussieht, so wanned ich die Multiselect-Widget zu verwenden, um anzuzeigen/Verstecke alle Gruppen von Multilinien (4). Welche Art von Code muss ich bei der Erstellung des multi_line und im Callback-Objekt für diese Interaktion verwenden?

Jede Anleitung?

Vielen Dank im Voraus.

Antwort

2

Unterstützung genau das zu tun (einen Multiselect-Widget mit verstecken/show Linien) in der Version 0.12.1 in dieser PR wurde gerade hinzugefügt: https://github.com/bokeh/bokeh/pull/4868

Es gibt hier ein Beispiel (kopiert unten): https://github.com/bokeh/bokeh/blob/master/examples/plotting/file/line_on_off.py

""" Example demonstrating turning lines on and off - with JS only 

""" 

import numpy as np 

from bokeh.io import output_file, show 
from bokeh.layouts import row 
from bokeh.palettes import Viridis3 
from bokeh.plotting import figure 
from bokeh.models import CheckboxGroup, CustomJS 

output_file("line_on_off.html", title="line_on_off.py example") 

code = """ 
    if (0 in checkbox.active) { 
     l0.visible = true 
    } else { 
     l0.visible = false 
    } 
    if (1 in checkbox.active) { 
     l1.visible = true 
    } else { 
     l1.visible = false 
    } 
    if (2 in checkbox.active) { 
     l2.visible = true 
    } else { 
     l2.visible = false 
    } 
""" 

p = figure() 
props = dict(line_width=4, line_alpha=0.7) 
x = np.linspace(0, 4 * np.pi, 100) 
l0 = p.line(x, np.sin(x), color=Viridis3[0], legend="Line 0", **props) 
l1 = p.line(x, 4 * np.cos(x), color=Viridis3[1], legend="Line 1", **props) 
l2 = p.line(x, np.tan(x), color=Viridis3[2], legend="Line 2", **props) 

callback = CustomJS(code=code, args={}) 
checkbox = CheckboxGroup(labels=["Line 0", "Line 1", "Line 2"], active=[0, 1, 2], callback=callback, width=100) 
callback.args = dict(l0=l0, l1=l1, l2=l2, checkbox=checkbox) 

layout = row(checkbox, p) 
show(layout) 
+0

gab es ein Problem mit der Implementierung des Listeners, können Sie den ursprünglichen Code selbst ausprobieren und überprüfen, dass die Boxen nicht die Zeilen verstecken, die zu, vielleicht war ein Crossbrowsing-Problem mit js und Chrom. Wenn Sie alle Sätze (1 in checkbox.active) ändern mit "checkbox.active.includes (1)", die den Job erledigen. sogar tho, die Antwort war wirklich hilfreich –

+0

die 'checkbox.active.includes' Ergebnisse in' SCRIPT438: Objekt unterstützt keine Eigenschaft oder Methode 'umfasst' Datei: Funktionscode (1), Zeile: 3, Spalte: 5 'auf IE11 –

+0

und ich stimme mit @ pablo-a sein Kommentar. Dies verdeckt nicht die richtigen Zeilen, nur die ersten * n * Zeilen, die ausgewählt sind, also, wenn Sie die Zeilen 0 und 2 auswählen, zeigt es 0 und 1 (die ersten 2) –

Verwandte Themen