Bokeh是一个很好用的可视化工具库,画出来的图还是不错滴。比如想画历史上所有合约的螺纹-热卷价差。
整体质感还是不错的,比matplot好看,而且可以放大缩小,可以点击标签来选择是否显示。比如:
数据处理部分就不说了,这里应为我们是一个金融数据,x轴设置为日期。随便百度一下百度不到设置方法,所以找了一下官方的一些例子才实现。于是笔者实现之后来写个教程。
大致来看一下绘图的函数吧。
def plot_month_diff_line(plot_df, contract_df):
def datetime(x):
return np.array(x, dtype=np.datetime64)
# x = list(range(max([len(plot_df[col].dropna()) for col in plot_df.columns])))
x = date_list
x = [item.date() for item in x]
# 创建画布
p = figure(x_axis_type="datetime",
tools="pan,box_zoom,reset,save", y_range=[plot_df.min().min() * 1.05, plot_df.max().max() * 1.05], title="commodity monitor",
x_axis_label='time', y_axis_label='value', plot_height=700, plot_width=1400)
colors = itertools.cycle(palet.Category20[20])
for leg,color in zip(plot_df.columns, colors):
p.line(datetime(x), plot_df[leg].tolist(), legend=leg, line_width=3, line_color=color)
p.legend.label_text_font_size = "10pt"
p.legend.click_policy="hide"
return p
这里,我们的x是一个日期序列,笔者一开始以为只要将x的数据格式设置为时间格式就可以,后来发现还是太天真。这一点,需要bokeh改进一下。
在bokeh中,我们需要在设置绘图画布的时候,制定x轴类型为“datetime”
p = figure(x_axis_type="datetime",
tools="pan,box_zoom,reset,save", y_range=[plot_df.min().min() * 1.05, plot_df.max().max() * 1.05], title="commodity monitor",
x_axis_label='time', y_axis_label='value', plot_height=700, plot_width=1400)
然后传入的时间序列需要有个函数进行转换:
def datetime(x):
return np.array(x, dtype=np.datetime64)
当然,如果原来的x就是datetime64位的格式那就不需要。