如何将数据添加到 Hvplot(散景)烛台中的悬停中而不会丢失日期间隙

问题描述 投票:0回答:1

我有一个简单的例子,在jupyter笔记本中运行:

  • hvplot.ohlc 没有缺失日期间隙
  • 想要修复悬停(以正确的格式添加日期,并添加音量信息)

套餐:

python 3.12
散景 3.3.2
hvplot 0.9.0
全息视图1.18.1

import pandas as pd
import hvplot.pandas

data = pd.DataFrame({
        "Open": [100.00, 101.25, 102.75],
        "High": [104.10, 105.50, 110.00],
        "Low": [94.00, 97.10, 99.20],
        "Close": [101.15, 99.70, 109.50],
        "Volume": [10012, 5000, 18000],
    }, index=[pd.Timestamp("2022-08-01"), pd.Timestamp("2022-08-03"), pd.Timestamp("2022-08-04")])

df = pd.DataFrame(data)
# remove datetime gaps
df = df.reset_index(names="Date")
df['Idx'] = pd.RangeIndex(0, df.shape[0], 1)

# fix hover ------
from bokeh.models import HoverTool

hover = HoverTool(
    tooltips=[
        ('Date', '@Date{%Y-%m-%d}'),
        ('Open', '@Open{0.00}'),
        ('High', '@High{0.00}'),
        ('Low', '@Low{0.00}'),
        ('Close', '@Close{0.00}'),
        ('Volume', '@Volume{0}'),
    ],
    formatters={'@Date': 'datetime'},
    mode='vline'
)
# fix hover ------

ohlc_cols = ["Open", "High", "Low", "Close"]
ohlc = df.hvplot.ohlc(x='Idx', y=ohlc_cols, hover_cols=["Date", *ohlc_cols, "Volume"], tools=[hover])

# fix x tick labels ------
import holoviews as hv
from bokeh.io import show

fig = hv.render(ohlc)
fig.xaxis.major_label_overrides = {
    i: dt.strftime("%b %d") for i, dt in enumerate(df['Date'])
}
# fix x tick labels ------

show(fig)

但是输出是:

bokeh holoviews candlestick-chart hvplot
1个回答
0
投票

解决方案,或者更多的解决方法,是操作散景图中第一个渲染器的 ColumnDataSource。

您可以通过添加以下行来做到这一点:

fig.renderers[0].data_source.data['Volume'] = df['Volume'].values

说明

为了理解为什么上面的行是解决方案,我想解释一下

df.hvplot.ohlc()
的作用。

此函数创建一个带有 2 个渲染器的散景图形,第一个渲染器用于所有胡须,它获取 HoverTool,第二个渲染器绘制框。 DataFrame 在内部被转换为

ColumnsDataSource
ColumnsDataSource
没有任何关于
"Volume"
的信息,因为只有胡须和盒子使用过的列存储在
ColumnDataSource
内。 HoverTool 无法找到
Volumne
的信息,因此它会打印
???
。但我们可以通过这些信息来扩展来源。

最小示例

我改编了你的例子,因为我认为它更简单。

import pandas as pd
import hvplot.pandas
import holoviews as hv
from bokeh.io import show
from bokeh.models import HoverTool

df= pd.DataFrame({
        "Open": [100.00, 101.25, 102.75],
        "High": [104.10, 105.50, 110.00],
        "Low": [94.00, 97.10, 99.20],
        "Close": [101.15, 99.70, 109.50],
        "Volume": [10012, 5000, 18000],
    },
    index=[pd.Timestamp("2022-08-01"), pd.Timestamp("2022-08-03"), pd.Timestamp("2022-08-04")]
)
df.index.name = "Date"

fig = hv.render(ohlc)
# add missing values to the source for the HoverTool
fig.renderers[0].data_source.data['Volume'] = df['Volume'].values
show(fig)

输出

© www.soinside.com 2019 - 2024. All rights reserved.