You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:10:13