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

如何使用Matplotlib调整图表X轴日期标签为每年年末指定刻度显示

问题解决方案

核心问题根因

  • 代码最后将df['계약년월']通过dt.strftime('%Y%m')转换为字符串类型,matplotlib无法将其识别为时间序列,所有日期类定位器配置都会失效,只会按照离散分类变量处理X轴
  • 同时使用plt.xticks()手动指定刻度和xaxis.set_major_locator()自动配置刻度,两者规则冲突,导致刻度显示紊乱,出现无效日期值

修复方案

直接保留계약년월的datetime类型,搭配matplotlib的日期定位器和格式化器即可实现需求,完整修正代码如下:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd

df = pd.read_excel('data.xlsx')
df = df.loc[df['계약면적(㎡)'] > 33]

# 处理日期,保留datetime格式,不要转成字符串
df['계약년월'] = df['계약년월'].astype(str)
df['계약년월'] = df['계약년월'].str[0:4] + '-' + df['계약년월'].str[4:6] + '-01'
df['계약년월'] = pd.to_datetime(df['계약년월'])

# 绘图
plt.figure(figsize=(30,10))
ax = plt.gca()

# Y轴配置保持不变
yticks = [100000, 200000, 300000, 400000, 500000, 600000, 700000, 800000]
ylabels = [10, 20, 30, 40, 50, 60, 70, 80]
plt.yticks(yticks, labels = ylabels)

# X轴配置:仅显示每年12月的刻度,格式为%Y%m
ax.xaxis.set_major_locator(mdates.MonthLocator(bymonth=12))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y%m'))

# 如果需要显示为2011y-end格式,把上面的formatter替换为下面的即可
# ax.xaxis.set_major_formatter(mdates.DateFormatter('%Yy-end'))

plt.scatter(df['계약년월'], df['면적당 금액(원)'])
plt.xlabel('계약년월')
plt.ylabel('면적당 금액(원/㎡)')

plt.savefig('Graph.jpg')

关键修改说明

  • 移除了将日期转字符串的dt.strftime步骤,保留datetime类型让matplotlib可以识别时间维度
  • X轴主定位器指定bymonth=12,自动匹配每年12月的位置作为刻度,不需要手动维护刻度列表
  • 新增X轴日期格式化器,直接输出%Y%m格式的刻度值,和需求的201112、201212格式完全匹配
  • 移除了冲突的手动plt.xticks配置,避免规则冲突

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:36:03