Marker di Matplotlib
Impara a usare e personalizzare i marker di Matplotlib in Python. Stili, dimensioni, colori, riempimento e controllo per punto.
I marker sono i simboli che Matplotlib disegna in corrispondenza di ogni punto dati in un grafico. Scegliere lo stile di marker giusto — e sapere come ridimensionarlo, ricolorarlo e riempirlo — può fare la differenza tra un grafico caotico e uno che comunica chiaramente. Questa pagina illustra tutti gli stili di marker disponibili in Matplotlib, come personalizzarne l'aspetto e quando usare plot() rispetto a scatter() per il controllo punto per punto.
Cos'è un marker in Matplotlib?
Un marker è una forma disegnata in corrispondenza di ogni coordinata (x, y) in un grafico. La forma da usare si controlla con il parametro marker (o come parte di una stringa di formato). I marker sono separati dalla linea che collega i punti dati — è possibile mostrarne uno senza l'altro.
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 5, 3, 7, 4]
# Line with markers
plt.plot(x, y, marker='o')
# Markers only — no connecting line
plt.plot(x, y, marker='s', linestyle='None')
plt.show()Tutti gli stili di marker predefiniti
Matplotlib include più di 30 codici di marker predefiniti. La tabella seguente elenca i più comunemente utilizzati.
| Codice marker | Forma |
|---|---|
'o' | Cerchio |
's' | Quadrato |
'D' | Diamante |
'd' | Diamante sottile |
'^' | Triangolo (su) |
'v' | Triangolo (giù) |
'<' | Triangolo (sinistra) |
'>' | Triangolo (destra) |
'p' | Pentagono |
'h' | Esagono 1 |
'H' | Esagono 2 |
'8' | Ottagono |
'*' | Stella |
'+' | Più |
'x' | Croce |
'X' | Croce piena |
| `' | '` |
'_' | Linea orizzontale |
'.' | Punto (piccolo) |
',' | Pixel |
'1' | Tri-basso |
'2' | Tri-alto |
'3' | Tri-sinistra |
'4' | Tri-destra |
'None' o '' | Nessun marker |
Per vedere tutti i marker contemporaneamente, è possibile iterare su matplotlib.markers.MarkerStyle.markers:
import matplotlib.pyplot as plt
import matplotlib.markers as mmarkers
print(list(mmarkers.MarkerStyle.markers.keys()))Usare i marker in un grafico a linee
La funzione plot() accetta un argomento marker. Applica lo stesso marker a ogni punto dati.
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 15, 25, 30]
plt.plot(x, y, marker='o')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Line plot with circle markers')
plt.show()Usare una stringa di formato
Invece di argomenti chiave separati, è possibile combinare lo stile della linea, il colore e il marker in un'unica stringa di formato: '[color][marker][linestyle]'.
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 15, 25, 30]
# Red circles connected by a dashed line
plt.plot(x, y, 'ro--')
plt.title('Format string: red circles, dashed line')
plt.show()Componenti comuni della stringa di formato:
| Colore | Marker | Stile linea |
|---|---|---|
'r' rosso | 'o' cerchio | '-' continua |
'g' verde | 's' quadrato | '--' tratteggiata |
'b' blu | '^' triangolo | ':' punteggiata |
'k' nero | '*' stella | '-.' tratto-punto |
'm' magenta | '+' più | 'None' nessuna linea |
Personalizzare l'aspetto dei marker
Matplotlib offre quattro argomenti chiave per un controllo dettagliato dei marker:
| Parametro | Cosa controlla |
|---|---|
markersize (o ms) | Diametro del marker in punti |
markerfacecolor (o mfc) | Colore di riempimento del marker |
markeredgecolor (o mec) | Colore del bordo del marker |
markeredgewidth (o mew) | Larghezza del bordo del marker in punti |
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 15, 25, 30]
plt.plot(
x, y,
marker='o',
markersize=12,
markerfacecolor='gold',
markeredgecolor='navy',
markeredgewidth=2,
)
plt.title('Customized circle markers')
plt.show()Marker vuoti
Imposta markerfacecolor='none' (stringa in minuscolo) per disegnare solo il bordo, creando un marker vuoto:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [3, 1, 4, 1, 5]
plt.plot(x, y, marker='s', markersize=14, markerfacecolor='none', markeredgecolor='steelblue', markeredgewidth=2)
plt.title('Hollow square markers')
plt.show()Stile di riempimento
Il parametro fillstyle controlla quale porzione del marker viene riempita. I valori validi sono 'full', 'left', 'right', 'bottom', 'top' e 'none'.
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 3, 5, 1]
plt.plot(x, y, marker='o', markersize=16, fillstyle='left', markerfacecolor='crimson', markeredgecolor='black')
plt.title('Half-filled circle markers (fillstyle="left")')
plt.show()Controllo per punto con scatter()
plot() applica un marker uniforme all'intera linea. Quando è necessario che ogni punto abbia dimensioni o colore diversi — ad esempio per codificare una terza variabile — usa scatter() al suo posto.
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 15, 25, 30]
sizes = [40, 100, 200, 80, 160] # area in points²
colors = [0.2, 0.5, 0.8, 0.3, 0.9] # mapped through colormap
sc = plt.scatter(x, y, s=sizes, c=colors, cmap='plasma', edgecolors='black')
plt.colorbar(sc, label='Value')
plt.title('Per-point size and color with scatter()')
plt.show()Differenze principali tra plot() e scatter() per i marker:
| Caratteristica | plot() | scatter() |
|---|---|---|
| Forma del marker | Uguale per tutti i punti | Uguale per tutti i punti |
| Dimensione del marker | Uniforme | Per punto (array s) |
| Colore del marker | Uniforme | Per punto (array c + mappa colori) |
| Prestazioni su grandi dataset | Più veloce | Più lento |
Più serie di dati con marker diversi
Usa chiamate separate a plot() per assegnare un marker distinto a ogni serie, poi aggiungi una legenda:
import matplotlib.pyplot as plt
months = [1, 2, 3, 4, 5, 6]
product_a = [120, 135, 110, 150, 140, 160]
product_b = [80, 95, 100, 90, 115, 130]
product_c = [60, 70, 65, 85, 90, 95]
plt.plot(months, product_a, marker='o', label='Product A')
plt.plot(months, product_b, marker='s', label='Product B')
plt.plot(months, product_c, marker='^', label='Product C')
plt.xlabel('Month')
plt.ylabel('Units sold')
plt.title('Monthly sales by product')
plt.legend()
plt.show()Marker senza linea di collegamento
Passando linestyle='None' (o ls='None') si rimuove la linea e si lasciano solo i marker — ottenendo di fatto un grafico a dispersione usando plot().
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5, 6, 7, 8]
y = [3, 1, 4, 1, 5, 9, 2, 6]
plt.plot(x, y, marker='D', linestyle='None', color='darkorange', markersize=10)
plt.title('Diamond markers, no line')
plt.show()Questo schema è utile quando l'ordine dei punti dati è importante (mantenendo l'ordinamento originale di x) ma non si vuole una linea che implichi un andamento continuo.
Consigli pratici
- Adatta il marker alla densità dei dati. Usa marker piccoli (
'.'o',') quando si rappresentano migliaia di punti; forme più grandi ('o','s') per poche misurazioni. - Garantisci il contrasto. Su sfondi bianchi, un
markeredgecolorscuro su unmarkerfacecolorchiaro mantiene ogni punto visibile anche a dimensioni ridotte. - Evita di sovraccaricare un singolo grafico. Più di cinque forme di marker distinte in un grafico rendono la legenda difficile da leggere — considera sottografici o il solo colore.
- Usa
scatter()per codificare una terza variabile. Array di dimensioni o colori mappati su una mappa colori comunicano una dimensione aggiuntiva senza aggiungere altre serie alla legenda.
Argomenti correlati
- Grafici a linee Matplotlib — personalizza lo stile della linea insieme ai marker
- Grafico a dispersione Matplotlib — controllo di dimensione e colore per punto
- Etichette Matplotlib — aggiungi etichette degli assi e titoli ai tuoi grafici
- Panoramica dei grafici Matplotlib — una panoramica di tutti i principali tipi di grafico