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

