我已将 y 轴的范围设置为固定范围
plot.y_axis.mapper.range.set(low_setting=ylim[0], high_setting=ylim[1])
然后,当用户使用缩放工具并单击重置缩放键(例如 ESC)时,y 轴将重置为紧密边界。但是我的应用程序不知道这已经发生并且无法再次正确设置轴限制。我正在使用 BetterSelectingZoom 工具。
我看到在 BetterSelectingZoom 的 _reset_range_settings 方法中,范围高低设置被重置为 BetterSelectingZoom._orig_low_setting,它设置为“自动”,但这会覆盖我在范围内设置的设置。_orig_low_setting 在创建时从范围中检索,并且稍后在实际完成缩放时不会更新。因此,如果您在创建缩放工具后更改绘图的限制,您将遇到此问题。似乎 _reset_range_settings 在 SelectZoomState 上恢复后被调用,从而覆盖了缩放状态下的 prev 属性。这是一个错误吗?
为了让它工作,我可以在缩放工具中设置 _orig_low_setting 属性,或者覆盖 BetterSelectingZoom _reset_range_settings 方法,但我觉得用 private Traits 搞砸了
代码示例:
plot = Plot(self._plot_data, padding=10, border_visible=True)
...
plot.bgcolor = 'white'
vertical_grid = PlotGrid(component=plot,
mapper=plot.index_mapper,
orientation='vertical',
line_color="gray",
line_style='dot',
use_draw_order=True)
horizontal_grid = PlotGrid(component=plot,
mapper=plot.value_mapper,
orientation='horizontal',
line_color="gray",
line_style='dot',
use_draw_order=True)
vertical_axis = PlotAxis(orientation='left',
mapper=plot.value_mapper,
use_draw_order=True, tick_label_font=font)
horizontal_axis = PlotAxis(orientation='bottom',
mapper=plot.index_mapper,
use_draw_order=True, tick_label_font=font)
horizontal_axis.tick_generator = XTickGenerator()
vertical_axis.tick_generator = YTickGenerator()
plot.underlays.append(vertical_grid)
plot.underlays.append(horizontal_grid)
# Have to add axes to overlays because
# we are backbuffering the main plot,
# and only overlays get to render in addition to the backbuffer.
plot.overlays.append(vertical_axis)
plot.overlays.append(horizontal_axis)
# Enable Pan and Zoom
pan = PanTool(plot, restrict_to_data=True,
constrain=False, constrain_direction="x",
constrain_key=None)
zoom = BetterSelectingZoom(component=plot,
tool_mode="box", restrict_domain=True,
always_on=True, drag_button="right",
x_min_zoom_factor=1, y_min_zoom_factor=1)
plot.tools.append(pan)
plot.overlays.append(zoom)
为了解决这个问题,我这样做了
class NoRangeResetZoom(BetterSelectingZoom):
def _reset_range_settings(self):
pass
和
zoom = NoRangeResetZoom(component=plot,
tool_mode="box", restrict_domain=True,
always_on=True, drag_button="right",
x_min_zoom_factor=1, y_min_zoom_factor=1)
plot.overlays.append(zoom)