matplotlib处理DateTime问题:血压数据绘图X轴非连续异常
问题原因
你代码中核心错误是调用dt.strftime('%d/%m/%y %H:%M')把解析完成的datetime时间类型数据转换成了字符串类型。matplotlib无法识别字符串中的时间先后和间隔逻辑,只会将每个字符串作为独立的分类标签按输入顺序排列,因此会出现时间间隔等距、所有数据点都生成刻度的异常表现。
修正方案
- 首先保留datetime原生类型作为X轴输入,不要提前转换为格式化字符串,若需要自定义时间显示格式,使用matplotlib自带的日期工具实现即可:
import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates # 修正:保留datetime类型,不转字符串 dataframe["DateTime"] = pd.to_datetime(df[["Year", "Month", "Day", "Hour", "Minute"]]) x = dataframe.DateTime a1 = pd.Series(dataframe["BP1 Sys"]) a2 = pd.Series(dataframe["BP2 Dia"]) a3 = pd.Series(dataframe["MAP"]) plt.title("血压变化趋势") plt.plot(x, a1, marker="^", label="收缩压") plt.plot(x, a2, marker="v", label="舒张压") plt.axhline(y=130, color="orange", linestyle="--", label="收缩压阈值") plt.axhline(y=60, color="purple", linestyle="--", label="舒张压阈值") plt.plot(x, a3, linestyle="dotted", color='green', label="平均动脉压") plt.bar(x=x, height=a1 - a2, bottom=a2, width=0.05, alpha=.2) plt.fill_between(x, a1, a2, color='blue', alpha=.1) plt.legend() # 自定义X轴时间格式和刻度密度 plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d/%m/%y %H:%M')) # 可根据数据时间跨度调整刻度间隔,比如跨度为1天可设为每3小时一个刻度 plt.gca().xaxis.set_major_locator(mdates.HourLocator(interval=3)) # 自动旋转刻度避免重叠 plt.gcf().autofmt_xdate() plt.show()
- 上述修改既保留了连续时间轴的逻辑,也能实现你需要的时间显示格式,matplotlib会自动根据时间间隔排布数据点位置。
内容的提问来源于stack exchange,提问作者obidose
相关产品推荐
相关产品推荐

