使用Select Widget问题更新图

问题描述 投票:0回答:1

我目前正在尝试编写一个程序,当从选择窗口小部件中选择不同的选项时,该程序将在两组数据之间切换。我正在尝试使该程序尽可能地自治,以便将来人们更新数据时,他们根本不必修改代码,并且更新将自动进行。

[当前,我的问题是,当我选择'White'时,我想更新情节,但是什么也没有发生。目前这两个数据集是列表的字典,一个标记为“ White_dict”,另一个标记为“ black_dict”,仅表示数据材料的颜色(我知道这有点讽刺)。

from bokeh.plotting import figure, curdoc
from bokeh.models import ColumnDataSource, Legend
from bokeh.models import Select
from bokeh.layouts import column
import pandas as pd
from plot_tools import add_hover
import itertools
from collections import defaultdict


bokeh_doc = curdoc()


material_types = pd.read_csv('data/material-information.csv')
df = pd.read_csv('data/Black_Materials_total_reflecatance.csv')
black_df = pd.read_csv('data/Black_Materials_total_reflecatance.csv')
white_df = pd.read_csv('data/SPIE18_white_all.csv')

names = []
w_names = []
black_dict = defaultdict(list)
white_dict = defaultdict(list)

for name, w_name in zip(df, white_df):
    names.append(name)
    w_names.append(w_name)



data = pd.read_csv('data/Black_Materials_total_reflecatance.csv', usecols = names)
w_data = pd.read_csv('data/SPIE18_white_all.csv', usecols = w_names)

for name, w_name in zip(names, w_names):
    for i in range(0, 2250):
        black_dict[name].append(data[name][i])
        white_dict[w_name].append(w_data[w_name][i])

mySource = ColumnDataSource(data = black_dict)

#create total reflectance figure
total_fig = figure(plot_width = 650, plot_height = 350,
           title = 'Total Reflectance', 
           x_axis_label = 'Wavelength(nm)', y_axis_label = 'Total Reflectance', 
           x_range = (250, 2500), y_range = (0,10),
           title_location = 'above', sizing_mode = "scale_both",
           toolbar_location = "below",
           tools = "box_zoom, pan, wheel_zoom, save")

select = Select(title="Material Type", options=['Black', 'White'])

def update_plot(attr, old, new):
    if new == 'White':
        mySource.data = white_dict
    else:
        mySource.data = black_dict

for name, color in zip(mySource.data, Turbo256):
    if name != 'nm':
        total_fig.line('nm', name, line_width = .7, source = mySource, color = color) 

select.on_change('value', update_plot)

bokeh_doc.add_root(total_fig)
bokeh_doc.add_root(select) 

我当前正在使用bokeh服务bokehWork.py启动服务器。如果有人对我应该解决的问题有任何想法,将不胜感激!谢谢!

编辑:为Black_materials_total_reflectance.csv添加数据Black Reflectance Data sample

为White_all.csv添加数据White Reflectance Data sample

python pandas csv bokeh
1个回答
0
投票

您的代码有两个主要问题:

  1. 您多次读取相同的文件,并且完成了Pandas和Bokeh已经可以为您完成的很多工作
  2. (最主要的一个,您没有考虑到不同的CSV文件具有不同的列名的事实

这里是固定版本。还要注意调色板的用法。仅使用Turbo256,所有行的颜色几乎都相同。

import pandas as pd

from bokeh.models import ColumnDataSource, Select
from bokeh.palettes import turbo
from bokeh.plotting import figure, curdoc

black_ds = ColumnDataSource(pd.read_csv('/home/p-himik/Downloads/Black_material_data - Sheet1.csv').set_index('nm'))
white_ds = ColumnDataSource(pd.read_csv('/home/p-himik/Downloads/White Materials Sample - Sheet1.csv').set_index('nm'))

total_fig = figure(plot_width=650, plot_height=350,
                   title='Total Reflectance',
                   x_axis_label='Wavelength(nm)', y_axis_label='Total Reflectance',
                   title_location='above', sizing_mode="scale_both",
                   toolbar_location="below",
                   tools="box_zoom, pan, wheel_zoom, save")

total_fig.x_range.range_padding = 0
total_fig.x_range.only_visible = True
total_fig.y_range.only_visible = True

palette = turbo(len(black_ds.data) + len(white_ds.data))


def plot_lines(ds, color_offset, visible):
    renderers = []
    for name, color in zip(ds.data, palette[color_offset:]):
        if name != 'nm':
            r = total_fig.line('nm', name, line_width=.7, color=color,
                               source=ds, visible=visible)
            renderers.append(r)
    return renderers


black_renderers = plot_lines(black_ds, 0, True)
white_renderers = plot_lines(white_ds, len(black_ds.data), False)

select = Select(title="Material Type", options=['Black', 'White'], value='Black')


def update_plot(attr, old, new):
    wv = new == 'White'
    for r in white_renderers:
        r.visible = wv
    for r in black_renderers:
        r.visible = not wv


select.on_change('value', update_plot)

bokeh_doc = curdoc()
bokeh_doc.add_root(total_fig)
bokeh_doc.add_root(select)
© www.soinside.com 2019 - 2024. All rights reserved.