2017-01-30 168 views
0

我試圖根據用戶的「MultiSelect」選項將多行繪製到圖形中。我讀了兩個獨立的數據excel文件,並根據用戶的請求繪製軸。我正在使用Python 3.5並在MAC上運行。散景MultiSelect繪製在無限循環中,扭曲陰謀

1)。只要我做了多選,圖形就會變形

2)。看來情節正在無限循環中運行。 3)。當用戶改變選擇時,繪圖劑量不能正確更新。它只是添加更多的情節而不刪除以前的情節。

from os.path import dirname, join 
from pandas import * 

import numpy as np 
import pandas.io.sql as psql 
import sqlite3 as sql 
import sys, os 

from bokeh.plotting import figure 
from bokeh.layouts import layout, widgetbox 
from bokeh.models import ColumnDataSource, HoverTool, Div 
from bokeh.models.widgets import Slider, Select, TextInput, MultiSelect 
from bokeh.io import curdoc 
import matplotlib.pyplot as plt 

files = list() 
path = os.getcwd() 
for x in os.listdir(path): 
    if x.endswith(".xlsx"): 
    if x != 'template.xlsx' : 
    files.append(x) 

axis_map = { 
    "0% void": "0% void", 
    "40% void": "40% void", 
    "70% void": "70% void", 
} 


files_list = MultiSelect(title="Files", value=["dummy2.xlsx"],  
options=open(join(dirname(__file__), 'files.txt')).read().split()) 
voids = MultiSelect(title="At what void[s]", value=["0% void"], options=sorted(axis_map.keys())) 

p = figure(plot_height=600, plot_width=700, title="", toolbar_location=None) 
pline = figure(plot_height=600, plot_width=700, title="") 

path = os.getcwd() 
data_dict = {} 
for file in os.listdir(path): 
if file.endswith(".xlsx"): 
    xls = ExcelFile(file) 
    df = xls.parse(xls.sheet_names[0]) 
    data = df.to_dict() 
    data_dict[file] = data 


# converting dictionary to dataframe 
newdict = {(k1, k2):v2 for k1,v1 in data_dict.items() \ 
         for k2,v2 in data_dict[k1].items()} 
xxs = DataFrame([newdict[i] for i in sorted(newdict)], 
        index=MultiIndex.from_tuples([i for i in sorted(newdict.keys())])) 
master_data = xxs.transpose() 

def select_data(): 
    for vals in files_list.value: 
     for vox in voids.value: 
      pline.line(x=master_data[vals]['Burnup'], y= master_data[vals][vox]) 
      pline.circle(x=master_data[vals]['Burnup'], y= master_data[vals][vox]) 
    return 



def update(): 
    select_data() 

controls = [ files_list, voids] 

for control in controls: 
    control.on_change('value', lambda attr, old, new: update()) 

sizing_mode = 'fixed' # 'scale_width' also looks nice with this example 

inputs = widgetbox(*controls, sizing_mode=sizing_mode) 
l = layout([ 
    [inputs, pline], 
], sizing_mode=sizing_mode) 

update() 

curdoc().add_root(l) 
curdoc().title = "Calculations" 

回答

0

我不是100%肯定,因爲上面的代碼是不獨立的,不能運行和查處,但也有一些問題(如散景0.12.4的),與添加組件文件是在某些情況下有問題。這些問題在接下來的兩個版本的優先級列表中很高。

數據大小是否合理,以便您可以預先創建所有組合?如果是這樣,我會建議這樣做,然後使多選值適當地打開/關閉可見性。例如,下面是一個使用複選框,一個類似的例子:

import numpy as np 

from bokeh.io import curdoc 
from bokeh.layouts import row 
from bokeh.palettes import Viridis3 
from bokeh.plotting import figure 
from bokeh.models import CheckboxGroup 

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) 

def update(attr, old, new): 
    l0.visible = 0 in checkbox.active 
    l1.visible = 1 in checkbox.active 
    l2.visible = 2 in checkbox.active 

checkbox.on_change('active', update) 

layout = row(checkbox, p) 
curdoc().add_root(layout) 

如果數據大小,這樣你可以在前面創建的所有組合,那麼我會建議作出的project issue trackerhttps://github.com/bokeh/bokeh/issues問題)有一個完整的,最小的,自包含的,可運行的原始代碼來重現問題(即生成隨機或合成數據,但它在其他方面是相同的)。這是幫助核心開發人員更迅速解決問題的頭號事情。

0

@bigreddot感謝您的回覆。

我編輯了代碼,現在讓它自成一體。

1)。情節不會重置。新選定的地塊在上一個地塊。 2)。當用戶可選擇多個(CTRL + SHIFT)的情節軸線被扭曲,它似乎在無限循環

from pandas import * 
 

 
import numpy as np 
 
import sys, os 
 

 
from bokeh.plotting import figure 
 
from bokeh.layouts import layout, widgetbox 
 
from bokeh.models.widgets import MultiSelect 
 
from bokeh.io import curdoc 
 
from bokeh.plotting import reset_output 
 
import math 
 

 
axis_map = { 
 
    "y1": "y3", 
 
    "y2": "y2", 
 
    "y3": "y1", 
 
} 
 

 
x1 = np.linspace(0,20,62) 
 
y1 = [1.26 * math.cos(x) for x in np.linspace(-1,1,62) ] 
 
y2 = [1.26 * math.cos(x) for x in np.linspace(-0.95,.95,62) ] 
 
y3 = [1.26 * math.cos(x) for x in np.linspace(-.9,.90,62) ] 
 

 
TOOLS = "pan,wheel_zoom,box_zoom,reset,save,hover" 
 

 
vars = MultiSelect(title="At what void[s]", value=["y1"], options=sorted(axis_map.keys())) 
 

 
master_data = { 'rate' : x1, 
 
       'y1' : y1, 
 
       'y2' : y2, 
 
       'y3' : y3    
 
       } 
 
       
 
p = figure(plot_height=600, plot_width=700, title="", toolbar_location=None) 
 
pline = figure(plot_height=600, plot_width=700, title="", tools=TOOLS) 
 

 
def select_data(): 
 
     for vox in vars.value: 
 
      pline.line(x=master_data['rate'], y= master_data[vox], line_width=2) 
 
      pline.circle(x=master_data['rate'], y=master_data[vox], line_width=2) 
 
     return 
 

 
controls = [ vars] 
 

 
for control in controls: 
 
    control.on_change('value', lambda attr, old, new: select_data()) 
 

 

 
sizing_mode = 'fixed' 
 

 
inputs = widgetbox(*controls) 
 
l = layout([ 
 
    [inputs, pline], 
 
]) 
 

 
select_data() 
 

 
curdoc().add_root(l) 
 
curdoc().title = "Plot"

運行