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

如何为Bokeh双散点图添加带回归方程的回归线(含复选框联动)

好的,要给这两个散点图分别加上带回归方程的回归线,并且让它们和CheckboxGroup联动,咱们可以分成几步来实现:先计算线性回归参数、生成回归线数据,然后创建回归线和回归方程文本,最后修改回调函数让它们和对应散点图同步显示/隐藏。下面是完整的实现代码和细节说明:

1. 导入必要的依赖库

首先确保你导入了计算回归所需的numpy,以及Bokeh的相关组件:

import numpy as np
from bokeh.plotting import figure, output_file, show
from bokeh.models import CheckboxGroup, CustomJS, Label
2. 计算线性回归参数并生成回归线数据

假设你的A_area、A_price、B_area、B_price是可迭代的数值序列(如果不是,先转成numpy数组),用np.polyfit计算一阶线性回归的斜率和截距,再生成覆盖数据范围的回归线坐标:

# 处理A组数据的回归计算
slope_a, intercept_a = np.polyfit(A_area, A_price, 1)
# 生成回归线的x轴范围(覆盖A_area的最小到最大值)
x_a_line = np.linspace(A_area.min(), A_area.max(), 100)
# 根据回归方程计算对应y值
y_a_line = slope_a * x_a_line + intercept_a

# 处理B组数据的回归计算
slope_b, intercept_b = np.polyfit(B_area, B_price, 1)
x_b_line = np.linspace(B_area.min(), B_area.max(), 100)
y_b_line = slope_b * x_b_line + intercept_b
3. 创建散点图、回归线和回归方程文本

在你的figure上添加回归线,同时用Label组件显示格式化后的回归方程(位置可以根据数据范围调整):

output_file("Scatterplot.html") 
f = figure(title="Area vs Price", x_axis_label='Area', y_axis_label='Price')

# 保留你原来的散点图代码
S0 = f.circle(A_area, A_price, fill_alpha=0.3, size=3, color='green') 
S1 = f.circle(B_area, B_price, fill_alpha=0.3, size=3, color='blue') 

# 添加A组的回归线和回归方程文本
L0 = f.line(x_a_line, y_a_line, color='darkgreen', line_width=2)
eq_a = f"y = {slope_a:.2f}x + {intercept_a:.2f}"
T0 = Label(x=A_area.max()*0.7, y=A_price.max()*0.9, text=eq_a, text_color='darkgreen')
f.add_layout(T0)

# 添加B组的回归线和回归方程文本
L1 = f.line(x_b_line, y_b_line, color='darkblue', line_width=2)
eq_b = f"y = {slope_b:.2f}x + {intercept_b:.2f}"
T1 = Label(x=B_area.max()*0.7, y=B_price.max()*0.8, text=eq_b, text_color='darkblue')
f.add_layout(T1)
4. 修改复选框回调函数,同步控制所有元素的可见性

把回归线和回归文本也传入回调函数,确保它们和对应散点图同步显示/隐藏:

checkboxes = CheckboxGroup(labels=["A", "B"], active=[0, 1]) 

callback = CustomJS(code="""
    // 默认隐藏所有相关元素
    S0.visible = false;
    L0.visible = false;
    T0.visible = false;
    S1.visible = false;
    L1.visible = false;
    T1.visible = false;

    // 根据选中的复选框,显示对应组的所有元素
    if (cb_obj.active.includes(0)) {
        S0.visible = true;
        L0.visible = true;
        T0.visible = true;
    }
    if (cb_obj.active.includes(1)) {
        S1.visible = true;
        L1.visible = true;
        T1.visible = true;
    }
""", args={'S0': S0, 'L0': L0, 'T0': T0, 'S1': S1, 'L1': L1, 'T1': T1}) 

checkboxes.js_on_click(callback)
show(f)

关键细节说明:

  • np.polyfit(..., 1)中的1代表一阶线性拟合,会返回斜率和截距两个参数;
  • 回归线用深色系和散点图对应,方便区分;
  • 回归方程文本的位置可以通过调整Label的x和y值来适配你的数据范围,避免被图形遮挡;
  • 回调函数中同时控制散点、回归线、文本的可见性,保证每组元素的状态完全同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:25:46