Tutto parte da un messaggio privato su telegram, il mio caro amico Andrea mi manda questo messaggio:

il tweet è:
decido di aspettare il tutorial promesso da Mathieu.
Dopo un giorno (siamo al 13 aprile), visto che ancora non usciva il tutorial (esce solo il 14, qui tweet), decido di provarci e inizio a studiarci sopra.
Mathieu suggerisce, nel suo primo tweet, che ha usato il geometry generator
, relazione
e array
; questi sono gli unici punti di partenza.
Ecco il mio primo tentativo comunicato a Andrea:

Questo è il risultato finale alle 22:00 circa

In questa gif animata (realizzata con il plugin TimeManager di Anita Graser) ci sono 4 elementi costruiti con il geometry generator
e una etichetta costruita sempre usando le espressioni.
L’elemento principale è la curva, che ho chiamato geoplot
, generata dalla seguente espressione:
translate( make_line(
relation_aggregate(
relation:='rel1',
aggregate:='array_agg',
expression:=make_point( $id*@enfx, eval(@par_med)*@enfy )
)),x(centroid($geometry)),y(centroid($geometry)))

Gli assi cartesiani, che seguono la dimensione della curva, sono generati dalle seguenti espressioni:
make_line( -- ascisse
make_point(x(centroid($geometry)),y(centroid($geometry))),
make_point(x(centroid($geometry)),
y(end_point(
translate( make_line(
relation_aggregate(
relation:='rel1',
aggregate:='array_agg',
expression:=make_point( $id*@enfx,eval(@par_med)*@enfy )
)),x(centroid($geometry)),y(centroid($geometry))))
)))

make_line( -- ordinate
make_point(x(centroid($geometry)),y(centroid($geometry))),
make_point(x(end_point(
translate( make_line(
relation_aggregate(
relation:='rel1',
aggregate:='array_agg',
expression:=make_point( $id*@enfx,eval(@par_med)*@enfy )
)),x(centroid($geometry)),y(centroid($geometry))))
),y(centroid($geometry))))

poi basta tematizzarli usando la freccia.
Infine, il punto alla fine della curva è generato da questa espressione:
end_point(
translate( make_line(
relation_aggregate(
relation:='rel1',
aggregate:='array_agg',
expression:=make_point( $id*@enfx,eval(@par_med)*@enfy )
)),x(centroid($geometry)),y(centroid($geometry))))

