Bokeh绘制1分钟K线图时如何在相邻蜡烛柱间设置小间隙
解决Bokeh 1分钟粒度K线拥挤、增加柱间隙的方法
核心原理
蜡烛柱完全相邻无间隙的原因很简单:绘制蜡烛实体时,vbar的宽度设置成了和单根K线时间粒度完全相等的长度(刚好1分钟)。在datetime类型的坐标轴下,vbar的width参数直接对应柱子横向占据的时间长度,只要按比例缩小这个宽度,相邻柱子之间自然会留出空隙,不需要做复杂的坐标偏移或者自定义图层。
操作步骤
- 调整硬编码的宽度值
现在代码里调用fig.vbar时,直接把宽度写死为timedelta(minutes=1),把这个值改成单根K线时间粒度的70%-90%,剩下的比例就会成为相邻柱子的间隙。
比如想要留20%的视觉空隙,就把宽度设为timedelta(seconds=48)(对应1分钟长度的80%)。间隙大小可以边调边看效果:觉得太挤就再缩小宽度,觉得柱子太细辨识度低就适当增大宽度。 - 清理无效的常量定义
代码开头定义的VBAR_WIDTH目前完全没有被实际调用,而且它的数值(606010000毫秒=10000小时)存在明显计算错误,可以直接删除,或者把它替换成实际需要的宽度值,统一在代码开头维护,后续切换K线时间粒度时只需要修改这一处数值即可。
替换后的核心代码片段
# 在代码开头统一定义蜡烛实体宽度,按1分钟粒度的80%设置 KLINE_BODY_WIDTH = timedelta(seconds=48) # 绘制蜡烛图的实体(开盘价与收盘价) r1 = fig.vbar(x='time_stamp', width=KLINE_BODY_WIDTH, top='price_open', bottom='price_close', source=cds, view=view_inc, fill_color=GREEN, line_color="black") r2 = fig.vbar(x='time_stamp', width=KLINE_BODY_WIDTH, top='price_open', bottom='price_close', source=cds, view=view_dec, fill_color=RED, line_color="black")
补充说明:高低价的竖线(segment)是绘制在每根K线的中心时间点上,不受vbar宽度影响,不需要额外调整位置。后续如果切换到5分钟、1小时等更大粒度的K线,只要按照同样的比例(取单根时间粒度的70%-90%长度)调整宽度参数,就能保持统一的视觉间隙效果。
内容的提问来源于stack exchange,提问作者mHelpMe
相关产品推荐
相关产品推荐

