如何用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
相关产品推荐
相关产品推荐