utilizzata anche nel geometry generator
delle etichette.
Dati e progetto
I dati utilizzati sono:
- shapefile regioni ISTAT (modificato con le P.A. file: reg_provaut3857) : https://github.com/pigreco/COVID19_Sicilia/tree/master/risorse
- file CSV del PCM-DPC regioni (file : dpc-covid19-ita-regioni.csv): https://github.com/pcm-dpc/COVID-19/blob/master/dati-regioni/dpc-covid19-ita-regioni.csv
le fasi del progetto:
- Importare lo shapefile e il file CSV;
- creare una relazione 1:m tra lo shapefile e il file CSV, ogni regione ISTAT ha n record, uno per ogni data del rilievo (campo correlato: quello che contiene il nome della regione);
- creare tre variabili di progetto per gestire meglio i parametri medici e la scala dei grafico;
- tematizzare lo shapefile usando vari livelli come `geometry generator`.
Step 1: importare dati
step 2: creare relazione 1:m
step 3: creare variabili di progetto
pigiare su +
, digitare il nome della variabile e definire il valore. (NB: il valore di par_med
digitarlo con i doppi apici.

- par_med : serve a inserire il nome del campo del parametro medico da plottare, i parametri sono i campi presenti nel file CSV (esempio: tamponi, totale_casi, totale_positivi, ecc..);
- enfx e enfy : sono due parametri che servono a modificare la scala di visualizzazione del grafico, lungo x e y.
step 4: tematizzare aggiungendo livelli geometry generator
- Aggiungi layer simbolo;
- come tipo di simbolo: Generatore geometria ;
- tipo di geometria linestring;
- digitare l’espressione.
questo step va ripetuto per i 4 layer simbolo: curva, ascisse, ordinata e punto.
Spiegazione espressioni
translate( make_line(
relation_aggregate(
relation:='rel1',
aggregate:='array_agg',
expression:=make_point( $id*@enfx, eval(@par_med)*@enfy )
)),x(centroid($geometry)),y(centroid($geometry)))
il cuore della espressione è:
relation_aggregate(
relation:='rel1',
aggregate:='array_agg',
expression:=make_point( $id*@enfx, eval(@par_med)*@enfy ))

che crea un array
di geometrie point
uno per ogni record, attualmente ci sono 50 record per ogni feature Regione ISTAT (dal 24-02 al 13-04-2020):

questa espressione traccerebbe tutti i grafici a partire dalla coordinata (0,0), per ovviare e far tracciare i grafici nei baricentri di ogni regione, occorre traslare l’origine di ogni grafico e quindi utilizzo la funzione translate
; per creare una linea continua (invece dei punti) uso la funzione make_line
:
Come usare le variabili
Per cambiare velocemente parametro medico, digitare Ctrl+K
, avviato il locator
, digitare set variabili
e selezionare la voce Variabili (Proprietà progetto)
, qui potete cambiare le tre variabili.
NB: per la variabile par_med
il valore va scritto tra apici doppi, es: "totale_casi"
.
NOTE FINALI: tutte le altre espressioni sono simili a quella spiegata e quindi non mi dilungo nella spiegazione. Per etichettare il punto ho usato l’etichettatore e posizionato l’etichetta usando il generatore di geometria, per acchiappare il corretto valore, cioè l’ultimo della serie, ho usato questa espresione: to_string(relation_aggregate(relation:=’rel1′,aggregate:=’array_agg’,expression:=eval(@par_med))[-1]). Infine, è possibile aggiungere più curve nello stesso grafico seguendo la stessa logica spiegata.
EDIT:
espressione generale:
with_variable('id_min', relation_aggregate( relation:='rel1',aggregate:='array_agg',expression:= $id)[0],
(with_variable('tot_min', relation_aggregate( relation:='rel1',aggregate:='array_agg',expression:=eval(@par_med))[0],
(
translate(
make_line(-- curva
relation_aggregate(
relation:='rel1',
aggregate:='array_agg',
expression:=make_point(($id - @id_min )*@enfx, (eval(@par_med) - @tot_min)*@enfy))),
x(centroid($geometry)),y(centroid($geometry)))
))))
Riferimenti
- QGIS : https://www.qgis.org/it/site/
- HfcQGIS : http://hfcqgis.opendatasicilia.it/it/latest
- Tweet Mathieu : https://twitter.com/datagistips/status/1248508331263545344
- Tutorial Mathieu : https://datagistips.hypotheses.org/488
Ringraziamenti
- Mathieu Rajerison : https://twitter.com/datagistips
Dati e progetto
Se il blog post vi è piaciuto cliccate su ‘Mi piace’, grazie!!!
if you liked the blog post click on ‘Like’, thank you !!!
Beh…che dire….onorato di poter seguire le tue gesta!
"Mi piace"Piace a 1 persona
Grazie Pietro.
Leggi pure il tutorial di Mathieu
"Mi piace""Mi piace"
Un cosa incredibile!!! Senza parole
"Mi piace"Piace a 1 persona
Grazie Luca 🙂
"Mi piace""Mi piace"
Complimenti, di animazioni con grafici ne avevo viste molte in giro ma questa fatta con le espressioni di QGis le supera tutte (applauso).
"Mi piace"Piace a 1 persona
Grazie molto gentile
"Mi piace""Mi piace"
Non ho parole! Complimenti, me la studio bene
"Mi piace"Piace a 1 persona
Grazie Giovanni.
"Mi piace""Mi piace"
Ciao Totò, per la rappresentazione dinamica con TimeManager ho selezionato la tabella CSV, ovviamente scegliendo il campo “data” come start e lo stesso per “end”. Avviando il TimeManager effettivamente viene filtrata la “rel1” per data ma non ho la rappresentazione grafica dimanica. Qualche aiuto? Graziie mille
"Mi piace"Piace a 1 persona
risolto, la data “end” va settata come ‘no end time…’
"Mi piace"Piace a 1 persona
Ok, grazie!
"Mi piace""Mi piace"