如何基于CSV数据在指定锚点叠加多组曲线图以对比分析
实现以“大幅下降”点为锚点的曲线叠加对比
核心思路
要让多组曲线在大幅下降点对齐,关键是将每组数据的时间轴以自身的下降锚点为基准平移,使所有曲线的下降点都落在x=0位置,这样就能直观对比下降前后的趋势差异。
具体实现步骤
- 定位每组数据的下降锚点:通过计算
Kanal A的相邻差值,找到降幅最大的点,该点对应的时间即为锚点时间。 - 调整时间轴:将每组数据的
Zeit列减去锚点时间,让锚点位置的x坐标变为0。 - 绘制对齐后的曲线:使用调整后的时间轴绘图,添加图例、坐标轴标签等增强可读性。
修改后的代码
import pandas as pd import matplotlib.pyplot as plt def find_drop_anchor(df, value_col='Kanal A'): # 计算相邻值的差值,降幅最大的点对应最小的差值(负数) diffs = df[value_col].diff() # 找到降幅最大的索引(排除第一个NaN值) anchor_idx = diffs[1:].idxmin() # 返回锚点对应的时间值 return df.loc[anchor_idx, 'Zeit'] # 读取数据 data_files = ['data1.csv', 'data2.csv', 'data3.csv', 'data4.csv'] datasets = [] labels = ['Dataset 1', 'Dataset 2', 'Dataset 3', 'Dataset 4'] for file in data_files: df = pd.read_csv(file, delimiter=";", decimal=",") # 找到锚点时间并调整时间轴 anchor_time = find_drop_anchor(df) df['Adjusted Zeit'] = df['Zeit'] - anchor_time datasets.append(df) # 绘制对齐后的曲线 plt.figure(figsize=(10, 6)) for df, label in zip(datasets, labels): plt.plot(df['Adjusted Zeit'], df['Kanal A'], label=label) # 添加辅助线(x=0对应下降锚点) plt.axvline(x=0, color='red', linestyle='--', alpha=0.7, label='下降锚点') # 美化图表 plt.xlabel('调整后的时间(以下降点为0基准)') plt.ylabel('Kanal A 值') plt.title('多组数据以下降锚点对齐对比') plt.legend() plt.grid(True, alpha=0.3) plt.show() plt.close()
代码解释
find_drop_anchor函数:通过diff()计算数值变化,找到降幅最大的点,返回该点的原始时间作为锚点。- 时间轴调整:对每组数据的
Zeit做平移,让锚点位置统一到x=0,这样所有曲线的下降拐点都对齐。 - 辅助线:添加红色虚线标记x=0位置,清晰显示锚点对齐的位置。
补充说明
如果你的“大幅下降”定义有特殊规则(比如降幅超过某个阈值、连续下降的起始点),可以修改find_drop_anchor函数的逻辑,比如增加阈值判断:
def find_drop_anchor(df, value_col='Kanal A', threshold=-10): diffs = df[value_col].diff() # 筛选出降幅超过阈值的点,再找最大降幅 valid_diffs = diffs[diffs < threshold] if not valid_diffs.empty: anchor_idx = valid_diffs.idxmin() return df.loc[anchor_idx, 'Zeit'] # 如果没有符合阈值的点, fallback到原逻辑 anchor_idx = diffs[1:].idxmin() return df.loc[anchor_idx, 'Zeit']
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

