Python绘图中如何设置日期轴按指定区间(如月末)显示
解决Pandas散点图X轴日期密集挤压问题
问题场景
使用以下代码绘制日期-数量散点图时,X轴日期过于密集导致无法清晰查看,希望按指定日期区间(如每月最后一天:2022-01-30、2022-02-28、2022-03-31等)显示刻度:
import pandas as pd import matplotlib.pyplot as plt # 示例数据 data = {'2022-01-30': 50, '2022-01-31': 152, '2022-02-01': 41, '2022-02-02': 50,'2022-02-03': 50, '2022-02-04': 50, '2022-02-05': 50, '2022-02-06': 50, '2022-02-07': 50, '2022-02-08': 50, '2022-02-09': 50, '2022-09-30': 50} df = pd.Series(data, name='Quantity').rename_axis('Date').reset_index() df.plot(kind='scatter', x='Date', y='Quantity') plt.show()
解决方案核心步骤
要实现指定日期区间显示X轴刻度,关键是将日期列转为datetime类型,并利用matplotlib的日期定位器和格式化工具自定义刻度:
方法1:按每月最后一天自动生成刻度
import pandas as pd import matplotlib.pyplot as plt from matplotlib.dates import MonthLocator, DateFormatter # 1. 将Date列转换为datetime类型(必须步骤) df['Date'] = pd.to_datetime(df['Date']) # 2. 创建绘图对象并绘制散点图 fig, ax = plt.subplots() ax.scatter(df['Date'], df['Quantity']) # 3. 设置X轴主刻度为每月最后一天 ax.xaxis.set_major_locator(MonthLocator(bymonthday=-1)) # 设置日期显示格式 ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d')) # 4. 旋转X轴标签避免重叠,自动调整布局 plt.xticks(rotation=45) plt.tight_layout() plt.show()
方法2:完全自定义指定日期刻度
如果需要精准指定要显示的日期列表,可直接手动设置刻度值:
import pandas as pd import matplotlib.pyplot as plt # 1. 转换日期列 df['Date'] = pd.to_datetime(df['Date']) # 2. 自定义要显示的目标日期 custom_dates = pd.to_datetime([ '2022-01-30', '2022-02-28', '2022-03-31', '2022-04-30', '2022-05-31', '2022-06-30', '2022-07-31', '2022-08-31', '2022-09-30' ]) # 3. 绘图并设置自定义刻度 fig, ax = plt.subplots() ax.scatter(df['Date'], df['Quantity']) ax.set_xticks(custom_dates) ax.set_xticklabels(custom_dates.strftime('%Y-%m-%d')) # 优化标签显示 plt.xticks(rotation=45) plt.tight_layout() plt.show()
关键说明
- 必须先将
Date列转为datetime类型,否则matplotlib无法识别为日期数据进行处理。 - matplotlib还提供
WeekLocator、QuarterLocator等工具,可按需调整刻度频率。 rotation=45和tight_layout()是优化标签显示的常用手段,避免文字重叠。
内容的提问来源于stack exchange,提问作者William Page
相关产品推荐
相关产品推荐

