gpt4 book ai didi

python - 有没有办法使用 CustomJS 回调更新图例补丁标签?

转载 作者:行者123 更新时间:2023-12-01 06:36:12 24 4
gpt4 key购买 nike

使用 Bokeh 1.4 和 Python 3.7。我有一组补丁,我想根据同一 ColumnDataSource 中的两个不同键(和标签)来改变颜色主题。我想坚持使用一个 ColumnDataSource,因为我的实际文件非常大,并且几何图形(即 xs 和 ys)在我想要作为主题的两件事之间是常见的。

查看我的工作示例:

from bokeh.io import show
from bokeh.models import ColumnDataSource,CustomJS, widgets, LinearColorMapper
from bokeh.palettes import RdBu6, Spectral11
from bokeh.plotting import figure
from bokeh.layouts import layout, column, row

source = ColumnDataSource(dict(
xs=[[1,2,2], [1,2,2], [3,4,4], [3,4,4]],
ys=[[3,3,4], [1,1,2], [3,3,4], [1,1,2]],
s1=[0, 50, 75, 50],
s2=[0, 25, 50, 75],
label_1=['Blue', 'Orangy', 'Red', 'Orangy'],
label_2=['S', 'P', 'E', 'C']

))

cmap1 = LinearColorMapper(palette='RdBu6', low = 0, high = 75)
cmap2 = LinearColorMapper(palette='Spectral11', low = 0, high = 75)

p = figure(x_range=(0, 7), y_range=(0, 5), plot_height=300)

patches = p.patches( xs='xs', ys='ys', fill_color={'field':'s1','transform':cmap1}
, legend_field='label_1', source=source)


b = widgets.Button(label = 'RdBu')

b.js_on_click(CustomJS(args=dict(b=b,source=source,patches=patches,cmap1=cmap1,cmap2=cmap2,p=p),
code="""if (b.label == 'RdBu')
{b.label='Spectral';
patches.glyph.fill_color = {field: 's2',transform:cmap2};}
else if (b.label == 'Spectral')
{b.label='RdBu';
patches.glyph.fill_color = {field: 's1',transform:cmap1}}"""
))
layout=column(row(p),row(b))
show(layout)

这会产生 this ,然后 this单击按钮时。您可以看到回调的 fill_color 更新部分在颜色变化甚至图例中的颜色变化时正常工作,但我一直无法找到一种方法指示 CustomJS 正确更新图例条目,以便在第二个图像将有 4 个条目,其中“S”、“P”、“E”和“C”作为图例标签。

据我所知,当我创建 patch 对象并指定 legend_field 参数时,它会使用某种 groupby/aggregate 函数为我构造一个图例,为我生成唯一的图例条目,然后将该图例添加到图形对象?

这让我走上了尝试深入研究 p.legend 的道路:

p.legend.items #returns a list containing one LegendItem object
p.legend.items[0].label #returns a dictionary: {'field': 'label_1'}

我尝试将 p.legend.items[0].label['field'] = 'label_2' 放在回调之外,它有效 as I hoped - 图例现在显示为 S、P、E、C。但是当我尝试将其放入回调代码中时,它似乎没有更新:

b.js_on_click(CustomJS(args=dict(b=b,source=source,patches=patches,cmap1=cmap1,cmap2=cmap2,p=p),      
code="""if (b.label == 'RdBu')
{b.label='Spectral';
patches.glyph.fill_color = {field: 's2',transform:cmap2};
p.legend.items[0].label['field']='label_2'}
else if (b.label == 'Spectral')
{b.label='RdBu';
patches.glyph.fill_color = {field: 's1',transform:cmap1}
p.legend.items[0].label['field']='label_1'}"""
))

我觉得我已经非常接近了,但只是缺少一两个关键的东西......任何建议/帮助都很感激!

最佳答案

关于python - 有没有办法使用 CustomJS 回调更新图例补丁标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59654464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com