Creare un campo da calcio in Python
L'applicazione della Data Science nel contesto calcistico è in costante espansione. I lettori del mio profilo su Mastodon avranno sicuramente notato la mia profonda ossessione per l'analisi dei dati e la creazione di grafici. Spesso, quando le cose si vogliono fare un pochino più complicate, si ha bisogno di strumenti più flessibili che permettano di programmare visualizzazioni più complesse e personalizzabili rispetto agli strumenti No-Code che offre il mercato.
Bene, python ci aiuta in questo!
MatPlotLib una libreria per creare Grafici Personalizzati!
La noia dello spiegare da dove nasce MatPlotLib e perchè è utilizzata moltissimo oggigiorno la lascio a voi, se proprio ci tenete cercatela su google (o meglio su librex 😌).
Quello che invece ci terrei particolarmente a mostrare è una piccolissima lezione pratica su come stampare il nostro campo da calcio mediante questa nota libreria di python. Andiamo!
Iniziamo: quanto è lungo un campo?
Senza perderci in chiacchiere, la dimensione massima consentita per un campo da calcio dalla FIFA risulta essere di 130x90 mq. Quindi, direi di iniziare disegnando il nostro rettangolo di gioco, no?
Prima cosa dobbiamo chiaramente installare e importare la nostra libreria. Consiglio per tale scopo l’utilizzo di anaconda, dategli un’occhiata, vi sarà molto utile in futuro. Alternativamente, potete sempre utilizzare la classica via pip install matplotlib
e procedere ad un'installazione globale sulla vostra macchina.
Una volta fatto, basta importarla nel nostro script python (con il banale import matplotlib
).
Ora che è tutto pronto, passiamo alle cose interessanti:
fig=plt.figure() # Creiamo la nostra figura/contenitore per il nostro grafico
ax=fig.add_subplot(1,1,1) # Aggiungiamo al contenitore un solo sottografico
# Disegnamo il rettangolo
plt.plot([0,0],[0,90])
plt.plot([0,130],[90,90])
plt.plot([130,130],[90,0])
plt.plot([130,0],[0,0])
plt.show() # Mostra a video il grafico
Vediamo cosa potrebbe generare confusione:
ax=fig.add_subplot(1,1,1)
: a cosa servono quegli 1? Ogni figura/contenitore può avere diversi sottografici (subplot), quindi andiamo a specificare:- Con il primo argomento il numero di righe nella griglia dei subplots. In questo caso, c'è solo una riga, quindi abbiamo un'unica riga di subplots dato che vogliamo inserire un unico grafico contenente solo un campo da gioco.
- Con il secondo il numero di colonne. Anche in questo caso, c'è solo una colonna.
- Mentre il terzo argomento specifica l'indice del subplot all'interno della griglia, ma, anche in questo caso, abbiamo solo un subplot, quindi l'indice è 1.
plt.plot([0,0],[0,90])
: come calcoliamo le coordinate? Questo comando viene utilizzato per disegnare le righe/linee del nostro campo da calcio. Le coppie di coordinate che vedete come argomento non sono altro che il punto di inizio e di fine del segmento che andremo a disegnare. Con[0,0]
stiamo dicendo che il primo punto dovrà partire da x = (0,0). Analogamente, il secondo punto[0,90]
corrisponderà ad y = (0,90). A questo punto, vengono presi i due punti e viene disegnato un segmento fra di essi, che, quindi, corrisponderà al lato corto del campo, essendo lungo 90. L’operazione viene poi ripetuta per tutti e 4 i lati.
Andando ad eseguire il codice otteniamo:
Perchè le linee sono colorate? MatPlotLib le colora banalmente per distinguerle, avremmo potuto specificare noi stessi il colore scrivendo:
plt.plot([0,0],[0,90], color="blue")
plt.plot([0,130],[90,90], color="orange")
plt.plot([130,130],[90,0], color="green")
plt.plot([130,0],[0,0], color="red")
Disegnamo il centro campo
# Creiamo una variabile per il centrocampo
centreSpot = plt.Circle((65,45),0.8,color="blue")
# E un altra per il cerchio
centreCircle = plt.Circle((65,45),9.15,color="red",fill=False)
# Queste due operazioni NON disegneranno il cerchio nel contenitore
# Passiamo alla scrittura sulla figura attraverso la seguente funzione.
ax.add_patch(centreSpot)
ax.add_patch(centreCircle)
plt.show()
Abbiamo utilizzato una classe presente in MatPlotLib di nome Circle
dove gli argomenti indicano:
(65,45)
posizione del centro.9.15
lunghezza del raggio.color="red"
colore.fill=False
riempimento.
Area di rigore
Iniziamo a creare l'area di rigore disegnando il rettangolo come fatto precedentemente:
# Area di rigore di sinistra
plt.plot([16.5,16.5],[65,25],color="black")
plt.plot([0,16.5],[65,65],color="black")
plt.plot([16.5,0],[25,25],color="black")
Analogamente potremmo fare l’area piccola al suo interno, mentre l’arco esterno come lo facciamo?
MatPlotLib ci viene in soccorso con una classe presente nel package matplotlib.patches
di nome Arc
, importiamola (meglio se aggiunta ad inizio file) e disegnamo il nostro arco:
from matplotlib.patches import Arc
# Area piccola
plt.plot([0,5.5],[54,54],color="black")
plt.plot([5.5,5.5],[54,36],color="black")
plt.plot([5.5,0.5],[36,36],color="black")
# Arco
arc = Arc((11,45),height=18.3,width=18.3,angle=0,theta1=310,theta2=50,color="red")
ax.add_patch(arc)
Analizziamo ancora una volta gli argomenti:
(11,45)
rappresenta la posizione del centroheight=18.3
specifica l'altezza dell'arco, che determina quanto l'arco si estenderà verticalmente da entrambi i lati del centro. Questo perchè la classeArc
non è nata solo per fare semicerchi, ma anche parti di ovali, ad esempio.width=18.3
specifica la larghezza dell'arco, per le stesse ragioni appena dette.angle=0
specifica l'angolo di rotazione dell'arco (in senso anti-orario). Nel nostro caso, l’arco si trova già nella giusta angolazione, quindi lasciamo a 0. (NB: tenete quindi a mente che l’angolo di 0° non corrisponde alla posizione verticale, ma a quella orizzontale verso destra. Come questa freccia →).theta1
=310 specifica l'angolo dove si inizia a disegnare l'arco, in questo caso 310 gradi.theta2=50
specifica l'angolo finale dell'arco, analogamente a prima.
Bene, ci siamo quasi, no? Ora basterà ripetere le stesse operazioni per l’area di rigore di destra e abbiamo finito, ma visto che ci siamo, che ne dite di aggiungere anche un bel dischetto e togliere gli assi dalla figura? 😊
leftPenSpot = plt.Circle((11,45),0.8,color="black")
plt.axis('off')
Conclusioni
Abbiamo finalmente tutto ciò che ci serve per poter disegnare un nostro campo da calcio regolamentare in python mediante la libreria MatPlotLib, elemento necessario per poter fare analisi di dati sul nostro rettangolo di gioco. Stampare a video, chiaramente, è solo l’inizio; questa libreria offre strumenti utilissimi e potenti per poter esplorare dati complessi, creare grafici e, di conseguenza, analizzare le prestazioni di squadre e giocatori. Sempre a patto che:
Riusciate a disegnare la parte di destra 😂
Dovrebbe essere abbastanza facile, ma soprattutto un buon esercizio di ripasso per incidere nella vostra mente questi pochi concetti, provateci da soli! (vi lascio comunque la soluzione contenente l’intero codice usato in questo articolo: https://github.com/paolozu/python-football-pitch)
Spero di non avervi annoiato troppo e per qualsiasi domanda mi trovate qui: https://mastodon.uno/@brozu, ciao!