diff --git a/sovrapposizione/README.md b/sovrapposizione/README.md new file mode 100644 index 0000000..6b024a3 --- /dev/null +++ b/sovrapposizione/README.md @@ -0,0 +1,37 @@ +# Sovrapposizione grafici + +Script che prende tutti i file `*_ultimo_ciclo.csv` presenti in questa cartella +(uno per scan rate) e li combina in un unico grafico sovrapposto, per +confrontare visivamente i cicli a scan rate diversi. + +## Cosa fa `process_and_plot.py` + +1. Cerca nella cartella tutti i CSV che finiscono con `_ultimo_ciclo.csv`. +2. Per ciascun file legge: + - colonna C — `Potential normalized/V` + - colonna E — l'ultima colonna del file (`Current/sqrt(scan rate)/scan rate`) +3. Ricava un'etichetta per la serie a partire dal nome del file (es. `scan 0.1Vs`). +4. Unisce le coppie di colonne di tutti i file in un unico CSV, + `combined_C_E.csv`, con intestazioni che indicano lo scan rate di + provenienza. +5. Disegna tutte le curve sullo stesso grafico (potenziale normalizzato in + ascissa, ultima colonna in ordinata), con colori diversi e legenda, e lo + salva come `combined_plot.png`. + +## Uso + +``` +python process_and_plot.py +``` + +Va eseguito dalla cartella `sovrapposizione` (o comunque nella cartella che +contiene i CSV `*_ultimo_ciclo.csv` da confrontare), perché lo script cerca i +file nella propria directory. + +## Output + +- `combined_C_E.csv` — colonne C ed E di tutti i CSV affiancate. +- `combined_plot.png` — grafico con tutte le curve sovrapposte. + +Entrambi i file di output sono ignorati da git (`*.csv`, `*.png` in +`.gitignore`). diff --git a/sovrapposizione/process_and_plot.py b/sovrapposizione/process_and_plot.py new file mode 100644 index 0000000..e3a245e --- /dev/null +++ b/sovrapposizione/process_and_plot.py @@ -0,0 +1,49 @@ +import pandas as pd +import matplotlib.pyplot as plt +from pathlib import Path + +folder = Path(__file__).parent +files = sorted(folder.glob("*_ultimo_ciclo.csv")) + +# categorical palette (light mode), fixed order +colors = ["#2a78d6", "#1baf7a", "#eda100", "#e34948"] + +combined = {} +series = [] + +for f in files: + df = pd.read_csv(f, sep=";", decimal=",") + label = f.stem.replace(" soluzione (-1.6_1.2", "").replace(")_ultimo_ciclo", "").replace("_ultimo_ciclo", "") + label = label.replace("AL7 10 mgml", "").strip() + if not label.lower().startswith("scan"): + label = "scan " + label.split("scan")[-1].strip() if "scan" in label else label + c = df.iloc[:, 2] # column C: Potential normalized/V + e = df.iloc[:, 4] # column E: last column + combined[f"{label} - Potential normalized/V"] = c.reset_index(drop=True) + combined[f"{label} - {df.columns[4]}"] = e.reset_index(drop=True) + series.append((label, c, e)) + +out_df = pd.concat(combined, axis=1) +out_csv = folder / "combined_C_E.csv" +out_df.to_csv(out_csv, sep=";", decimal=",", index=False) +print(f"Saved {out_csv}") + +fig, ax = plt.subplots(figsize=(9, 6), dpi=150) +fig.patch.set_facecolor("#fcfcfb") +ax.set_facecolor("#fcfcfb") + +for i, (label, c, e) in enumerate(series): + ax.plot(c, e, label=label, color=colors[i % len(colors)], linewidth=2) + +ax.set_xlabel("Potential normalized / V", color="#0b0b0b") +ax.set_ylabel("Current / sqrt(scan rate) / scan rate", color="#0b0b0b") +ax.set_title("Confronto cicli - Potenziale normalizzato vs ultima colonna", color="#0b0b0b") +ax.tick_params(colors="#52514e") +ax.grid(True, color="#e1e0d9", linewidth=0.8) +for spine in ax.spines.values(): + spine.set_color("#c3c2b7") +legend = ax.legend(frameon=False, labelcolor="#0b0b0b") + +out_png = folder / "combined_plot.png" +fig.savefig(out_png, facecolor=fig.get_facecolor()) +print(f"Saved {out_png}")