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

如何通过下拉菜单选择散点图的缩放轴(X/Y/双轴)

实现散点图的轴缩放模式切换功能

方案一:通过切换.interactive()参数实现(符合你的需求)

这个方案直接利用你提到的.interactive()方法,结合参数选择器动态切换绑定的轴:

  1. 准备基础散点图和缩放模式选择器
  2. 根据选择器的取值,动态生成对应参数的交互式图表

代码示例(基于Holoviews + Param):

import holoviews as hv
import param
import numpy as np

hv.extension('bokeh')

# 生成示例散点数据
x = np.random.randn(100)
y = np.random.randn(100)
base_scatter = hv.Scatter((x, y))

# 定义缩放模式选择器
class ScaleController(param.Parameterized):
    scale_mode = param.Selector(
        default="双轴缩放",
        objects=["双轴缩放", "仅X轴缩放", "仅Y轴缩放"],
        label="选择缩放模式"
    )

controller = ScaleController()

# 根据选择的模式更新交互式图表
@param.depends(controller.scale_mode, watch=True)
def update_interactive_plot():
    match controller.scale_mode:
        case "双轴缩放":
            return base_scatter.interactive()  # 默认双轴缩放
        case "仅X轴缩放":
            return base_scatter.interactive(bind_y=True)  # 锁定Y轴,仅缩放X轴
        case "仅Y轴缩放":
            return base_scatter.interactive(bind_x=True)  # 锁定X轴,仅缩放Y轴

# 组合选择器和图表布局
hv.Layout(controller.param + update_interactive_plot()).cols(1)

方案二:不依赖.interactive(),直接控制缩放工具(基于Bokeh)

如果不想用.interactive(),可以直接操作底层绘图库的缩放工具,通过下拉菜单切换工具的缩放维度:

代码示例:

from bokeh.plotting import figure, show
from bokeh.models import Select, CustomJS
from bokeh.layouts import column
import numpy as np

# 生成数据
x = np.random.randn(100)
y = np.random.randn(100)

# 创建基础散点图
p = figure(title="散点图缩放控制", x_axis_label="X", y_axis_label="Y")
p.scatter(x, y, size=8, alpha=0.6)

# 获取默认的框选缩放工具
box_zoom_tool = p.select_one({"type": "BoxZoomTool"})

# 创建缩放模式下拉菜单
scale_select = Select(
    title="缩放模式",
    options=["双轴缩放", "仅X轴缩放", "仅Y轴缩放"],
    value="双轴缩放"
)

# 编写JS回调,切换缩放工具的维度设置
callback = CustomJS(args=dict(tool=box_zoom_tool), code="""
    const selected_mode = cb_obj.value;
    if (selected_mode === "双轴缩放") {
        tool.dimensions = null; // 恢复双轴缩放
    } else if (selected_mode === "仅X轴缩放") {
        tool.dimensions = 'width'; // 仅允许X轴方向缩放
    } else if (selected_mode === "仅Y轴缩放") {
        tool.dimensions = 'height'; // 仅允许Y轴方向缩放
    }
""")

# 绑定菜单变化事件到回调
scale_select.js_on_change('value', callback)

# 组合菜单和图表并展示
show(column(scale_select, p))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:55:17