设置major_formatter后Matplotlib坐标轴重复,如何无它实现时间格式化?
解决方案
要让Y轴显示%Y-%m-%d %H:%M:%S格式的时间字符串且不使用set_major_formatter,可以手动生成Y轴刻度对应的时间标签,直接替换原有的整数标签,具体实现如下:
修改后的完整代码
from datetime import datetime, timedelta from matplotlib import pyplot, dates # 保留原Y轴刻度位置,替换为时间标签 y_tick_positions = [0, 1, 2, 3, 4] # 定义Y轴对应的时间范围(示例用和X轴一致的时间区间,均分5个刻度点) ts_start = datetime.now() - timedelta(hours=1) ts_end = datetime.now() y_time_interval = (ts_end - ts_start) / (len(y_tick_positions) - 1) y_date_list = [ts_start + i * y_time_interval for i in range(len(y_tick_positions))] # 将时间对象格式化为目标字符串 y_tick_labels = [dt.strftime('%Y-%m-%d %H:%M:%S') for dt in y_date_list] # 设置Y轴刻度与自定义标签 pyplot.yticks(y_tick_positions, y_tick_labels, rotation=30) # 原X轴逻辑优化(避免创建新轴导致重复) x_dates = dates.drange(ts_start, ts_end, delta=timedelta(minutes=10)) pyplot.xlim(x_dates[0], x_dates[-1]) # 获取当前轴设置X轴格式,不会触发轴重复问题 ax = pyplot.gca() x_fmt = dates.DateFormatter('%Y-%m-%d %H:%M:%S') ax.xaxis.set_major_formatter(x_fmt) pyplot.tick_params(axis='x', labelrotation=30) pyplot.xticks(x_dates) pyplot.show()
关键说明
- 手动生成Y轴标签时,通过
strftime()将时间对象转为目标格式字符串,直接传递给yticks()的第二个参数即可替换原有整数标签 - 之前出现轴重复和
xlim/ylim失效,是因为pyplot.axes()会创建新的轴对象,改用pyplot.gca()获取当前已存在的轴再设置格式即可解决 - 你可以根据实际需求调整Y轴对应的时间范围,比如固定几个特定时间点,而非均分X轴的时间区间
内容的提问来源于stack exchange,提问作者R. Key
相关产品推荐
相关产品推荐

