0

我已将 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)
4

0 回答 0