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
相关产品推荐
相关产品推荐

