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)
现在颜色条给出了这个结果:
但我不满意,因为我想要不同比例的颜色,其中所有正值都是红色,所有负值都是绿色。此外,我想定义可以提前自定义的刻度。
- #465a55: x < -5000
- #75968f: -5000 < x < -2500
- #a5bab7: -2500 < x < -1000
- #c9d9d3: -1000 < x < -500
- #e2e2e2: -500 < x < 0
- #dfccce: 0 < x < 500
- #ddb7b1: 500 < x < 1000
- #cc7878: 1000 < x < 2500
- #933b41: 2500 < x < 5000
- #550b1d: x > 5000
结果如下所示:
谢谢!
最后,我找到了如何使用预定义值自定义 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])
结果:
我做了一个图(为了简化代码留空但我会添加很多元素)和一个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)
现在颜色条给出了这个结果:
但我不满意,因为我想要不同比例的颜色,其中所有正值都是红色,所有负值都是绿色。此外,我想定义可以提前自定义的刻度。
- #465a55: x < -5000
- #75968f: -5000 < x < -2500
- #a5bab7: -2500 < x < -1000
- #c9d9d3: -1000 < x < -500
- #e2e2e2: -500 < x < 0
- #dfccce: 0 < x < 500
- #ddb7b1: 500 < x < 1000
- #cc7878: 1000 < x < 2500
- #933b41: 2500 < x < 5000
- #550b1d: x > 5000
结果如下所示:
谢谢!
最后,我找到了如何使用预定义值自定义 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])
结果: