如何使Plotly的rangeselector选择时同步应用rangebreak的排除规则
问题原因
这个异常是Plotly中rangeselector和rangebreak配合的默认逻辑导致的:
- 你设置的1d按钮用了
step="day"、stepmode="backward"参数,点击时Plotly会直接生成过去24个自然小时的时间范围,而不是自动对齐到交易时段 - 如果生成的时间范围的起点/终点落在非交易时段内,rangebreak的默认逻辑只会移除完全落在所选范围内部的非交易时段,对边界处的非交易时段会默认保留用于填充区间,所以会显示盘外时间
- 2天及以上的时间范围通常包含完整的交易日,非交易时段完全落在区间内部,所以会被正常隐藏
解决方法
给rangebreaks的每个规则添加dvalue参数,强制Plotly识别并隐藏所有符合边界规则的时段,不受时间范围起止点的影响。dvalue参数单位为毫秒,对应你要隐藏的时段的最小时间间隔:
_ = fig.update_xaxes( rangeslider_visible=True, rangeselector=dict( buttons=[ dict(count=6.5, label="Intraday(6.5hrs)", step="hour", stepmode="todate"), dict(count=1, label="1d", step="day", stepmode="backward"), dict(count=2, label="2d", step="day", stepmode="backward"), dict(count=3, label="3d", step="day", stepmode="backward"), dict(count=4, label="4d", step="day", stepmode="backward"), dict(count=5, label="5d", step="day", stepmode="backward"), dict(step="all") ], font={"color": "white"}, bgcolor = 'black', ), rangebreaks=[ # 周末隐藏规则添加天级dvalue(1天=86400000毫秒) dict(bounds=["sat", "mon"], dvalue=1000*60*60*24), # 盘外时间隐藏规则添加小时级dvalue(1小时=3600000毫秒) dict(bounds=[16, 9.5], pattern="hour", dvalue=1000*60*60), ], row=1, col=1, )
修改后点击1d按钮时,边界处的非交易时段也会被正常隐藏,和其他时间范围的表现一致。
如果需要1d按钮直接显示当日的交易数据,也可以把1d按钮的stepmode从backward改为todate,点击时会自动从当日0点开始计算范围,同样可以避免显示非交易时段。
内容的提问来源于stack exchange,提问作者leonardltk1
相关产品推荐
相关产品推荐

