如何在Python折线图中将日期格式设置为YYYY-MM并正确排序
解决方法
问题出在你分组后得到的tanggal列是Period类型(YYYY-MM格式的周期对象),而matplotlib的日期格式化工具只识别datetime64类型的日期数据;同时直接用月份数字绘图会丢失年份信息,导致重复月份出现折线回退的问题。
步骤1:转换日期类型并排序
先把Period类型转为matplotlib能识别的datetime类型,同时确保数据按时间顺序排列:
# 将Period转为datetime(默认取每月第一天) df4['tanggal_dt'] = df4['tanggal'].dt.to_timestamp() # 按日期排序,避免折线顺序混乱 df4 = df4.sort_values('tanggal_dt')
步骤2:修正绘图代码
用转换后的datetime列作为x轴,再设置日期格式化:
import matplotlib.pyplot as plt import matplotlib.dates as mdates fig, ax1 = plt.subplots() # 使用datetime列作为x轴,确保年份和月份都被识别 ax1.plot(df4['tanggal_dt'], df4['jumlah'], lw=2) # 设置x轴显示格式为YYYY-MM myFmt = mdates.DateFormatter('%Y-%m') ax1.xaxis.set_major_formatter(myFmt) # 设置每月显示一个刻度,避免刻度拥挤 ax1.xaxis.set_major_locator(mdates.MonthLocator()) plt.xticks(rotation=45) plt.tight_layout() # 防止x轴标签被截断 plt.show()
简化方案:用pandas自带绘图
如果不想写太多matplotlib代码,也可以直接用pandas的plot方法,它会自动处理datetime类型:
import matplotlib.pyplot as plt import matplotlib.dates as mdates df4['tanggal_dt'] = df4['tanggal'].dt.to_timestamp() df4 = df4.sort_values('tanggal_dt') ax = df4.plot(x='tanggal_dt', y='jumlah', lw=2, rot=45) ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m')) ax.xaxis.set_major_locator(mdates.MonthLocator()) plt.tight_layout() plt.show()
报错原因说明
你之前的代码用df5.month作为x轴,这只是单独的月份数字(1-12),丢失了年份信息,而且matplotlib无法将普通数字识别为日期轴,所以mdates.DateFormatter会报错“未告知轴正在绘制日期”。转换为datetime类型后,matplotlib会自动将x轴标记为日期轴,格式化工具就能正常工作了。
内容的提问来源于stack exchange,提问作者Peb Mpeeb
相关产品推荐
相关产品推荐

