独立Bokeh折线图:如何跳过NaN缺失值填充连线间隙
核心问题原因
Bokeh针对缺失值的自动连线处理逻辑,仅在连续数值/时间类型的x轴下生效。当使用FactorRange作为分类x轴时,数据源里的NaN值会被判定为线段的合法断点,不会自动跳过缺失位置连接前后有效点,因此会出现连线断裂的效果。
可落地实现方案
最轻量化的实现逻辑是拆分图层的数据源,既保留原有全量分类x轴的展示,又实现折线跳过缺失值连续的效果,不需要额外复杂计算:
- 保留带缺失值的全量原始数据集,供圆形标记图层使用——Bokeh本身绘制散点时会自动跳过NaN值,不会在缺失位置显示多余标记,和原效果完全一致
- 单独构造过滤掉所有NaN值的数据集,专供折线图层使用——由于折线是按数据源内的行顺序依次连接点位,只要过滤掉缺失值对应的行,就会自动跨过缺失的x位置,连接相邻的两个有效点位
- 初始化
FactorRange时,仍然传入原始全量的x分类列表,保证x轴上的月份标签不会因为数据过滤而缺失
改造后的完整代码示例
import pandas as pd import numpy as np from bokeh.plotting import figure, show from bokeh.models import FactorRange # 原始带缺失值的数据集 data = pd.DataFrame({ 'YYYY_MM': {0: '2020-11', 1: '2020-12', 2: '2021-01', 3: '2021-02', 4: '2021-03'}, 'value': {0: 0.7, 1: np.nan, 2: 0.5, 3: 0.8, 4: 0.2} }) # 全量x分类列表,用于初始化x轴范围,保证所有月份标签完整显示 factors = data["YYYY_MM"].tolist() # 构造供折线使用的、过滤了缺失值的数据集 line_data = data.dropna(subset=["value"]) p = figure(x_range=FactorRange(*factors), plot_height=350) # 折线使用过滤后的数据源,自动跳过缺失值连续 p.line( x="YYYY_MM", y="value", source=line_data, color="orange", line_width=2, legend_label="legend" ) # 散点使用原始全量数据,缺失值位置自然不显示标记 p.circle( x="YYYY_MM", y="value", source=data, color="orange", size=6, legend_label="legend" ) show(p)
关键注意事项
- 一定不要用过滤后的折线数据源来生成
FactorRange的分类列表,否则缺失值对应的x轴标签会从轴上消失 - 保证过滤后的折线数据源和原始数据保持相同排序,避免连线因为行顺序错乱出现交叉
- 该方案不需要修改原始数据、不需要额外插值计算,完全保留原图表的视觉一致性
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

