如何将Matplotlib直方图X轴从秒数整数改为MM:SS格式?
解决直方图X轴秒数转MM:SS格式的问题
你的代码里用mdates.DateFormatter出错的原因很直接:这个工具是用来处理日期时间类型数据的,它会把输入的数值当成「从1970年1月1日算起的天数」,而你的X轴是秒数(比如60秒),在它眼里只是0天的极小一部分,所以所有刻度都显示00:00。
正确的做法是用FuncFormatter自定义一个格式化函数,直接把秒数转换成MM:SS格式,具体修改如下:
修改后的完整代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib.ticker import FuncFormatter # 导入自定义格式器 # 生成模拟数据:0到1800秒的随机响应时间 df = pd.DataFrame(np.random.randint(0, 1800, size=(1000, 1)), columns=['A']) start_value = 0 end_value = 1800 increment_by_value = 60 # 设置画布 fig = plt.figure(dpi=100, figsize=(8, 6.5)) ax = fig.add_subplot(111) # 绘制直方图 plt.hist(df.A, bins=np.arange(start_value, end_value, increment_by_value), color='Purple', label='响应时间', edgecolor='Gray', linewidth=1.0) # 自定义秒数转MM:SS的格式化函数 def seconds_to_mmss(x, pos): minutes = int(x // 60) seconds = int(x % 60) return f"{minutes:02d}:{seconds:02d}" # 应用自定义格式器 ax.xaxis.set_major_formatter(FuncFormatter(seconds_to_mmss)) # 设置X轴刻度,每60秒一个 plt.xticks(np.arange(start_value, end_value, increment_by_value), rotation='vertical') # 设置标题和标签 plt.title("心脏骤停响应时间\n(按1分钟间隔统计)") plt.xlabel("响应时间区间(MM:SS)") plt.ylabel("呼叫次数") plt.legend() plt.show()
关键改动说明
- 替换了
mdates.DateFormatter,改用FuncFormatter实现自定义格式转换 - 新增的
seconds_to_mmss函数会把输入的秒数拆解为分钟和秒,并用两位数字格式化(比如60秒转成01:00) - 调整了标题和X轴标签的文字,让表述更贴合MM:SS格式
内容的提问来源于stack exchange,提问作者David Fort Myers
相关产品推荐
相关产品推荐

