求助: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
相关产品推荐
相关产品推荐

