更改工具提示以显示x的值(日期时间,并从工具提示中删除索引

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

我正在学习使用bokeh可视化数据,并被HoverTool及其工具提示所困扰。这是我当前拥有的代码,

from alpha_vantage.timeseries import TimeSeries
import pandas as pd
from pandas.plotting import register_matplotlib_converters
import matplotlib.pyplot as plt
from bokeh.plotting import figure, output_file, show, ColumnDataSource
from bokeh.models import DatetimeTickFormatter, HoverTool

register_matplotlib_converters()
pd.set_option('display.precision',4)
ticker_symbol = 'AAPL'

ts = TimeSeries(key=API_Key, output_format='pandas')
data, meta_data = ts.get_intraday(symbol=ticker_symbol,interval='1min', outputsize='full')

plt_tools = 'hover, pan,wheel_zoom,box_zoom,reset'
p = figure(title='Intraday Times Series', x_axis_label='Time', x_axis_type='datetime', y_axis_label='Price', plot_width=1280, plot_height=960, toolbar_location='below', tools=plt_tools)
h_line = HoverTool()
h_line.mode = 'vline'
h_line.tooltips = [('date','@index'),                          # not sure if this works
                   ('close','$@{4. close}{%0.2f}')]            # not sure if this works
h_line.formatters = {'date': 'datetime', '4. close': 'printf'} # not sure if this works
p.add_tools(h_line)
p.line(data.index.values, data['4. close'], legend_label=ticker_symbol, line_width=2)

output_file('lines.html')
show(p)

数据看起来像这样

                      1. open   2. high    3. low  4. close  5. volume
date                                                                  
2019-12-23 09:35:00  281.0400  281.3582  281.0400  281.3582   171044.0
2019-12-23 09:34:00  281.0400  281.0400  281.0400  281.0400   129570.0
2019-12-23 09:33:00  281.3100  281.3900  281.2100  281.3300    97498.0
2019-12-23 09:32:00  281.4400  281.4800  281.1600  281.2800   194802.0
2019-12-23 09:31:00  281.4246  281.4246  281.4246  281.4246   957947.0

我设法使HoverTool和vline正常工作,但是从图中得到了2条工具提示。彼此堆叠(stacked tooltips)以及没有h_line.tooltips和h_line.formatters(original tooltip

的原始工具提示

如何更改工具提示以使其显示在底部,而不是在同一行上显示科学数字和价格:

Date: DD-MM-YY HH:MM 
Close: xxx.xx 

日期示例-01-01-20 13:15关闭示例-291.86

bokeh python-3.7
1个回答
0
投票

这里的问题是您将数据直接传递到p.line,而不是创建ColumnDataSource并从那里引用数据。当您将数据直接传递给字形函数时,Bokeh必须为您创建一个ColumnDataSource,并且由于您没有告诉它列要使用的名称,因此它只能使用诸如'x''y'之类的通用名称。 (例如,在这种情况下)。这些通用名称与您为悬停工具配置的列名称不匹配。您可以:

  • 更改悬停工具配置以使用通用列名'x''y',或

  • 创建ColumnDataSource并将其作为source传递给p.line

请注意,如果您希望其他列也可用于悬停工具,则必须使用第二个选项,其中所有列都希望对该工具可用。

有关所有这些的信息,请参见用户指南的章节Providing Data

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