2017-01-30 8 views
0

私は、ユーザーの "MultiSelect"オプションに基づいて複数の線をグラフにプロットしようとしています。私は2つの別々のデータファイルを読み込み、ユーザの要求に基づいて軸をプロットします。私はPython 3.5を使用していて、MACで動作しています。Bokeh 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のような)いくつかの問題があること文書に新しいコンポーネントを追加することです状況によっては問題があります。これらの問題は、次の2点のリリースの優先順位リストで高くなっています。

すべての組み合わせを前面に作成できるようにデータサイズは合理的ですか?もしそうなら、私はそれをして、マルチセレクト値が可視性のオン/オフを適切に切り替えることをお勧めします。例えば、ここにあるチェックボックスを使用して同様の例です:

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"

を実行していると思われます
関連する問題