Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 无限循环中的Bokeh多选绘图,扭曲绘图_Loops_Multi Select_Bokeh_Infinite - Fatal编程技术网

Loops 无限循环中的Bokeh多选绘图,扭曲绘图

Loops 无限循环中的Bokeh多选绘图,扭曲绘图,loops,multi-select,bokeh,infinite,Loops,Multi Select,Bokeh,Infinite,我试图根据用户的“MultiSelect”选项将多条线绘制成一个图形。我读入两个单独的excel数据文件,并根据用户的要求绘制它们的轴。我正在使用Python3.5并在MAC上运行 1) 。我一选,数字就失真了 2) 。情节似乎在无限循环中运行 3) 。当用户更改选择时,绘图不会正确更新。它只添加更多的绘图,而不删除以前的绘图 from os.path import dirname, join from pandas import * import numpy as np import pan

我试图根据用户的“MultiSelect”选项将多条线绘制成一个图形。我读入两个单独的excel数据文件,并根据用户的要求绘制它们的轴。我正在使用Python3.5并在MAC上运行

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"

我不是100%确定,因为上面的代码不是自包含的,无法运行和调查,但在某些情况下,向文档添加新组件会出现一些问题(从Bokeh
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)

如果数据大小不足以预先创建所有组合,那么我建议在上创建一个问题,该问题有一个完整的、最小的、自包含的、可运行的原样代码来重现问题(即生成随机或合成数据,但在其他方面相同)。这是帮助核心开发人员更迅速地解决问题的第一件事

@bigreddot感谢您的回复

我对代码进行了编辑,使其成为独立的

1) 。绘图不会重置。新选定的绘图将超过上一个绘图

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"
2) 。当用户进行多个选择(ctrl+shift)时,打印轴会扭曲,它似乎在无限循环中运行

从导入*
将numpy作为np导入
导入系统,操作系统
从bokeh.plotting导入图形
从bokeh.layouts导入布局,widgetbox
从bokeh.models.widgets导入MultiSelect
从bokeh.io导入curdoc
从bokeh.plotting导入重置输出
输入数学
轴映射={
“y1”:“y3”,
“y2”:“y2”,
“y3”:“y1”,
}
x1=np.linspace(0,20,62)
y1=[1.26*np.linspace(-1,1,62)中x的数学cos(x)]
y2=[1.26*np.linspace(-0.95,95,62)中x的数学cos(x)]
y3=[1.26*np.linspace(-.9,90,62)中x的数学cos(x)]
TOOLS=“平移、滚轮缩放、框缩放、重置、保存、悬停”
vars=MultiSelect(title=“在什么空[s]”,value=[“y1”],options=sorted(axis_map.keys())
主数据={“速率”:x1,
“y1”:y1,
“y2”:y2,
“y3”:y3
}
p=图形(绘图高度=600,绘图宽度=700,标题=”,工具栏位置=无)
pline=图形(绘图高度=600,绘图宽度=700,标题=”,工具=工具)
def select_data():
对于vars.value中的vox:
pline.line(x=主数据['rate'],y=主数据[vox],线宽=2)
pline.circle(x=主数据['rate'],y=主数据[vox],线宽=2)
返回
控件=[vars]
对于控件中的控件:
控件。更改时('value',lambda attr,old,new:select\u data())
调整大小\u模式='固定'
输入=widgetbox(*控件)
l=布局([
[输入,pline],
])
选择_data()
curdoc().添加根目录(l)
curdoc().title=“绘图”