You need to enable JavaScript to run this app. 独立Bokeh折线图:如何跳过NaN缺失值填充连线间隙
优惠活动
大模型
产品
解决方案
定价
更多

独立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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 12:24:09