如何通过下拉菜单选择散点图的缩放轴(X/Y/双轴)
实现散点图的轴缩放模式切换功能
方案一:通过切换.interactive()参数实现(符合你的需求)
这个方案直接利用你提到的.interactive()方法,结合参数选择器动态切换绑定的轴:
- 准备基础散点图和缩放模式选择器
- 根据选择器的取值,动态生成对应参数的交互式图表
代码示例(基于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
相关产品推荐
相关产品推荐

