Aggiunge script per sovrapporre i grafici di piu' scan rate

Combina potenziale normalizzato e ultima colonna di piu' CSV in un
unico file e li plotta su un grafico sovrapposto con legenda, per
confrontare visivamente i cicli a scan rate diversi.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 23:18:14 +02:00
parent 9e6371d14b
commit b37f30c174
2 changed files with 86 additions and 0 deletions
+37
View File
@@ -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`).
+49
View File
@@ -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}")