Bokeh / Python проблема с TOOLTIPS / Наведите курсор на - PullRequest
0 голосов
/ 29 апреля 2020

enter image description here Нужна помощь с кодом ниже, мой указатель мыши не показывает какие-либо данные просто ???. Я предполагаю, потому что я не определил источник правильно или мне нужно включить аргумент в код vbar. Нужно ли мне добавлять больше информации к источнику, например, имена столбцов и т. Д. c, или мне также нужно ссылаться на имена источников и столбцов в аргументах vbar?

Спасибо

def get_width():
    mindate = df['local_time'].min()
    maxdate = df['local_time'].max()
    return 0.8 * (maxdate-mindate).total_seconds()*1000 / len(df['local_time'])

plots = []
sliders = []

for t in df['timeframeID'].unique():

    inc = df[df['timeframeID'] == t].close > df[df['timeframeID'] == t].open
    dec = df[df['timeframeID'] == t].open > df[df['timeframeID'] == t].close

source = ColumnDataSource(data=df)

TOOLS = "pan,wheel_zoom,box_zoom,crosshair,reset,save"

TOOLTIPS = [('open', '@open'),('high', '@high'),('low', '@low'),('close', '@close')]

name1= figure(plot_width=1600, plot_height = 900, title="Instrument AUDUSD: "+t, tools = TOOLS, tooltips=TOOLTIPS)
name1.xaxis.major_label_overrides = {
i: date.strftime('%b %d') for i, date in enumerate(pd.to_datetime(df["local_time"]))
}
name1.xaxis.bounds = (0, df.index[-1])

name1.segment(df[df['timeframeID'] == t].index[inc], df[df['timeframeID'] == t].high[inc],
              df[df['timeframeID'] == t].index[inc],df[df['timeframeID'] == t].low[inc], color="black")
name1.segment(df[df['timeframeID'] == t].index[dec], df[df['timeframeID'] == t].high[dec],
              df[df['timeframeID'] == t].index[dec],df[df['timeframeID'] == t].low[dec], color="black")
#name1.y_range.range_padding = 0.05
name1.vbar(df[df['timeframeID']== t].index[inc], 0.5, df[df['timeframeID']== t].open[inc], df[df['timeframeID']== t].close[inc],
fill_color="green", line_color="green")#, width=get_width())
name1.vbar(df[df['timeframeID']== t].index[dec], 0.5, df[df['timeframeID']== t].open[dec], df[df['timeframeID']== t].close[dec],
fill_color="#F2583E", line_color="#F2583E")#, width=get_width())

r = name1.circle(df[df['timeframeID']== t].index, df[df['timeframeID']== t].AV, alpha = 1, radius = .20)
name1.y_range.range_padding = 0.05

callback = CustomJS(args=dict(renderer=r), code="""
renderer.glyph.radius = cb_obj.value;
""")

s = Slider(start=0, end=1.5, value=.20, step=.05, title="Radius - " + t)
s.js_on_change('value', callback)

output_notebook()


output_file("candlestick.html", title="candlestick.py example")

sliders.append(s)
plots.append(name1)

show(column(
row(
*plots),*sliders))

1 Ответ

1 голос
/ 29 апреля 2020

В настоящее время вы напрямую предоставляете данные только для координат x и y. Боке ничего не знает о других данных. Чтобы bokeh знал о всех данных, вы должны передать источник через source=source в вашем vbar методе. Когда вы передаете источник, bokeh получает все данные, так что он может просматривать различные столбцы, которые будут отображаться при наведении.

Когда вы передаете источник, вы не можете напрямую передать координаты x, top и bottom, потому что иначе bokeh не знает, как связать эти значения с источником, который вы передали¹. Поэтому, когда вы передаете источник, вы хотите передать имена столбцов координат x, top и bottom вместо данных напрямую. Итак, вы хотите написать что-то вроде:

name1.vbar("index", "open", "close", source=source, fill_color="green", line_color="green")

. Для этого вам нужно создать источник / DataFrame, в котором уже есть нужные данные, вместо того, чтобы выполнять фильтрацию, которую вы выполняете в вызове vbar. , Не видя ваших данных, я не могу сказать вам, как бы вы построили такой Dataframe.

1: На самом деле bokeh связывает напрямую передаваемые данные через индекс, поэтому первое значение связано с первой строкой в ​​источнике.

...