From 18ed677ab66962f38337466e973d2d0ee9085bcb Mon Sep 17 00:00:00 2001 From: Hector van der Aa Date: Thu, 4 Jun 2026 10:29:20 +0200 Subject: [PATCH] Added plot derivatives --- src/plot_derivatives_graph.py | 80 +++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/plot_derivatives_graph.py diff --git a/src/plot_derivatives_graph.py b/src/plot_derivatives_graph.py new file mode 100644 index 0000000..8fa334a --- /dev/null +++ b/src/plot_derivatives_graph.py @@ -0,0 +1,80 @@ +# Copyright (C) 2026 Hector van der Aa +# Copyright (C) 2026 Association Exergie +# SPDX-License-Identifier: GPL-3.0-or-later + +from cProfile import label +import pandas as pd +from pathlib import Path +import argparse +from tqdm import tqdm +import matplotlib.pyplot as plt + +parser = argparse.ArgumentParser() +parser.add_argument("directory", type=Path, help="Source data directory") + +args = parser.parse_args() + +directory: Path = args.directory + +if not directory.is_dir(): + parser.error(f"{directory} is not a valid directory") + +print(f"Processing data in: {directory}") + +files: list[Path] = [] + +for path in directory.glob("*.csv"): + stem = path.stem + + try: + base_name, channel = stem.rsplit("_", 1) + except ValueError: + print(f"Skipping badly named file: {path}") + continue + + if channel != "trimmed": + print(f"Skipping unknown file: {path}") + continue + + files.append(path) + + +for file in files: + trimmed_df = pd.read_csv(file).set_index("time_us", drop=False) + base_name, _ = file.stem.rsplit("_", 1) + der_file = file.parent / f"{base_name}_derivative.csv" + der_df = pd.read_csv(der_file).set_index("time_us", drop=False) + fig, ax = plt.subplots(figsize=(12, 6)) + + # RPM + ax.plot(der_df["time_us"] / 1_000_000, der_df["d1"], label="d1") + ax.set_xlabel("Time (s)") + ax.set_ylabel("RPM") + ax.set_title(f"{base_name} RPM over Time") + ax.grid(True) + + ax1 = ax.twinx() + ax1.plot(der_df["time_us"] / 1_000_000, der_df["d2"], label="d2", color="red") + + # Crank on second y-axis + ax2 = ax.twinx() + ax2.plot( + trimmed_df["time_us"] / 1_000_000, trimmed_df["crank"], alpha=0.4, label="Crank" + ) + ax2.set_ylabel("Crank") + ax2.set_ylim(-0.1, 1.1) + + ax3 = ax.twinx() + ax3.plot( + trimmed_df["time_us"] / 1_000_000, + trimmed_df["cam"], + alpha=0.4, + label="Cam", + color="red", + ) + ax3.set_ylabel("Cam") + ax3.set_ylim(-0.1, 1.1) + + fig.tight_layout() + plt.show() + plt.close(fig)