2017-01-30 5 views
0

사용자의 "MultiSelect"옵션에 따라 여러 줄을 그래프에 플로팅하려합니다. 나는 두 개의 별도의 Excel 파일을 읽고 사용자의 요청에 따라 축을 그려 봅니다. 저는 파이썬 3.5를 사용 중이며 MAC에서 실행 중입니다.Bokeh MultiSelect 무한 루프에서 플롯 팅, 플롯 왜곡

1). 다중 선택을하면 피규어가 왜곡됩니다.

2). 줄거리가 무한 루프에서 실행되고있는 것 같습니다.

3). 사용자가 선택 항목을 변경하면 플롯 선량이 제대로 업데이트되지 않습니다. 이전 플롯을 제거하지 않고 더 많은 플롯을 추가하기 만하면됩니다. 위의 코드가있는 문서에 새로운 구성 요소를 추가로 자체 포함하지 않고 실행하고 조사 할 수는 없지만 몇 가지 문제가 (보케 0.12.4 기준)이 있기 때문에

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 % 확실하지 오전 어떤 상황에서는 문제가있다. 이러한 문제는 다음 두 가지 릴리스에 대한 우선 순위 목록에서 높습니다.

모든 조합을 앞쪽으로 만들 수 있도록 합리적인 데이터 크기가 있습니까? 그렇다면 다중 선택 값을 사용하여 가시성을 적절하게 설정/해제 토글하는 것이 좋습니다. 예, 여기에 체크 박스를 사용하여 비슷한 예입니다 : 데이터 크기가 가없는 경우

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 +의 이동)을한다 플롯 축은 왜곡 얻고 보인다 때 무한 루프

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"

에서 실행되고