Dynamically adjust y-range margin in display loop

When zoomed in alot, and thus a quote driven y-range resize takes place,
it makes more sense to increase the `range_margin: float` input to
`._set_yrange()` to ensure all L1 labels stay in view; generally the
more zoomed in,
- the smaller the y-range is and thus the larger the needed margin (on
  that range's dispersion diff) would be,
- it's more likely to get a last datum move outside the previous range.

Also, always do overlayT style scaling on the slow chart whenever it
treads.
log_linearized_curve_overlays
Tyler Goodlet 2023-02-09 14:42:01 -05:00
parent cda3bcc1f6
commit 091afccb72
1 changed files with 34 additions and 6 deletions

View File

@ -264,7 +264,7 @@ async def increment_history_view(
if liv: if liv:
hist_viz.plot.vb.interact_graphics_cycle( hist_viz.plot.vb.interact_graphics_cycle(
do_linked_charts=False, do_linked_charts=False,
do_overlay_scaling=False, do_overlay_scaling=True, # always overlayT slow chart
) )
profiler('hist chart yrange view') profiler('hist chart yrange view')
@ -560,9 +560,10 @@ def graphics_update_cycle(
else: else:
lmn = lmx = 0 lmn = lmx = 0
mx: float = lmx
mn: float = lmn mn: float = lmn
mx: float = lmx
mx_vlm_in_view: float | None = None mx_vlm_in_view: float | None = None
yrange_margin = 0.09
# update ohlc sampled price bars # update ohlc sampled price bars
if ( if (
@ -630,13 +631,15 @@ def graphics_update_cycle(
price < mn price < mn
): ):
mn = price mn = price
# print(f'{this_viz.name} new MN from TICK {mn}') yrange_margin = 0.16
# # print(f'{this_viz.name} new MN from TICK {mn}')
if ( if (
price > mx price > mx
): ):
mx = price mx = price
# print(f'{this_viz.name} new MX from TICK {mx}') yrange_margin = 0.16
# # print(f'{this_viz.name} new MX from TICK {mx}')
# mx = max(price, mx) # mx = max(price, mx)
# mn = min(price, mn) # mn = min(price, mn)
@ -740,6 +743,18 @@ def graphics_update_cycle(
liv liv
and not chart._static_yrange == 'axis' and not chart._static_yrange == 'axis'
): ):
# NOTE: this auto-yranging approach is a sort of, hybrid,
# between always aligning overlays to the their common ref
# sample and not updating at all:
# - whenever an interaction happens the overlays are scaled
# to one another and thus are ref-point aligned and
# scaled.
# - on treads and range updates due to new mn/mx from last
# datum, we don't scale to the overlayT instead only
# adjusting when the latest datum is outside the previous
# dispersion range.
mn = min(mn, lmn)
mx = max(mx, lmx)
if ( if (
main_vb._ic is None main_vb._ic is None
@ -748,8 +763,16 @@ def graphics_update_cycle(
# print(f'SETTING Y-mnmx -> {main_viz.name}: {(mn, mx)}') # print(f'SETTING Y-mnmx -> {main_viz.name}: {(mn, mx)}')
this_vb.interact_graphics_cycle( this_vb.interact_graphics_cycle(
do_linked_charts=False, do_linked_charts=False,
# TODO: we could optionally offer always doing this
# on treads thus always keeping fast-chart overlays
# aligned by their LHS datum?
do_overlay_scaling=False, do_overlay_scaling=False,
yranges={this_viz: (mn, mx)}, yrange_kwargs={
this_viz: {
'yrange': (mn, mx),
'range_margin': yrange_margin,
},
}
) )
profiler('main vb y-autorange') profiler('main vb y-autorange')
@ -881,7 +904,12 @@ def graphics_update_cycle(
main_vlm_viz.plot.vb.interact_graphics_cycle( main_vlm_viz.plot.vb.interact_graphics_cycle(
do_overlay_scaling=True, do_overlay_scaling=True,
do_linked_charts=False, do_linked_charts=False,
yranges={main_vlm_viz: vlm_yrange}, yrange_kwargs={
main_vlm_viz: {
'yrange': vlm_yrange,
# 'range_margin': yrange_margin,
},
},
) )
profiler('`vlm_chart.view.interact_graphics_cycle()`') profiler('`vlm_chart.view.interact_graphics_cycle()`')