Bokeh散点图使用radius参数时如何添加尺寸/半径图例?
Bokeh散点图半径映射图例实现方法
完全可以实现,Bokeh没有默认自动生成半径映射图例的内置逻辑,你可以通过以下两种方式快速实现,也可以满足你仅展示轮廓的需求:
方法1:手动自定义图例(灵活度最高)
你可以自己选取半径字段的几个典型值(比如最小值、中位数、最大值),手动生成对应大小的图例项,适配你现有代码的示例如下:
from bokeh.models import Legend, LegendItem # 你原有代码不变 p=figure(tools=TOOLS) p.circle( x=xvar, y=yvar, radius=radvar, radius_units='screen', color={ 'field':colorvar, 'transform':color_mapper}, source=data) # 新增图例生成逻辑 # 提取半径字段的典型展示值 rad_min = data.data[radvar].min() rad_mid = data.data[radvar].median() rad_max = data.data[radvar].max() rad_samples = [rad_min, rad_mid, rad_max] legend_items = [] for val in rad_samples: # 仅需轮廓的话设置fill_color为None,调整line_color为你需要的颜色即可 sample_circle = p.circle( [], [], radius=val, radius_units='screen', fill_color=None, line_color="#333333", line_width=2 ) legend_items.append(LegendItem(label=f"{val:.2f}", renderers=[sample_circle])) # 将图例添加到图表右侧 p.add_layout(Legend(items=legend_items, title="数值大小"), "right")
方法2:使用内置SizeLegend自动生成(Bokeh 2.3及以上版本支持)
如果你不想手动计算采样值,可以先将半径映射关联到标量转换器,再用内置的SizeLegend自动生成图例:
from bokeh.models import SizeLegend, ScaleRange from bokeh.transform import transform # 先定义半径的映射规则,比如将radvar的取值映射到屏幕像素半径[3, 20]区间 rad_transform = transform( radvar, ScaleRange( range_name="default", min_value=data.data[radvar].min(), max_value=data.data[radvar].max(), min_range=3, max_range=20 ) ) # 原有circle方法里替换radius参数为转换器 p.circle( x=xvar, y=yvar, radius=rad_transform, radius_units='screen', color={ 'field':colorvar, 'transform':color_mapper}, source=data) # 自动生成大小图例 size_legend = SizeLegend(transform=rad_transform['transform'], title="数值大小") p.add_layout(size_legend, "right")
两种方案都适配你设置的radius_units='screen'参数,不需要额外调整单位逻辑。
内容的提问来源于stack exchange,提问作者jackl
相关产品推荐
相关产品推荐

