如何在Matplotlib中为X轴设置指定月度日期范围
解决DataFrame累计数据绘图的X轴日期范围与刻度问题
方法一:直接通过Matplotlib调整坐标轴(无需修改DataFrame)
- 先确保日期列是datetime类型:
import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates # 转换Date列为datetime格式 df['Date'] = pd.to_datetime(df['Date']) - 绘图并设置X轴范围与刻度:
plt2 = df.plot(x='Date', y=['Total_Sales', 'Total_Cost', 'Profit'], kind='line', linewidth=4) # 强制X轴显示2022全年范围 plt2.set_xlim(pd.Timestamp('2022-01-01'), pd.Timestamp('2022-12-31')) # 设置主刻度为每月第一天,若要隔月显示则改为interval=2 plt2.xaxis.set_major_locator(mdates.MonthLocator(interval=1)) # 格式化日期显示格式 plt2.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y')) # 旋转刻度标签避免重叠 plt.xticks(rotation=45) plt.tight_layout() # 调整布局防止标签被截断 plt.show() - 说明:此方法无需改动原始数据,直接强制X轴覆盖全年范围,用
MonthLocator精准控制每月/隔月刻度,解决了你之前用DayLocator(interval=30)因月天数差异导致的日期错位问题。
方法二:补充DataFrame的每月初累计数据后绘图
如果希望DataFrame本身包含全年关键日期的累计数据,可按以下步骤操作:
- 生成2022年所有月初日期:
# 生成每月第一天的日期序列 month_starts = pd.date_range(start='2022-01-01', end='2022-12-31', freq='MS') # 转为DataFrame格式 month_df = pd.DataFrame({'Date': month_starts}) - 合并原始数据与月初日期,并用前向填充补充累计值:
# 合并数据并按日期排序 combined_df = pd.concat([df, month_df]).sort_values('Date') # 前向填充累计数据(累计值为连续状态,月初值等于上一次交易后的累计值) combined_df[['Total_Sales', 'Total_Cost', 'Profit']] = combined_df[['Total_Sales', 'Total_Cost', 'Profit']].ffill() - 用新的DataFrame绘图,此时X轴自然覆盖全年,再设置刻度:
plt2 = combined_df.plot(x='Date', y=['Total_Sales', 'Total_Cost', 'Profit'], kind='line', linewidth=4) plt2.xaxis.set_major_locator(mdates.MonthLocator(interval=1)) plt2.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y')) plt.xticks(rotation=45) plt.tight_layout() plt.show() - 说明:此方法让数据本身更完整,后续分析或绘图都能直接使用,适合需要保留全年日期数据的场景。
内容的提问来源于stack exchange,提问作者Kevindelange
相关产品推荐
相关产品推荐

