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

Bokeh绘图中如何将图例标签设为列名而非列值?

解决Bokeh绘图图例显示列值而非列名的问题

我明白你遇到的困扰——用ColumnDataSource绘图时,明明想把列名作为图例标签,结果Bokeh却把列里的数值当成了图例内容,用加空格的方法虽然能work,但确实不够优雅。这里给你几个官方的解决方案:

问题根源

在Bokeh中,当你给line这类glyph方法的legend参数传入字符串时,它会默认把这个字符串当作数据源中的字段名,尝试从ColumnDataSource里提取对应字段的值来生成图例。这就是为什么你看到的不是"accuracy"这个文本,而是列里的数值。

解决方案

1. 用legend_label参数(推荐,Bokeh 0.13.0+)

从Bokeh 0.13.0版本开始,官方专门提供了legend_label参数来直接指定图例的固定文本,它不会被解析为数据源的字段名。修改你的代码很简单:

p.line(x='iteration', y='accuracy', source=source, legend_label='accuracy')

2. 针对旧版本(如你用的0.12.13)的写法

如果你暂时无法升级Bokeh版本,可以把图例文本包装在dict(value="标签内容")里,明确告诉Bokeh这是固定文本:

p.line(x='iteration', y='accuracy', source=source, legend=dict(value='accuracy'))

3. 手动创建Legend对象(更灵活的方式)

如果需要更复杂的图例配置,你可以手动创建Legend对象并添加到图中,这种方式完全可控:

from bokeh.models import Legend

p = figure(width=900, y_axis_type="log")
source = ColumnDataSource(df)
# 先绘制线条并保存渲染器
line_renderer = p.line(x='iteration', y='accuracy', source=source)
# 创建图例项,格式是(标签文本, [对应渲染器列表])
legend = Legend(items=[
    ("accuracy", [line_renderer])
], location="top_left")
# 将图例添加到图上
p.add_layout(legend)
show(p)

以上几种方法都能优雅地让图例显示列名,再也不用依赖加空格的小技巧啦。

内容的提问来源于stack exchange,提问作者wl2776

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:28:19