Expose `._set_yrange()` kwargs via `yrange_kwargs: dict`

Since it can be desirable to dynamically adjust inputs to the y-ranging
method (such as in the display loop when a chart is very zoomed in), this
adds such support through a new `yrange_kwargs: dict[Viz, dict]` which
replaces the `yrange` tuple we were passing through prior. Also, adjusts
the y-range margin back to the original 0.09 of the diff now that we can
support dynamic control.
storage_cli
Tyler Goodlet 2023-02-09 14:33:27 -05:00
parent 7f7af4ba00
commit 1e85668bc2
1 changed files with 25 additions and 20 deletions

View File

@ -25,6 +25,7 @@ from math import (
) )
import time import time
from typing import ( from typing import (
Any,
Optional, Optional,
Callable, Callable,
TYPE_CHECKING, TYPE_CHECKING,
@ -786,7 +787,7 @@ class ChartView(ViewBox):
# NOTE: this value pairs (more or less) with L1 label text # NOTE: this value pairs (more or less) with L1 label text
# height offset from from the bid/ask lines. # height offset from from the bid/ask lines.
range_margin: float | None = 0.1, range_margin: float | None = 0.09,
bars_range: Optional[tuple[int, int, int, int]] = None, bars_range: Optional[tuple[int, int, int, int]] = None,
@ -959,7 +960,10 @@ class ChartView(ViewBox):
do_overlay_scaling: bool = True, do_overlay_scaling: bool = True,
do_linked_charts: bool = True, do_linked_charts: bool = True,
yranges: tuple[float, float] | None = None, yrange_kwargs: dict[
str,
tuple[float, float],
] | None = None,
): ):
profiler = Profiler( profiler = Profiler(
msg=f'ChartView.interact_graphics_cycle() for {self.name}', msg=f'ChartView.interact_graphics_cycle() for {self.name}',
@ -1011,8 +1015,6 @@ class ChartView(ViewBox):
major_viz: Viz = None major_viz: Viz = None
major_mx: float = 0 major_mx: float = 0
major_mn: float = float('inf') major_mn: float = float('inf')
# mx_up_rng: float = 0
# mn_down_rng: float = 0
mx_disp: float = 0 mx_disp: float = 0
# collect certain flows have grapics objects **in seperate # collect certain flows have grapics objects **in seperate
@ -1042,15 +1044,15 @@ class ChartView(ViewBox):
out = _maybe_calc_yrange( out = _maybe_calc_yrange(
viz, viz,
yranges, yrange_kwargs,
profiler, profiler,
chart_name, chart_name,
) )
if out is None: if out is None:
continue continue
read_slc, yrange = out read_slc, yrange_kwargs = out
viz.plot.vb._set_yrange(yrange=yrange) viz.plot.vb._set_yrange(**yrange_kwargs)
profiler(f'{viz.name}@{chart_name} single curve yrange') profiler(f'{viz.name}@{chart_name} single curve yrange')
# don't iterate overlays, just move to next chart # don't iterate overlays, just move to next chart
@ -1065,14 +1067,15 @@ class ChartView(ViewBox):
out = _maybe_calc_yrange( out = _maybe_calc_yrange(
viz, viz,
yranges, yrange_kwargs,
profiler, profiler,
chart_name, chart_name,
) )
if out is None: if out is None:
continue continue
read_slc, yrange = out read_slc, yrange_kwargs = out
yrange = yrange_kwargs['yrange']
pi = viz.plot pi = viz.plot
# handle multiple graphics-objs per viewbox cases # handle multiple graphics-objs per viewbox cases
@ -1161,15 +1164,15 @@ class ChartView(ViewBox):
out = _maybe_calc_yrange( out = _maybe_calc_yrange(
viz, viz,
yranges, yrange_kwargs,
profiler, profiler,
chart_name, chart_name,
) )
if out is None: if out is None:
continue continue
read_slc, yrange = out read_slc, yrange_kwargs = out
viz.plot.vb._set_yrange(yrange=yrange) viz.plot.vb._set_yrange(**yrange_kwargs)
profiler(f'{viz.name}@{chart_name} single curve yrange') profiler(f'{viz.name}@{chart_name} single curve yrange')
# move to next chart in linked set since # move to next chart in linked set since
@ -1358,8 +1361,6 @@ class ChartView(ViewBox):
'--------------------\n' '--------------------\n'
f'y_minor_intersect: {y_minor_intersect}\n' f'y_minor_intersect: {y_minor_intersect}\n'
f'y_major_intersect: {y_major_intersect}\n' f'y_major_intersect: {y_major_intersect}\n'
# f'mn_down_rng: {mn_down_rng * 100}\n'
# f'mx_up_rng: {mx_up_rng * 100}\n'
f'scaled ymn: {ymn}\n' f'scaled ymn: {ymn}\n'
f'scaled ymx: {ymx}\n' f'scaled ymx: {ymx}\n'
f'scaled mx_disp: {mx_disp}\n' f'scaled mx_disp: {mx_disp}\n'
@ -1408,11 +1409,14 @@ class ChartView(ViewBox):
def _maybe_calc_yrange( def _maybe_calc_yrange(
viz: Viz, viz: Viz,
yranges: dict[Viz, tuple[float, float]], yrange_kwargs: dict[Viz, dict[str, Any]],
profiler: Profiler, profiler: Profiler,
chart_name: str, chart_name: str,
) -> tuple[slice, tuple[float, float]] | None: ) -> tuple[
slice,
dict,
] | None:
if not viz.render: if not viz.render:
return return
@ -1426,9 +1430,9 @@ def _maybe_calc_yrange(
profiler(f'{viz.name}@{chart_name} `Viz.update_graphics()`') profiler(f'{viz.name}@{chart_name} `Viz.update_graphics()`')
# check if explicit yranges were passed in by the caller # check if explicit yrange (kwargs) was passed in by the caller
yrange = yranges.get(viz) if yranges else None yrange_kwargs = yrange_kwargs.get(viz) if yrange_kwargs else None
if yrange is not None: if yrange_kwargs is not None:
read_slc = slice(*i_read_range) read_slc = slice(*i_read_range)
else: else:
@ -1442,8 +1446,9 @@ def _maybe_calc_yrange(
yrange yrange
) = out ) = out
profiler(f'{viz.name}@{chart_name} `Viz.maxmin()`') profiler(f'{viz.name}@{chart_name} `Viz.maxmin()`')
yrange_kwargs = {'yrange': yrange}
return ( return (
read_slc, read_slc,
yrange, yrange_kwargs,
) )