如何在Bokeh散点图中用分类变量定义颜色与标记符号?
用Bokeh一键实现按分类设置散点标记符号
嗨,你说的完全没错!Bokeh确实提供了原生的分类映射功能,不用手动拆分数据集,就能直接给不同color分类设置对应的标记符号,我给你一步步演示具体实现方法:
核心思路
我们可以利用Bokeh的FactorMapper(因子映射器),把color列的分类值('red'、'green'、'blue')直接映射到你想要的标记符号('x'、'o'、'triangle'),然后在scatter绘图时,把marker参数绑定到color列,同时指定这个映射规则就行。
完整代码示例
import pandas as pd from bokeh.plotting import figure, show from bokeh.models import ColumnDataSource from bokeh.transform import factor_mark # 1. 准备示例DataFrame(你可以替换成自己的数据集) data = { 'x': [1, 2, 3, 4, 5, 6, 7, 8, 9], 'y': [2, 4, 1, 5, 3, 6, 2, 7, 4], 'color': ['red', 'green', 'blue', 'red', 'green', 'blue', 'red', 'green', 'blue'] } df = pd.DataFrame(data) # 2. 定义分类和对应的标记、颜色映射 color_factors = ['red', 'green', 'blue'] markers = ['x', 'o', 'triangle'] colors = ['red', 'green', 'blue'] # 可选:让标记颜色也对应分类 # 3. 创建数据源 source = ColumnDataSource(df) # 4. 创建绘图对象 p = figure(title="按分类设置标记的散点图", x_axis_label='x', y_axis_label='y') # 5. 绘制散点:关键是用factor_mark关联分类和标记 p.scatter( x='x', y='y', source=source, # 用factor_mark实现分类到标记的映射 marker=factor_mark('color', markers, color_factors), # 可选:同时设置分类对应的颜色 color=factor_mark('color', colors, color_factors), size=15, # 调整标记大小 alpha=0.8 # 调整透明度 ) # 6. 显示图表 show(p)
关键部分解释
factor_mark是Bokeh专门用于分类标记映射的工具,它接收三个参数:- 数据源中的分类列名(这里是'color')
- 要映射的标记列表(顺序要和分类因子严格对应)
- 分类因子的列表(要和数据中的分类值完全匹配)
- 这样设置后,Bokeh会自动遍历数据源,给每个
color分类的点应用对应的标记,完全不用手动拆分数据子集!
如果你还想自定义更多样式(比如不同分类的标记大小、透明度),也可以用类似的逻辑扩展,非常灵活。
内容的提问来源于stack exchange,提问作者maschu




