Bokeh:如何自定义 ColorBar 的比例?

Bokeh: how to custom scale of ColorBar?

我做了一个图(为了简化代码留空但我会添加很多元素)和一个ColorBar来指定不同元素的颜色。

from bokeh.models import LinearColorMapper, ColorBar, BasicTicker, PrintfTickFormatter
from bokeh.plotting import figure, show, output_file

output_file('image.html')

p = figure(x_range=(0,1), y_range=(0,1), toolbar_location=None)
p.toolbar.active_drag = None

data_heatmap = [-647, 25756, -7600, -1235, -1345]

colors = ["#465a55", "#75968f", "#a5bab7", "#c9d9d3", "#e2e2e2", "#dfccce", "#ddb7b1", "#cc7878", "#933b41", "#550b1d"]
mapper = LinearColorMapper(palette=colors, low=min(data_heatmap), high=max(data_heatmap))

color_bar = ColorBar(
            color_mapper=mapper,
            major_label_text_font_size="15px",
            ticker=BasicTicker(desired_num_ticks=len(colors)),
            formatter=PrintfTickFormatter(format="%d"),
            label_standoff=6, border_line_color=None
)
p.add_layout(color_bar, 'right')

show(p)

现在颜色条给出了这个结果:

但我不满意,因为我想要不同比例的颜色,其中所有正值都是红色,所有负值都是绿色。此外,我想定义可以提前自定义的刻度。

结果如下所示:

谢谢!

最后,我找到了如何使用预定义值自定义 ColorBar。我通过将每种颜色乘以与颜色间隔对应的数字来更改调色板(例如:#75968f 在 -5000 和 -2500 之间 = 2500):

colors = ["#465a55"]*5000 + ["#75968f"]*2500 + ["#a5bab7"]*1500 + ["#c9d9d3"]*500 + ["#e2e2e2"]*500 + ["#dfccce"]*500 + ["#ddb7b1"]*500 + ["#cc7878"]*1500 + ["#933b41"]*2500 + ["#550b1d"]*5000

映射器现在由定义的值分隔,而不是由最小和最大元素分隔:

mapper = LinearColorMapper(palette=colors, low=-10000, high=10000)

并且我将 BasicTicker 更改为 FixedTicker,以便刻度能够很好地对应每种颜色的限制:

from bokeh.models import FixedTicker
ticker = FixedTicker(ticks=[-5000, -2500, -1000, -500, 0, 500, 1000, 2500, 5000])

结果: