如何使用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
相关产品推荐
相关产品推荐

