是否可以在全息视图中自动缩放 yrange?

Is it possible to scale yrange automatically in holoviews?

我用holoviews来显示折线图,但是当我用平移工具水平移动它时,线在垂直方向上离开了屏幕。因此,我想要一个自动缩放 yrange 的功能,以便该行不会在任何时候跳出屏幕。

我的理想是这个网站上的图表。 https://www.binance.com/en/trade/BTC_USDT

有没有办法使用全息视图来实现这个?

我认为这可以在 HoloViews 中通过附加到平移工具的 Python 回调来完成;见 HoloViews user guide.

似乎最好在 JavaScript 级别使用 Bokeh 解决问题,然后启用一些新选项 autorange_y,并且搜索“bokeh autoscale y axis”确实表明很多多年来,人们一直要求这样做。我没有看到发布任何实际的通用解决方案,但有一个 gist with an example of doing it in JS for one type of plot. Probably worth filing a feature request at https://github.com/bokeh/bokeh/issues 要求更通用的解决方案。

参考官方教程,自己实现了一个简单的autoscale代码

HoloViews user guide -「Custom Interactivity」

autoscale()仅适用于Holoviews以X,Y为参数的绘图方法,如hv.Scatter、hv.Curve、hv.Point、hv.Histogram, hv.Area.

import numpy as np
import pandas as pd
import holoviews as hv
hv.extension("bokeh")

def autoscale(fig):
    x, y  = fig.dimension_values(0), fig.dimension_values(1)
    def draw(x_range, y_range):
        if not x_range: return fig
        xr_start, xr_end = x_range
        mask = (xr_start < x) & (x < xr_end)
        yr_start, yr_end = y[mask].min(), y[mask].max()
        yr_start, yr_end = yr_start - (abs(yr_end - yr_start)*0.1), yr_end + (abs(yr_end - yr_start)*0.1)
        if yr_start == False or yr_start == None or yr_start == yr_end:
            yr_start, yr_end = y_range
        return fig.opts(hooks=[
            lambda plot, _:
                plot.handles['y_range'].update(start=yr_start, end=yr_end)
        ], active_tools=["wheel_zoom"])
    return hv.DynamicMap(draw, streams=[hv.streams.RangeXY()])
x = pd.date_range("2020-01-01", "2020-4-09")
y = np.cumsum(np.random.randn(len(x)))

autoscale(hv.Curve((x, y)) * hv.Curve((x, y*1.5))) # also works overlay
autoscale(hv.Curve((x, y)))

看来还可以改进,希望官方能提供自动缩放的功能