Reputation: 123
I make a figure (empty to simplify the code but I will add many elements), and a ColorBar to designate the color of different elements.
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)
Now the color bar gives this result:
But I'm not satisfied because I'd like to have a different scale of colors where all positive values are red and all negative values are green. Moreover, I'd like to have defined ticks that will be customized in advance.
The result would look like this:
Thank you!
Upvotes: 1
Views: 650
Reputation: 123
Finally, I found how to custom the ColorBar with predefined values. I changed color palette by multiplying each color by the number corresponding to the interval of the color (for example: #75968f between -5000 and -2500 = 2500):
colors = ["#465a55"]*5000 + ["#75968f"]*2500 + ["#a5bab7"]*1500 + ["#c9d9d3"]*500 + ["#e2e2e2"]*500 + ["#dfccce"]*500 + ["#ddb7b1"]*500 + ["#cc7878"]*1500 + ["#933b41"]*2500 + ["#550b1d"]*5000
The mapper is now delimited by defined values, not by min and max elements:
mapper = LinearColorMapper(palette=colors, low=-10000, high=10000)
And I changed BasicTicker for FixedTicker so that the ticks correspond well to the limit of each color:
from bokeh.models import FixedTicker
ticker = FixedTicker(ticks=[-5000, -2500, -1000, -500, 0, 500, 1000, 2500, 5000])
The result:
Upvotes: 1