Matplotlib设置x轴xticks仅展示每年年中位置的方法
问题描述
作为Python数据可视化方向的新手,在使用Matplotlib绘图时,希望x轴(xticks)仅在每一年的年中位置展示刻度。曾尝试使用date_range方法生成自定义刻度,但当前绘图结果中每年会同时显示两个x轴刻度,分别对应年初与年中位置,需要移除年初位置的多余x轴刻度,仅保留年中位置的目标刻度。
当前实际绘图效果为:x轴每年同时排布年初、年中两个刻度,不符合仅展示年中刻度的需求。
测试代码
texasdrought['ValidStart']=pd.to_datetime(texasdrought['ValidStart']) droughtMask = texasdrought[texasdrought['ValidStart'].dt.year.between(2005,2015)] # 设定画布尺寸 plt.figure(figsize = (30,16)) # 提取绘图用日期序列 dates = droughtMask["ValidStart"] # 整理不同等级的干旱数据 droughtcat = { 'D4 - 特大干旱': droughtMask["D4"], 'D3 - 极端干旱': droughtMask["D3"], 'D2 - 严重干旱': droughtMask["D2"], 'D1 - 中等干旱': droughtMask["D1"], 'D0 - 异常偏干': droughtMask["D0"] } fig, ax = plt.subplots() ax.stackplot(dates, droughtcat.values(), labels=droughtcat.keys(),colors=['#660000','#FF0000','#FF6600','#FFCC99','#FFFF00']) # 设定x轴日期格式化规则 yearsFmt = mdates.DateFormatter("'%y") ax.xaxis.set_major_formatter(yearsFmt) # 可选:将y轴设置为百分比格式 #ax.yaxis.set_major_formatter(mtick.PercentFormatter()) # 调整图例位置 ax.legend(loc='upper left') # 设定图表标题 ax.set_title('2005-2015年得克萨斯州干旱情况') ticks = pd.date_range('2005-01-01', '2015-12-31', freq='6M') plt.xticks(ticks) # 设定坐标轴标签 ax.set_xlabel('年份') ax.set_ylabel('干旱强度') # 保存图表文件 fig.savefig('DroughtPlot.jpg') plt.show()
问题成因
pd.date_range设置freq='6M'时,默认以每6个月的月末为时间锚点,从起始日期2005-01-01开始,生成的时间点依次为2005-06-30、2005-12-31、2006-06-30,本身就包含年中、年末两类时间点- Matplotlib默认的日期定位器会自动在每年年初补充生成刻度,两类刻度叠加后,就出现了年初、年中同时显示刻度的问题
解决步骤
- 调整自定义刻度生成逻辑:只取每年年中位置的时间点,剔除年末、年初的冗余时间,将原
ticks生成代码替换为:# 以每年7月1日为年中刻度点(可根据需求调整为6月15日、6月30日等具体年中时间) ticks = pd.date_range(start='2005-07-01', end='2015-07-01', freq='AS-JUL') - 关闭Matplotlib自动刻度生成:屏蔽系统自带的自动日期定位,仅使用自定义的年中刻度,在设置刻度前增加代码:
# 使用固定定位器绑定自定义刻度,覆盖默认的自动定位规则 ax.xaxis.set_major_locator(mdates.FixedLocator(ticks)) - 保留原有日期格式化规则,即可实现仅在年中位置显示带年份标识的刻度
注意:如果仍出现零散的冗余次要刻度,可执行
ax.xaxis.set_minor_locator(mdates.NullLocator())清空次要刻度,避免额外刻度干扰绘图效果。
内容的提问来源于stack exchange,提问作者Buzquer B
相关产品推荐
相关产品推荐

