2016-03-20 6 views
5

मैं बोके का मूल्यांकन कर रहा हूं यह देखने के लिए कि क्या यह अधिक व्यापक उपयोग के लिए तैयार है या नहीं। मैंने डेटाफ्रेम के दो कॉलम (अंत में कोड), "बंद करें" और "विज्ञापन बंद करें" की योजना बनाई है। enter image description hereबोके विजेट-वर्किंग चेकबॉक्स समूह उदाहरण

मैं प्लॉट में लाइन लाइन दोनों के प्रदर्शन को टॉगल करने के लिए चेकबॉक्स में रखना चाहता हूं। तो यदि प्रासंगिक चेकबॉक्स अनचेक किया गया है तो रेखा प्रकट नहीं होती है। http://bokeh.pydata.org/en/latest/docs/user_guide/interaction.html पर बोके दस्तावेज चेकबॉक्स समूह के बारे में बात करता है लेकिन एक स्पष्ट कामकाजी उदाहरण प्रदान नहीं करता है। मैं डेटाफ्रेम के कॉलम के लिए काम कर रहे चेकबॉक्स प्राप्त करने में किसी भी मदद की सराहना करता हूं।

import pandas as pd 
from bokeh.plotting import figure, output_file, show 

IBM = pd.read_csv(
     "http://ichart.yahoo.com/table.csv?s=IBM&a=0&b=1&c=2011&d=0&e=1&f=2016", 
     parse_dates=['Date']) 

output_file("datetime.html") 

p = figure(width=500, height=250, x_axis_type="datetime") 

p.line(IBM['Date'], IBM['Close'], color='navy', alpha=0.5) 
p.line(IBM['Date'], IBM['Adj Close'], color='red', alpha=0.5) 

show(p) 

उत्तर

1

मैं अभी तक काम करने के लिए चेक बॉक्स नहीं प्राप्त कर पाया है, हालांकि अगर मैं कार्यक्षमता जल्द ही आ रहा हूं तो मुझे आश्चर्य नहीं होगा।

from bokeh.io import vform 
from bokeh.models import CustomJS, ColumnDataSource, MultiSelect 
from bokeh.plotting import figure, output_file, show 
import pandas as pd 

IBM = pd.read_csv(
     "http://ichart.yahoo.com/table.csv?s=IBM&a=0&b=1&c=2011&d=0&e=1&f=2016", 
     parse_dates=['Date']) 

output_file("datetime.html") 
source = ColumnDataSource({'x': IBM['Date'], 'y1': IBM['Close'], \ 
'y2': IBM['Adj Close'], 'y1p': IBM['Close'], 'y2p': IBM['Adj Close']}) 

p = figure(width=500, height=250, x_axis_type="datetime") 

p.line('x', 'y1', source=source, color='navy', alpha=0.5) 
p.line('x', 'y2', source=source, color='red', alpha=0.5) 

callback = CustomJS(args=dict(source=source), code=""" 
     var data = source.get('data'); 
     var f = cb_obj.get('value') 
     y1 = data['y1'] 
     y2 = data['y2'] 
     y1p = data['y1p'] 
     y2p = data['y2p'] 
     if (f == "line2") { 
      for (i = 0; i < y1.length; i++) { 
       y1[i] = 'nan' 
       y2[i] = y2p[i] 
      } 
     } else if (f == "line1") { 
      for (i = 0; i < y2.length; i++) { 
       y1[i] = y1p[i] 
       y2[i] = 'nan' 
      } 
     } else if (f == "none") { 
      for (i = 0; i < y2.length; i++) { 
       y1[i] = 'nan' 
       y2[i] = 'nan' 
      } 
     } else { 
      for (i = 0; i < y2.length; i++) { 
       y1[i] = y1p[i] 
       y2[i] = y2p[i] 
      } 
     } 
     source.trigger('change'); 
    """) 

multi_select = MultiSelect(title="Lines to plot:", \ 
value=["line1", "line2", "none"], \ 
options=["line1", "line2", "none"], callback=callback) 
layout = vform(multi_select, p) 
show(layout) 

उत्पादन इस तरह दिखता है: enter image description here

+0

