是否可以在全息视图中自动缩放 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)))
看来还可以改进,希望官方能提供自动缩放的功能
我用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)))
看来还可以改进,希望官方能提供自动缩放的功能