2016-03-20 32 views
5

Daha kapsamlı kullanıma hazır olup olmadığını görmek için Bokeh'i değerlendiriyorum. Bir veri çerçevesinin iki sütununu (sonunda kod), “Kapat” ve “Kapat” komutlarını çizdim. enter image description hereBokeh eklendi-Çalışma Kutusu Grup Örneği

Çizelgede hem grafiklerin görünümünü değiştirmek için onay kutularını koymak istiyorum. Dolayısıyla, ilgili onay kutusu işaretli değilse, çizgi görünmez. http://bokeh.pydata.org/en/latest/docs/user_guide/interaction.html'daki Bokeh belgeleri, onay kutusu grubu hakkında konuşur, ancak açık bir çalışma örneği sağlamaz. Bir veri çerçevesinin sütunları için çalışan onay kutularını alma konusunda herhangi bir yardım için minnettarım.

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) 

cevap

1

Henüz bu işlevin yakında gelip gelmeyeceğini şaşırmamasına rağmen, henüz onay kutularını alamıyordum.

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) 

çıktı şuna benzer:: enter image description here

+0

Örnek için teşekkürler. Bunu kabaca, rasgele sayıdaki sütunların bir veri çerçevesine nasıl genişletebileceğimi görebiliyorum. ColumnDataSource için oluşturulan kimlik dizelerinin bir listesini oluşturun. Ardından, genişletilmesi gereken CustomJS'deki bu dizeleri eklemek için bir string.format() yapın. Büyük resme bakıldığında, Bokeh'in Plotly'nin bir kaç işlevselliğinden yoksun olduğu anlaşılıyor, ama burada bile birkaç şey eksik. Python-Javascript arayüzü sorunludur. Python tarafından üretilen JSON dosyalarını besleyen saf JS çözümlerine bakmaya başlıyorum. – Spinor8

+1

Evet, bu cevap çok sayıda çizgi için çok zarif ölçeklenmiyor. Daha büyük resim, şimdiye kadar bokeh biraz sınırlı gibi görünüyor, ama sadece bir süredir bununla oynuyordum, bu yüzden zamanla gelişir umuyoruz. Saf JS'nin geliştirilmesinin, bu türden bir çok şeyi yapan biri için kesinlikle para ödeyeceğini düşünüyorum - belki de bokeh'ye katkıda bulunuyorsunuz ?! – Peter

4

Bu açıkça bir geç cevap ama şu anda piton ve bokeh öğrenmeye çalışıyorum arada, burada multiselect widget kullanarak bir çözüm olduğunu Bir çeşit veri panosunu kesmek. Onay kutularının nasıl çalıştığını anlamaya çalışıyordum ve ben senin sorunun üzerine düştüm. Bu çözüm sadece bokeh servisi ile çalışır. Bir HTML çıktısında nasıl çalışacağını bilmiyorum.

Yalnızca görünürlük çizgisini değiştiriyorum, kaynağı değil. Ben henüz denemedim ama efsaneler hala görünmez çizgiler

Kanal teyp kodu özür dilerim.

#-| 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 

Ben daha zarif ve dinamik onay kutularını eklemek için bir yol var eminim bu yüzden onay kutusu grubunun yerine tipik yöntemine eklemek olabilir görmek için 'Placebo'nun' onay kutusunu ekledi.

what it should look like