如何让Matplotlib正确格式化datetime64对象并显示日期坐标轴?
Python水平条形图X轴日期显示异常修复方案
问题描述
尝试用matplotlib绘制水平条形图展示故障出现到修复的时间跨度,初始代码如下:
import matplotlib.pyplot as plt plt.barh(subset['sources'], width=subset['repairDate'], left=subset['appearanceDate'])
但X轴日期显示为整数而非标准日期格式。后续尝试添加日期格式化器,代码如下:
fig, ax = plt.subplots(1, 1) ax.barh(subset['sources'], width=subset['repairDate'], left=subset['appearanceDate']) ax.xaxis.set_major_locator(mdates.YearLocator(1)) ax.xaxis.set_major_formatter(mdates.ConciseDateFormatter(ax.xaxis.get_major_locator())) ax.set_xticklabels(ax.get_xticks(), rotation=90);
结果X轴刻度数量暴增,标签仍为整数,问题未解决。
核心原因
- 传入
barh的left和width参数若为datetime对象,matplotlib会自动将其转换为自1970年以来的天数(整数形式),但不会将X轴识别为日期轴。 - 额外执行
ax.set_xticklabels(ax.get_xticks())会覆盖日期格式化器的效果,强制显示整数。
修复步骤
1. 确保日期列是datetime类型
先将数据中的日期列转换为pandas datetime类型(若尚未转换):
import pandas as pd subset['appearanceDate'] = pd.to_datetime(subset['appearanceDate']) subset['repairDate'] = pd.to_datetime(subset['repairDate'])
2. 计算时间跨度数值
barh的width需要数值类型,因此计算故障出现到修复的天数(或其他时间单位):
subset['repair_duration'] = (subset['repairDate'] - subset['appearanceDate']).dt.days
3. 正确绘制并配置日期轴
将日期转换为matplotlib可识别的日期数值,再设置X轴的日期格式化规则,同时删除多余的set_xticklabels代码:
import matplotlib.pyplot as plt import matplotlib.dates as mdates fig, ax = plt.subplots(figsize=(10, 6)) # 将datetime转换为matplotlib日期数值 start_dates = mdates.date2num(subset['appearanceDate']) # 绘制水平条形图 ax.barh(subset['sources'], width=subset['repair_duration'], left=start_dates) # 配置X轴日期显示 ax.xaxis.set_major_locator(mdates.YearLocator(1)) # 按年显示刻度 ax.xaxis.set_major_formatter(mdates.ConciseDateFormatter(ax.xaxis.get_major_locator())) plt.xticks(rotation=90) plt.tight_layout() plt.show()
可选优化
如果希望X轴显示完整日期范围,可以手动设置X轴的上下限:
min_date = subset['appearanceDate'].min() max_date = subset['repairDate'].max() ax.set_xlim(mdates.date2num(min_date), mdates.date2num(max_date))
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

