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

如何用Bokeh将年份显示在X轴?CSV仅含年份却显示月份

解决Bokeh图表X轴显示月份而非年份的问题

问题原因

当你用pd.to_datetime(data['year'])处理纯年份数据时,Pandas会自动将年份补全为当年1月1日00:00:00的datetime格式(比如2010会变成2010-01-01)。Bokeh的datetime轴会根据数据的时间范围自动生成刻度,由于你的数据实际是精确到日的datetime值,轴上就会出现月份刻度。


方案1:自定义Datetime轴的刻度与格式(保留datetime类型)

通过指定刻度间隔为1年,并设置仅显示年份的格式,强制X轴只展示年份:

from bokeh.plotting import figure
from bokeh.io import show
from bokeh.models import DatetimeTickFormatter, YearsTicker
import pandas as pd

# 读取数据
data = pd.read_csv('amountsaved.csv')
# 转换为datetime(自动补全为1月1日)
data['year'] = pd.to_datetime(data['year'])

# 创建图表,保留datetime轴类型
p = figure(title="amount saved", x_axis_type='datetime', x_axis_label="year", y_axis_label="amount")

# 移除未定义的x,y线(原代码中x,y未赋值,会报错)
# p.line(x, y, legend_label="amt saved", line_width=2)

# 绘制数据
p.line(data['year'], data['amountsaved'], line_color='green', legend_label="amt saved", line_width=2)

# 设置X轴刻度:每隔1年显示一个刻度
p.xaxis.ticker = YearsTicker(years=list(data['year'].dt.year.unique()))
# 设置X轴刻度格式:仅显示年份
p.xaxis.formatter = DatetimeTickFormatter(
    years=["%Y"],
    months=["%Y"],  # 防止缩放时显示月份
    days=["%Y"]     # 防止缩放时显示日期
)

show(p)

方案2:将年份作为分类变量处理(无需datetime轴)

如果你的数据不需要时间轴的连续特性(比如不需要按时间范围缩放),可以直接使用年份的字符串/整数作为X轴:

from bokeh.plotting import figure
from bokeh.io import show
import pandas as pd

# 读取数据,不转换为datetime,直接保留年份(可转为整数或字符串)
data = pd.read_csv('amountsaved.csv')
data['year'] = data['year'].astype(str)  # 转为字符串作为分类值

# 创建图表,不指定x_axis_type(默认是线性/分类轴)
p = figure(title="amount saved", x_axis_label="year", y_axis_label="amount", x_range=data['year'].unique())

# 绘制数据
p.line(data['year'], data['amountsaved'], line_color='green', legend_label="amt saved", line_width=2)

show(p)

额外提示

原代码中p.line(x, y, ...)这一行的x和y变量未定义,运行时会报错,建议删除或替换为实际数据列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:22:30