如何在Pandas时间序列图上叠加高亮可靠性低于95的区域
为Pandas时间序列添加低可信度时段高亮
你可以借助Matplotlib直接在图表上绘制半透明矩形,标记出reliability低于95的时段。以下是完整实现代码:
import pandas as pd import datetime import matplotlib.pyplot as plt from matplotlib.patches import Rectangle # 构造数据 d = { 'end_time': [datetime.datetime(2020, 3, 17, 0, i*5) for i in range(12)], 'measurement': [2000, 1500, 800, 900, 400, 4000, 300, 900, 1000, 1250, 1100, 1300], 'reliability': [99, 81, 84, 85, 99, 86, 96, 97, 98, 99, 98, 97] } subset_df = pd.DataFrame.from_dict(d) # 创建绘图对象 fig, ax = plt.subplots(figsize=(10, 5)) subset_df.plot('end_time', 'measurement', ax=ax) # 找出reliability < 95的连续区间 low_reliability = subset_df['reliability'] < 95 # 标记区间的起始和结束索引 start_indices = low_reliability[low_reliability & ~low_reliability.shift(1).fillna(False)].index end_indices = low_reliability[low_reliability & ~low_reliability.shift(-1).fillna(False)].index # 获取y轴范围,确定高亮矩形的高度 y_min, y_max = ax.get_ylim() height = y_max - y_min # 逐个添加高亮矩形 for start, end in zip(start_indices, end_indices): # 起始时间和结束时间(取下一个时间点作为区间结束) start_time = subset_df.loc[start, 'end_time'] end_time = subset_df.loc[end + 1, 'end_time'] if end + 1 < len(subset_df) else subset_df.loc[end, 'end_time'] # 计算时间差对应的x轴坐标 x_start = ax.get_xlim()[0] + (start_time - subset_df['end_time'].min()) / (subset_df['end_time'].max() - subset_df['end_time'].min()) * (ax.get_xlim()[1] - ax.get_xlim()[0]) x_end = ax.get_xlim()[0] + (end_time - subset_df['end_time'].min()) / (subset_df['end_time'].max() - subset_df['end_time'].min()) * (ax.get_xlim()[1] - ax.get_xlim()[0]) # 添加半透明矩形 rect = Rectangle((x_start, y_min), x_end - x_start, height, color='red', alpha=0.2) ax.add_patch(rect) # 重置y轴范围(避免添加矩形后范围变化) ax.set_ylim(y_min, y_max) plt.xlabel('时间') plt.ylabel('测量值') plt.title('测量值随时间变化(红色高亮低可信度时段)') plt.show()
关键说明
- 先通过
low_reliability = subset_df['reliability'] < 95筛选低可信度行,再用shift()识别连续区间的起止索引 - 用Matplotlib的
Rectangle绘制半透明红色矩形,alpha=0.2保证不遮挡主曲线 - 矩形宽度匹配低可信度时段的时间范围,高度覆盖整个测量值区间,确保标识清晰
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

