Bokeh中factor_cmap未在分类抖动散点图正确生效问题排查
问题排查与解决
你的代码无报错但颜色未生效,大概率是以下常见问题之一,按顺序排查:
1. 颜色参数指定错误
Bokeh的circle等图形标记有多个颜色相关参数:
fill_color:控制图形填充色(默认蓝色就是这个参数的默认值)color/line_color:仅控制轮廓线颜色
如果把factor_cmap赋值给了line_color,填充色仍会保持默认蓝色,自然看不到预期的颜色变化。正确做法是把factor_cmap赋值给fill_color(或color,如果要同时修改填充和轮廓颜色)。
2. field_name与数据源列名不匹配
factor_cmap的field_name必须和ColumnDataSource里的分类列名完全一致(大小写、空格、拼写都不能错)。比如数据源列是"Category",你写成"category",Bokeh找不到对应字段,就会 fallback 到默认颜色。
3. factors参数未覆盖所有分类值
如果factors列表里的分类和数据源中的实际分类不匹配(比如漏了某个分类、类型不一致),那些不匹配的分类会显示默认蓝色。要确保factors包含所有7个分类,且和数据源中的值类型相同(比如都是字符串)。
修正后的示例代码
以下是符合你需求的完整可运行代码,对比你自己的代码找差异:
from bokeh.plotting import figure, show from bokeh.transform import factor_cmap, jitter from bokeh.models import ColumnDataSource import pandas as pd import numpy as np # 构造7个分类的示例数据 categories = ["分类1", "分类2", "分类3", "分类4", "分类5", "分类6", "分类7"] df = pd.DataFrame({ "分类": np.random.choice(categories, 500), "Error": np.random.normal(0, 1.5, 500) }) source = ColumnDataSource(df) # 创建图表 p = figure(y_range=categories, x_axis_label="Error(误差)", y_axis_label="分类", width=800, height=500, title="误差分布带状图") # 关键:正确关联factor_cmap到fill_color p.circle( x="Error", y=jitter("分类", width=0.2, range=p.y_range), source=source, size=7, alpha=0.7, fill_color=factor_cmap( field_name="分类", # 和数据源列名完全一致 palette="Viridis7", # 7色调色板,匹配分类数量 factors=categories ), line_color=None # 去掉轮廓线,突出填充色 ) show(p)
额外提示
- 调色板可以用Bokeh内置的,比如
"Viridis7"、"Category10"(取前7个)、"Spectral7"等,确保颜色数量和分类数量匹配 - 如果用
scatter()函数,参数规则和circle()一致,同样要注意fill_color的赋值
内容的提问来源于stack exchange,提问作者new_to_code
相关产品推荐
相关产品推荐

