我有一个简单的例子,在jupyter笔记本中运行:
套餐:
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)
解决方案,或者更多的解决方法,是操作散景图中第一个渲染器的 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)