How do you get a tool tip on Bokeh candlestick chart like this:
or/and a lable like this:
The code I have so far for drawing the chart is as follows:
JavaScript
x
57
57
1
import pandas as pd
2
import numpy as np
3
from bokeh.plotting import figure, output_notebook, show
4
from bokeh.models import LinearAxis, Range1d, Segment, Legend
5
from bokeh.models.formatters import NumeralTickFormatter, DatetimeTickFormatter
6
from bokeh.palettes import Category20
7
output_notebook()
8
9
def init_chart(name):
10
# Tools Selections:
11
TOOLS = "pan,xwheel_zoom,box_zoom,crosshair,undo,redo,reset,save"
12
13
p = figure(x_axis_type="datetime", tools=TOOLS,
14
title = name)
15
p.add_layout(Legend(click_policy="hide", orientation='horizontal', spacing=20), 'below')
16
p.sizing_mode = 'scale_both'
17
18
return p
19
20
def init_price_volume_chart(p, df):
21
RED = Category20[7][6]
22
GREEN = Category20[5][4]
23
24
inc = df.Close > df.Open
25
dec = df.Open > df.Close
26
w = 12*60*60*1000 # half day in ms
27
28
p.x_range = Range1d(df.index[0], df.index[-1])
29
p.xaxis[0].formatter = DatetimeTickFormatter(months="%b %Y", days="%d %b %Y")
30
p.xaxis.axis_label = 'Date'
31
p.xaxis.major_label_orientation = 3.1415/4
32
p.xaxis.ticker.desired_num_ticks = 40
33
34
# left y axis
35
low, high = df.Low.min(), df.High.max()
36
p.y_range = Range1d(low * 0.9, high * 1.1)
37
p.yaxis.axis_label = 'Price'
38
p.yaxis[0].formatter = NumeralTickFormatter(format="0,0.00")
39
p.segment(df.index, df.High, df.index, df.Low, color=GREEN, legend_label='Candlestick')
40
p.vbar(df.index[inc], w, df.Open[inc], df.Close[inc],
41
fill_color=GREEN, line_color=GREEN, legend_label='Candlestick')
42
p.vbar(df.index[dec], w, df.Open[dec], df.Close[dec],
43
fill_color=RED, line_color=RED, legend_label='Candlestick')
44
45
# right y axis
46
p.extra_y_ranges.update({'two': Range1d(0, 1.1*df.Volume.max())})
47
p.add_layout(LinearAxis(y_range_name='two', axis_label='Volume' ), 'right')
48
p.yaxis[1].formatter = NumeralTickFormatter(format="0a")
49
p.vbar(df.index[inc], w, df.Volume[inc], [0]*inc.sum(), alpha=0.5, level='underlay',
50
fill_color=GREEN, line_color=GREEN,
51
legend_label='Volume', y_range_name='two')
52
p.vbar(df.index[dec], w, df.Volume[dec], [0]*dec.sum(), alpha=0.5, level='underlay',
53
fill_color=RED, line_color=RED,
54
legend_label='Volume', y_range_name='two')
55
56
return p
57
Advertisement
Answer
Your Bokeh Candlesticks consists of two glyphs: vbar
and segment
. In the code below there is only a tooltip on the vbar
but you could add it also to the segment
(code made for Bokeh v2.1.1) I also left out irrelevant code to make the code look simpler.
JavaScript
1
42
42
1
import pandas as pd
2
from bokeh.plotting import figure, output_notebook, show
3
from bokeh.models import Legend, HoverTool, ColumnDataSource
4
from bokeh.palettes import Category20
5
from datetime import datetime, timedelta
6
output_notebook()
7
8
df = pd.DataFrame({"index": [datetime(2017,1,1) + timedelta(days=x) for x in range(0,3)], "Open": [3, 2, 3], "Low": [2, 0.5, 2.5], "High": [5, 3, 4.5], "Close": [4, 1, 4.5], "Volume": [10000, 20000, 10000]})
9
df_red = df.loc[(df['Open'] >= df['Close'])]
10
df_green = df.loc[(df['Close'] >= df['Open'])]
11
12
source = ColumnDataSource(df)
13
source_red = ColumnDataSource(df_red)
14
source_green = ColumnDataSource(df_green)
15
16
RED = Category20[7][6]
17
GREEN = Category20[5][4]
18
w = 12*60*60*1000
19
20
def init_chart(name):
21
# Tools Selections:
22
TOOLS = "pan,xwheel_zoom,box_zoom,crosshair,undo,redo,reset,save"
23
p = figure(x_axis_type="datetime", tools=TOOLS, title = name, plot_width = 1200, plot_height=500)
24
p.add_layout(Legend(click_policy="hide", orientation='horizontal', spacing=20), 'below')
25
p.sizing_mode = 'scale_both'
26
return p
27
28
p = init_chart('Plot1')
29
30
segmnts_green = p.segment('index', 'High', 'index', 'Low', color=GREEN, source=source_green, legend_label='Up')
31
segmnts_red = p.segment('index', 'High', 'index', 'Low', color=RED, source=source_red, legend_label='Down')
32
vbars_green = p.vbar('index', w, 'Open', 'Close', source=source_green, fill_color=GREEN, line_color=GREEN, legend_label='Up')
33
vbars_red = p.vbar('index', w, 'Close', 'Open', source=source_red, fill_color=RED, line_color=RED, legend_label='Down')
34
35
tooltips=[('open', '@Open'),('close', '@Close'), ('low', '@Low'), ('high', '@High')]
36
red_hover = HoverTool(renderers=[vbars_red], tooltips=tooltips)
37
p.add_tools(red_hover)
38
green_hover = HoverTool(renderers=[vbars_green], tooltips=tooltips)
39
p.add_tools(green_hover)
40
41
show(p)
42