Matplotlib设置x轴5分钟间隔主刻度显示异常问题求助
解决Matplotlib中x轴时间刻度(5分钟间隔)不显示的问题
看起来你遇到的核心问题是只设置了刻度标签,但没有指定这些标签对应的刻度位置,再加上原始的x轴数据可能还是字符串类型,导致Matplotlib无法正确映射刻度位置。我来一步步帮你修复这个问题:
问题分析
- 你的
x数据(ホール入時間)从CSV读取后大概率是字符串格式,不是datetime类型,Matplotlib无法识别为时间轴; - 你生成了5分钟间隔的
xTicks,但只调用了ax.set_xticklabels(),没有先设置刻度的位置(ax.set_xticks()),导致标签和实际刻度位置不匹配; - 直接设置标签可能会因为布局问题被截断,需要调整图表布局。
修复步骤及代码修改
下面是调整后的完整代码,我会标注关键改动:
# -*- coding: utf-8 -*- from os import listdir from os.path import isfile, join import pandas as pd from Common import common as comm from matplotlib.font_manager import FontProperties import matplotlib.pyplot as plt from matplotlib.dates import DateFormatter # 新增:用于格式化时间标签 fp = FontProperties(fname="../templates/fonts/msgothic.ttc") config = comm.configRead() commonConf = comm.getCommonConfig(config) peopleBhvConf = comm.getPeopleBhvConf(config) files = [f for f in listdir(commonConf['resultFilePath']) if isfile(join(commonConf['resultFilePath'], f))] waitTimeGraphInput = [s for s in files if peopleBhvConf['resultFileName'] in s] waitTimeGraphFile = commonConf['inputFilePath'] + waitTimeGraphInput[0] waitTimeGraph = pd.read_csv(waitTimeGraphFile) # --- 关键改动1:将x轴的时间字符串转换为datetime类型 --- waitTimeGraph['ホール入時間'] = pd.to_datetime(waitTimeGraph['ホール入時間'], format='%H:%M:%S') x = waitTimeGraph['ホール入時間'] y = waitTimeGraph['滞留時間(出-入sec)'] # --- 关键改动2:生成5分钟间隔的刻度位置 --- xTicks = pd.date_range(start=x.min(), end=x.max(), freq="5min") fig, ax = plt.subplots() ax.scatter(x, y) # --- 关键改动3:先设置刻度位置,再设置标签 --- ax.set_xticks(xTicks) # 使用DateFormatter格式化标签,只显示小时:分钟(节省空间),如果需要秒可以改成'%H:%M:%S' date_format = DateFormatter('%H:%M') ax.xaxis.set_major_formatter(date_format) # 绘制红线(这里xmin/xmax应该用0-1的比例,不是原始x值,之前的写法有误) plt.axhline(y=100, xmin=0, xmax=1, linewidth=2, color='red') # 调整标签旋转和对齐 plt.setp(ax.get_xticklabels(), rotation=30, ha='right', fontproperties=fp) # --- 关键改动4:调整布局,防止标签被截断 --- plt.tight_layout() plt.savefig(commonConf['resultFilePath'] + '1人1人の待ち時間分布.png') plt.show()
核心修改点说明
- 转换时间类型:用
pd.to_datetime()把字符串时间转成datetime,让Matplotlib能识别为时间轴; - 先设刻度位置再设标签:
ax.set_xticks(xTicks)指定刻度的位置,再用格式化工具设置标签内容,确保标签和位置一一对应; - 优化时间标签格式:用
DateFormatter自定义显示格式(比如只显示%H:%M),减少空间占用; - 修正axhline的xmin/xmax:
axhline的xmin/xmax是0到1的相对比例,不是原始x轴的时间值,之前的写法会导致红线位置错误; - 添加tight_layout:自动调整图表布局,避免标签被截断或重叠。
这样修改后,x轴就会按照5分钟的间隔显示清晰的时间刻度,同时不会占用过多空间啦。
内容的提问来源于stack exchange,提问作者oRoberto
相关产品推荐
相关产品推荐