उदाहरण के लिए धन्यवाद। मैं मोटे तौर पर कॉलम की मनमानी संख्या के डेटाफ्रेम पर इसे विस्तारित करने के तरीके को देख सकता हूं। ColumnDataSource के लिए जेनरेट आईडी स्ट्रिंग की एक सूची बनाएं। फिर कस्टमजेएस में उन तारों को प्लग करने के लिए string.format() करें जिन्हें विस्तारित करने की भी आवश्यकता है। बड़ी तस्वीर को देखते हुए, ऐसा लगता है कि बोके में प्लॉटली की कुछ कार्यक्षमता की कमी है लेकिन यहां तक ​​कि यहां कुछ चीजें गायब हैं। पायथन-जावास्क्रिप्ट इंटरफ़ेस समस्याग्रस्त है। मैं शुद्ध जेएस समाधानों को देखने के लिए प्रेरित हूं जो पायथन द्वारा जेएसओएन फाइलों को खिलाते हैं। – Spinor8

+1

हाँ, यह उत्तर बड़ी संख्या में लाइनों के लिए बहुत सुंदरता से स्केल नहीं करता है। बड़ी तस्वीर, मैं मानता हूं कि अब तक बोके थोड़ा सीमित लगता है, लेकिन मैं थोड़ी देर के लिए इसके साथ खेल रहा हूं, इसलिए मुझे उम्मीद है कि यह समय के साथ सुधार होगा। मुझे लगता है कि शुद्ध जेएस का विकास निश्चित रूप से इस तरह की चीज़ों में से किसी के लिए भुगतान करेगा - शायद बोके में योगदान दे रहा है ?! – Peter

4

यह स्पष्ट रूप से एक देर से उत्तर है, लेकिन मैं वर्तमान में करने के लिए अजगर और बोकेह जानने के लिए कोशिश कर रहा हूँ इस बीच, यहां एकाधिक चयन करें विजेट का उपयोग एक समाधान नहीं है कुछ प्रकार के डेटा डैशबोर्ड को हैक करें। मैं यह पता लगाने की कोशिश कर रहा था कि चेकबॉक्स कैसे काम करते थे और मैंने आपके प्रश्न पर ठोकर खाई। यह समाधान केवल बोके सेवा के साथ काम करता है। मुझे नहीं पता कि इसे HTML आउटपुट में कैसे काम करना है।

मैं केवल लाइन दृश्यता को संशोधित कर रहा हूं, न कि स्रोत। मैंने अभी तक यह कोशिश नहीं की लेकिन मुझे यकीन है कि किंवदंतियों अभी भी अदृश्य लाइनों

डक्ट टेप कोड के लिए माफी दिखाएगी।

#-| bokeh serve 
#-| 

import pandas as pd 
from bokeh.io import curdoc,output_file, show 
from bokeh.layouts import row, widgetbox 
from bokeh.plotting import figure 
from bokeh.models import ColumnDataSource 
from bokeh.models.widgets import * 

#Widgets 

ticker = TextInput(title='Ticker Symbol',value='IBM') 
button=Button(label='Lookup',button_type='success') 
log = Paragraph(text="""log""", 
width=200, height=100) 
cb_group = CheckboxButtonGroup(labels=['Close', 'Adj Close'],active=[0,1]) 
cb_group.labels.append('Placebo') 

#Plot 

p = figure(title='',width=500, height=250, x_axis_type='datetime') 

source = ColumnDataSource({'x': [], 'y1': [],'y2': []}) 

lineClose=p.line('x','y1',source=source, color='navy', alpha=0.5) 
lineAdj=p.line('x','y2',source=source, color='red', alpha=0.5) 

lines=[lineClose,lineAdj] 

#Event handling 

def error(msg): 
    log.text=msg 

def update_data(): 
    try: 
     src='http://ichart.yahoo.com/table.csv?s={symb}&a=0&b=1&c=2011&d=0&e=1&f=2016'.format(symb=ticker.value) 
     df=pd.read_csv(src,parse_dates=['Date']) 
     source.data=({'x': df['Date'], 'y1': df['Close'],'y2': df['Adj Close']}) 
    except: 
     error('Error ticker') 

def update_plot(new): 

    switch=cb_group.active 
    for x in range(0,len(lines)): 
     if x in switch: 
      lines[x].visible=True 
     else: 
      lines[x].visible=False 

    error('<CheckboxButtonGroup>.active = '+str(switch)) 

button.on_click(update_data) 
cb_group.on_click(update_plot) 


inputs=widgetbox(ticker,button,cb_group,log) 

curdoc().add_root(row(inputs,p,width=800)) 
curdoc().title = 'Bokeh Checkbox Example' 
button.clicks=1 

मैं अगर मैं चेकबॉक्स समूह बजाय ठेठ विधि को संलग्न कर सकता है तो मैं वहाँ एक रास्ता अधिक सुंदर ढंग से और गतिशील रूप से चेक बॉक्स को जोड़ने के लिए है यकीन है कि देखने के लिए 'प्लेसबो' चेकबॉक्स गयी।

what it should look like

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