QGIS grafici geoplot usando solo il geometry generator

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:

le fasi del progetto:

  1. Importare lo shapefile e il file CSV;
  2. 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);
  3. creare tre variabili di progetto per gestire meglio i parametri medici e la scala dei grafico;
  4. 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

  1. Aggiungi layer simbolo;
  2. come tipo di simbolo: Generatore geometria ;
  3. tipo di geometria linestring;
  4. 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

Ringraziamenti

Dati e progetto

download


Se il blog post vi è piaciuto cliccate su ‘Mi piace’, grazie!!!
if you liked the blog post click on ‘Like’, thank you !!!

SE IL POST VI È STATO UTILE CONTRIBUITE A MANTENERLO AGGIORNATO PAYPAL


11 pensieri su “QGIS grafici geoplot usando solo il geometry generator

      1. 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

        Piace a 1 persona

Lascia un commento

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.