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

pandas绘制ONI指数柱状图设置x轴每5年显示刻度仅展示1年问题求助

问题原因
  • pandas调用plot方法绘制kind='bar'柱状图时,会自动将x轴处理为分类离散轴,而非时间序列对应的连续数值轴:哪怕你的DATE列是datetime类型,绘图时x轴的实际坐标是从0开始的整数索引(对应第1个、第2个…第n个柱子),和日期的时间戳数值无对应关系。
  • mdates.YearLocator是针对datetime连续数值轴设计的定位器,无法匹配分类轴的整数坐标,自然无法正确定位到每5年对应的位置,只会出现极少甚至1个刻度。
解决方案

推荐直接使用matplotlib原生的bar方法绘图,保留x轴的时间连续属性,即可正常使用日期定位器和格式化器,修改后代码如下:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.dates import DateFormatter
from matplotlib.ticker import MaxNLocator
import pandas as pd

# 先确保DATE列是datetime类型,如果不是先转换
df_oni['DATE'] = pd.to_datetime(df_oni['DATE'])

fig = plt.figure('ONI', figsize=(15,20), dpi=200)
ax = fig.add_axes([0.15,0.15,0.7,0.7])

# 改用matplotlib原生bar绘图,x轴直接传入日期序列,width设置柱子宽度适配月度数据
ax.bar(df_oni['DATE'], df_oni['ONI'], width=20, alpha=0.5, 
       color=df_oni.positive.map({True: 'r', False: 'b'}))

# 日期定位和格式化代码可以正常生效
date_form = DateFormatter("%Y")
ax.xaxis.set_major_formatter(date_form)
ax.xaxis.set_major_locator(mdates.YearLocator(base=5))

ax.xaxis.set_tick_params(rotation=0)
ax.set_title("Indice ONI",fontsize= 14,fontweight="bold")
ax.set_ylabel("Valor del Índice\n", fontsize = 10.0)
ax.yaxis.set_major_locator(MaxNLocator(integer=True, min_n_ticks=1))
ax.set_xlabel("")

plt.show()

补充说明

如果坚持要使用pandas的plot.bar方法,可以手动计算每5年对应的索引位置,手动设置刻度:

# 先获取所有唯一的年份,筛选间隔5年的年份
target_years = range(df_oni['YEAR'].min(), df_oni['YEAR'].max()+1, 5)
# 找到每个目标年份第一个出现的索引位置
tick_pos = [df_oni[df_oni['YEAR'] == y].index[0] - df_oni.index[0] for y in target_years]
# 手动设置刻度和标签
ax.set_xticks(tick_pos)
ax.set_xticklabels(target_years)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:36:00