You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Bokeh绘制气象时序折线图无数据显示,需排查代码问题

气象时序折线图无数据显示的问题排查与修复

代码中的核心问题

  • Precip类型转换未生效:data['Precip'].astype(float)仅执行转换但未将结果写回DataFrame,导致Precip仍为字符串类型,Bokeh无法识别为数值数据进行绘图。
  • x_range范围设置错误:x轴设为datetime类型,但x_range=(0,200)是数值范围,与时间数据的范围完全不匹配,导致数据被挤出可视区域。
  • 数据排序未生效:d.sort_values('Date')没有修改原数据,需要添加inplace=True或重新赋值,否则时间轴数据可能乱序。
  • 冗余循环逻辑:initial_values是已过滤站点的集合,循环只会处理单个站点,且重复覆盖subset变量,完全没必要。

修复后的完整代码

import pandas as pd
from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource
from bokeh.palettes import Category20_16

# 读取并预处理数据
data = pd.read_csv('weather.csv')[['STA','Date','Precip','MaxTemp','MinTemp','MeanTemp','Snowfall']].dropna()
data = data[data['Precip'] != 'T']
# 关键:将转换结果赋值回原列
data['Precip'] = data['Precip'].astype(float)
data['STA'] = data['STA'].astype("string")
data['Date'] = pd.to_datetime(data['Date'])

# 站点处理(假设select是已定义的选择控件)
select_inital = select.value
subset = data[data['STA'] == select_inital]
d = subset[['Date','Precip']].sort_values('Date')  # 直接排序并赋值

# 创建数据源(可选,用Bokeh的数据源更规范)
source = ColumnDataSource(d)

# 创建绘图对象:移除错误的x_range,让Bokeh自动适配时间范围
p = figure(plot_width=700, plot_height=700, title='气象数据演变',
           x_axis_label='日期', y_axis_label='降水量', x_axis_type='datetime')
# 使用数据源或直接传入列,这里用数据源更推荐
p.line(x='Date', y='Precip', source=source, legend_label="降水量变化", line_width=2)

show(p)

额外说明

  • 如果select是未定义的变量,需要确保它是Bokeh的Select控件且已正确初始化,否则select_inital会报错。
  • 若要绘制多站点数据,可保留循环但需在循环内调用p.line添加每条线,同时避免覆盖数据源。

内容的提问来源于stack exchange,提问作者Razieh Delavar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:41:44