Python Bokeh添加ColorBar报错:预期ColorMapper实例却获dict
Bokeh图表添加ColorBar报错问题解决
问题场景
编写Python Bokeh代码时,图表可正常生成,但添加ColorBar时报错,代码片段如下:
from bokeh.palettes import Turbo256 from bokeh.models import LinearAxis, Range1d, Label, LabelSet, ColumnDataSource, LinearColorMapper, ColorBar x = Combined_Data_Air[X1] y = Combined_Data_Air[Y1a] z = Combined_Data_Air['xxxxxxx'] # X1 and Y1a are Pandas column names. source = ColumnDataSource(data = dict( x = x,y=y,z = z)) cmap = linear_cmap(field_name='z', palette="Turbo256",low = 0, high = 30) s1.circle(x= 'x', y ='y', source=source,color=cmap, legend_label=Y1a,size=2) color_bar = ColorBar(color_mapper=cmap,location = 'right')
错误信息
执行最后一行代码时触发如下错误:
ValueError: failed to validate ColorBar(id='1074', ...).color_mapper: expected an instance of type ColorMapper, got {'field': 'z', 'transform': LinearColorMapper(id='1054', ...)} of type dict
问题原因
linear_cmap()函数返回的是一个字典(包含field和transform字段),而ColorBar的color_mapper参数要求传入ColorMapper类的实例(比如LinearColorMapper),类型不匹配导致报错。
解决方案
方案1:单独创建ColorMapper实例
先定义LinearColorMapper实例,再分别用于图形上色和ColorBar配置:
from bokeh.palettes import Turbo256 from bokeh.models import LinearAxis, Range1d, Label, LabelSet, ColumnDataSource, LinearColorMapper, ColorBar from bokeh.transform import linear_cmap # 确保导入该函数 x = Combined_Data_Air[X1] y = Combined_Data_Air[Y1a] z = Combined_Data_Air['xxxxxxx'] source = ColumnDataSource(data = dict( x = x,y=y,z = z)) # 1. 创建独立的LinearColorMapper实例 color_mapper = LinearColorMapper(palette="Turbo256", low=0, high=30) # 2. 用linear_cmap绑定字段与颜色映射 cmap = linear_cmap(field_name='z', color_mapper=color_mapper, low=0, high=30) s1.circle(x='x', y='y', source=source, color=cmap, legend_label=Y1a, size=2) # 3. 将ColorMapper实例传给ColorBar,并添加到图表 color_bar = ColorBar(color_mapper=color_mapper, location='right') s1.add_layout(color_bar)
方案2:从linear_cmap返回值中提取ColorMapper
直接从linear_cmap生成的字典里取出transform字段对应的实例:
cmap = linear_cmap(field_name='z', palette="Turbo256", low=0, high=30) # 提取字典中的transform属性(即LinearColorMapper实例) color_bar = ColorBar(color_mapper=cmap['transform'], location='right') # 务必将ColorBar添加到图表布局 s1.add_layout(color_bar)
关键说明
linear_cmap是便捷工具函数,生成的是图形颜色配置字典,其中transform才是真正的ColorMapper实例。- ColorBar必须接收
ColorMapper类实例作为color_mapper参数,不能直接传入linear_cmap的返回值。 - 必须调用
add_layout()将ColorBar添加到图表中,否则不会显示。
内容的提问来源于stack exchange,提问作者Rajesh Patel
相关产品推荐
相关产品推荐

