Corso Python / Visualizzare i risultati con Matplotlib
Matplotlib crea grafici partendo da dati, assi, unità ed etichette espliciti. Per confrontare due categorie puoi usare un grafico a barre con base zero; scegli poi se salvare un’immagine o aprire una finestra in funzione dell’ambiente in cui esegui Python.
Scegliere la domanda prima del grafico
Qui confrontiamo spese per alimentazione e trasporti: le categorie appartengono all’asse orizzontale e gli importi in KRW all’asse verticale. Per mostrare un andamento nel tempo servirebbero invece date ordinate e una domanda diversa. Il grafico non corregge aggregazioni sbagliate: verifica prima importi, unità ed eventuali dati mancanti.
Matplotlib è un pacchetto esterno. Nell’ambiente virtuale compatibile con il tuo Python e sistema operativo installalo con:
python -m pip install matplotlib
La guida introduttiva di Matplotlib presenta il modello di lavoro. La lezione sulla validazione e aggregazione con pandas produce i totali usati qui: 11.500 e 2.500. L’esempio completo conserva le etichette inglesi del codice originale; più sotto trovi le modifiche puntuali per riprodurre la versione italiana.
Creare e salvare il grafico completo
Usa una cartella di uscita nuova: savefig sostituisce un file omonimo. Salva questo contenuto UTF-8 come chart.py e, dal terminale nella stessa cartella con l’ambiente selezionato, esegui python chart.py:
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
plt.rcParams.update({"font.size": 18, "axes.titlesize": 22, "axes.labelsize": 20, "xtick.labelsize": 18, "ytick.labelsize": 18})
categories = ["food", "transport"]
amounts = [11500, 2500]
fig, ax = plt.subplots(figsize=(7, 4), layout="constrained")
bars = ax.bar(categories, amounts, color=["#2b6cb0", "#d69e2e"])
ax.set_ylabel("Amount (KRW)")
ax.set_title("Expenses by category")
ax.set_ylim(0, max(amounts) * 1.2)
ax.bar_label(bars, fmt="%.0f", padding=3)
fig.savefig("expense-chart.png", dpi=160)
plt.close(fig)
print("saved expense-chart.png")
Il messaggio previsto è:
saved expense-chart.png
Il file expense-chart.png viene salvato nella cartella corrente. La figura è larga 7 pollici e alta 4; con 160 punti per pollice produce un’immagine di 1120 × 640 pixel. Due barre rappresentano i valori 11.500 e 2.500, con etichette numeriche sopra le barre. Il limite superiore è il massimo moltiplicato per 1,2, così rimane spazio per i numeri; il limite inferiore è zero.
layout="constrained" aiuta a sistemare gli spazi, ma non garantisce leggibilità con qualsiasi dimensione. L’esempio presuppone una lista di importi non vuota con massimo positivo; per ingressi diversi, compresi importi tutti nulli, devi definire esplicitamente anche i limiti dell’asse.
Distinguere Figure, Axes e backend
Figure è la figura complessiva; Axes è la zona in cui vengono disegnati coordinate e dati. Le variabili fig e ax rendono esplicito quale oggetto stai modificando, evitando ambiguità quando crei più grafici.
Agg è un backend non interattivo: scrive immagini senza richiedere un’interfaccia grafica, quindi è adatto a rapporti automatici. Non aspettarti una finestra dal codice mostrato. La documentazione dei backend distingue le uscite interattive da quelle su file.
Se vuoi una finestra su un desktop con supporto GUI, rimuovi la selezione matplotlib.use("Agg") e inserisci plt.show() dopo il salvataggio ma prima di plt.close(fig). Chiudere la figura prima di mostrarla impedirebbe la sequenza desiderata. La disponibilità di un backend GUI dipende dall’ambiente. Dopo la generazione chiudi le figure per non mantenerne le risorse durante elaborazioni ripetute.
Controllare risultato, traduzione e caratteri
- Apri il PNG e verifica due barre e i numeri 11500 e 2500. Controlla che l’unità sia KRW e che l’asse parta da zero.
- Cambia temporaneamente
figsize=(7, 4)infigsize=(4, 4), salva in una nuova cartella e osserva se titolo ed etichette si sovrappongono o vengono tagliati. - Ripristina 7 × 4 e rigenera in un percorso nuovo. Nell’esecuzione di questa variante italiana, a 4 × 4 il titolo viene tagliato e le categorie si avvicinano troppo: il ripristino della larghezza risolve il confronto mostrato sotto.
Per riprodurre le etichette italiane, sostituisci ax.set_ylabel("Amount (KRW)") con ax.set_ylabel("Importo (KRW)") e il titolo con ax.set_title("Spese per categoria"). Dopo quella riga aggiungi ax.set_xticks(range(len(categories)), ["Alimentazione", "Trasporti"]). Mantieni invariati categories, amounts e gli altri dati: tradurre il testo non deve cambiare altezza o numero delle barre.
Per la versione italiana mostrata qui è stato selezionato Noto Sans e verificato il file di font effettivamente usato durante il rendering. Usa un percorso di font esistente sul tuo computer: dopo l’importazione di pyplot e prima della creazione di fig, registra quel file con font_manager.fontManager.addfont(font_path) e assegna a plt.rcParams["font.family"] il nome restituito da font_manager.FontProperties(fname=font_path).get_name(). Non copiare un percorso di un altro sistema senza verificarlo.
Questa è la variante italiana realmente generata: confronta gli stessi importi e conserva la base zero.
Quando servono caratteri coreani o giapponesi, scegli un font che li supporti e controlla l’immagine salvata per quadratini o glifi mancanti. Questo frammento completo mostra la registrazione di un font coreano realmente presente nel percorso Windows indicato; su altri sistemi sostituisci il percorso con quello del font adatto:
from matplotlib import font_manager
font_path = "C:/Windows/Fonts/malgun.ttf"
font_manager.fontManager.addfont(font_path)
plt.rcParams["font.family"] = font_manager.FontProperties(fname=font_path).get_name()
plt.rcParams["axes.unicode_minus"] = False
Inserisci il frammento dopo import matplotlib.pyplot as plt e prima di creare la figura. Cambia separatamente anche le etichette da visualizzare; la sola scelta del font non traduce i testi. La documentazione di FontProperties descrive la selezione del carattere.
Per conservare versioni dei rapporti, usa nomi con data o identificatore dell’esecuzione anziché sovrascrivere il risultato precedente. La documentazione di Figure.savefig spiega formato e risoluzione. Mantieni coerenti scala e unità: tagliare l’asse o esagerare area e colore può rendere ingannevole una differenza tra valori.





