对于 LegendItem 只有的例子 GlyphRenderer 可以传递给它 renderers 属性和 Band 不是基于 GlyphRenderer 所以它给出了错误。在下面的代码中,Band可见性通过回调切换:
LegendItem
GlyphRenderer
renderers
Band
from bokeh.plotting import figure, show from bokeh.models import Band, ColumnDataSource, Legend, LegendItem, CustomJS import pandas as pd import numpy as np x = np.random.random(2500) * 140 - 20 y = np.random.normal(size = 2500) * 2 + 5 df = pd.DataFrame(data = dict(x = x, y = y)).sort_values(by = "x") sem = lambda x: x.std() / np.sqrt(x.size) df2 = df.y.rolling(window = 100).agg({"y_mean": np.mean, "y_std": np.std, "y_sem": sem}) df2 = df2.fillna(method = 'bfill') df = pd.concat([df, df2], axis = 1) df['lower'] = df.y_mean - df.y_std df['upper'] = df.y_mean + df.y_std source = ColumnDataSource(df.reset_index()) p = figure(tools = "pan,wheel_zoom,box_zoom,reset,save") scatter = p.scatter(x = 'x', y = 'y', line_color = None, fill_alpha = 0.3, size = 5, source = source) band = Band(base = 'x', lower = 'lower', upper = 'upper', source = source) p.add_layout(band) p.title.text = "Rolling Standard Deviation" p.xaxis.axis_label = 'X' p.yaxis.axis_label = 'Y' callback = CustomJS(args = dict(band = band), code = """ if (band.visible == false) band.visible = true; else band.visible = false; """) legend = Legend(items = [ LegendItem(label = "x", renderers = [scatter, band.source.selection_policy]) ]) legend.click_policy = 'hide' scatter.js_on_change('visible', callback) p.add_layout(legend) show(p)
结果: