From 51373789fe53d9117e0706eb43978257639d66c3 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Tue, 28 Sep 2021 16:37:55 -0400 Subject: [PATCH] Autoscale the y-range for all linked charts --- piker/ui/_chart.py | 51 ++++++++++++++++------------------------------ 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/piker/ui/_chart.py b/piker/ui/_chart.py index 1678d553..04f24d50 100644 --- a/piker/ui/_chart.py +++ b/piker/ui/_chart.py @@ -972,7 +972,11 @@ class ChartPlotWidget(pg.PlotWidget): yrange: Optional[tuple[float, float]] = None, range_margin: float = 0.06, - bars_range: Optional[tuple[int, int, int, int]] = None + bars_range: Optional[tuple[int, int, int, int]] = None, + + # flag to prevent triggering sibling charts from the same linked + # set from recursion errors. + autoscale_linked_plots: bool = True, ) -> None: '''Set the viewable y-range based on embedded data. @@ -999,52 +1003,33 @@ class ChartPlotWidget(pg.PlotWidget): l, lbar, rbar, r = bars_range or self.bars_range() - # TODO: we need a loop for auto-scaled subplots to all - # be triggered by one another - if self.name != 'volume': - vlm_chart = self.linked.subplots.get('volume') - if vlm_chart: - vlm_chart._set_yrange(bars_range=(l, lbar, rbar, r)) - # curve = vlm_chart._graphics['volume'] - # if rbar - lbar < 1500: - # # print('small range') - # curve._fill = True - # else: - # curve._fill = False + if autoscale_linked_plots: + # avoid recursion by sibling plots + linked = self.linked + plots = list(linked.subplots.copy().values()) + main = linked.chart + if main: + plots.append(main) - # figure out x-range in view such that user can scroll "off" - # the data set up to the point where ``_min_points_to_show`` - # are left. - # view_len = r - l + for chart in plots: + if chart and not chart._static_yrange: + chart._set_yrange( + bars_range=(l, lbar, rbar, r), + autoscale_linked_plots=False, + ) # TODO: logic to check if end of bars in view # extra = view_len - _min_points_to_show - # begin = self._arrays['ohlc'][0]['index'] - extra - # # end = len(self._arrays['ohlc']) - 1 + extra # end = self._arrays['ohlc'][-1]['index'] - 1 + extra - # XXX: test code for only rendering lines for the bars in view. - # This turns out to be very very poor perf when scaling out to - # many bars (think > 1k) on screen. - # name = self.name - # bars = self._graphics[self.name] - # bars.draw_lines( - # istart=max(lbar, l), iend=min(rbar, r), just_history=True) - # bars_len = rbar - lbar # log.debug( # f"\nl: {l}, lbar: {lbar}, rbar: {rbar}, r: {r}\n" # f"view_len: {view_len}, bars_len: {bars_len}\n" # f"begin: {begin}, end: {end}, extra: {extra}" # ) - # self._set_xlimits(begin, end) - - # TODO: this should be some kind of numpy view api - - - # bars = self._arrays['ohlc'][lbar:rbar] a = self._arrays['ohlc'] ifirst = a[0]['index']