2015-08-27 11 views
15

बोके प्लॉट में लाइनों को अंतःक्रियात्मक रूप से प्रदर्शित करने और छिपाने में सक्षम होना अच्छा होगा।बोके प्लॉट में लाइनों को अंतःक्रियात्मक रूप से प्रदर्शित और छिपाने के लिए कैसे?

from bokeh.plotting import output_file, figure, show 
from numpy.random import normal, uniform 

meas_data_1 = normal(0, 1, 100) 
meas_data_2 = uniform(-0.5, 0.5, 100) 

output_file("myplot.html", title="My plot") 
fig = figure(width=500, plot_height=500) 

fig.line(x=range(0, len(meas_data_1)), y=meas_data_1) 
fig.line(x=range(0, len(meas_data_2)), y=meas_data_2) 

show(fig) 

मैं संभावना सहभागी सक्रिय/दो लाइनों में से एक को निष्क्रिय कैसे जोड़ सकते हैं: कहो, मैं इस तरह मेरे भूखंड कुछ बनाया है?

मुझे पता है कि यह इच्छा सूची में है (this feature request देखें), लेकिन ऐसा लगता है कि यह बहुत जल्द लागू नहीं होगा।

मैं धारणा है कि इस का उपयोग करते हुए संभव हो जाना चाहिए एक CheckBoxGroup और एक self-defined callback, लेकिन दुर्भाग्य से यह कॉलबैक जावास्क्रिप्ट, जो मैं में बिल्कुल कोई अनुभव नहीं है में लिखा जाना है।

उत्तर

12

संपादित: इंटरएक्टिव किंवदंतियों अब Bokeh 0.12.5 के रूप में पुस्तकालय में निर्माण कर रहे हैं, को देखने के https://bokeh.github.io/blog/2017/4/5/release-0-12-5/


इस ट्रैक पर दिखाई देता है इंटरैक्टिव किंवदंतियों के रूप में कुछ बिंदु पर लागू किया जाना: https://github.com/bokeh/bokeh/issues/3715

वर्तमान में (v0.12.1), एक उदाहरण है जो इसे प्राप्त करने के लिए चेकबॉक्स पर कस्टमजेएस का उपयोग करता है: https://github.com/bokeh/bokeh/pull/4868

प्रासंगिक कोड:

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

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) 

checkbox = CheckboxGroup(labels=["Line 0", "Line 1", "Line 2"], 
         active=[0, 1, 2], width=100) 
checkbox.callback = CustomJS(args=dict(l0=l0, l1=l1, l2=l2, checkbox=checkbox), 
          lang="coffeescript", code=""" 
l0.visible = 0 in checkbox.active; 
l1.visible = 1 in checkbox.active; 
l2.visible = 2 in checkbox.active; 
""") 

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

संपादन के लिए धन्यवाद! साइड प्रश्न: क्या अलग-अलग चर के बजाय प्रस्तुतकर्ताओं की सूची का उपयोग करके ऐसा करने का कोई तरीका है? मैं एक बार में ~ 30 विभिन्न प्रस्तुतकर्ताओं का एक सेट दिखाना/छिपाना चाहता हूं। – user2561747

+0

शायद, आप 'args' dict, IIRC में मानों में से एक के रूप में एक सूची को पास करने में सक्षम होना चाहिए। – bigreddot

+0

काम करने के लिए यह नहीं मिल सका, बोके ने 'ValueError उठाया: डिक्ट (स्ट्रिंग, इंस्टेंस (मॉडल)) के तत्व की अपेक्षा की गई, {'renderers': [ पर .. ।], 'चेकबॉक्स': } ' – user2561747

2

मैं गलत हो सकता है, लेकिन यह मुझे लगता है कोई आईडी विभिन्न लाइनों के लिए उपलब्ध है कि वहाँ है, उन्हें छुपाने का एक ही रास्ता एक document.getElementById("idSelected").style.visibility = "hidden";

CheckBoxGroup के बाद से एक कॉलबैक उपलब्ध मैं एक Select उपयोग करने का फैसला नहीं है ऐसा करने के लिए हो गया होता। मैं CustomJS में चयनित स्रोत प्राप्त कर सकते हैं, लेकिन यह काफी सब है:

from bokeh.io import vform 
from bokeh.models import CustomJS, ColumnDataSource, Select 
from bokeh.plotting import output_file, figure, show 
from numpy.random import normal, uniform 

meas_data_1 = normal(0, 1, 10) 
meas_data_2 = uniform(-0.5, 0.5, 10) 

x1 = range(0, len(meas_data_1)) 
y1 = meas_data_1 
source1 = ColumnDataSource(data=dict(x=x1, y=y1)) 
x2 = range(0, len(meas_data_2)) 
y2 = meas_data_2 
source2 = ColumnDataSource(data=dict(x=x2, y=y2)) 



output_file("myplot.html", title="My plot") 
fig = figure(width=500, plot_height=500) 

fig.line('x', 'y', source=source1, line_width=3, line_alpha=0.6) 
fig.line('x', 'y', source=source2, line_width=3, line_alpha=0.6) 

select = Select(title="Option:", options=["source1", "source2"]) 

select.callback = CustomJS(args=dict(source1=source1, source2=source2, select=select), code=""" 

     console.log(select.attributes.value); 
    """) 



show(vform(fig, select)) 

शायद तुम "मरोड़" कर सकते हैं CustomJS में डेटा यह सब 0 के आधार पर कर रही है क्या चयन किया जाता है, या हो सकता है अगर आप कर सकते हैं line_width प्रॉपर्टी तक पहुंचें और इसे 0 बनाएं, लेकिन यह काफी है जो मैं सोच सकता हूं।

+0

downvote के लिए क्षमा करें, '0.12.1' फिर से नया उत्तर सबसे वर्तमान जानकारी/नई सुविधाओं इतना सरल बनाने के लिए दर्शाता है। – bigreddot

संबंधित मुद्दे