martedì 25 febbraio 2025

Grafici a linee (line chart) con ggplot

Un grafico a linee (line chart) può essere realizzato, oltre che impiegando le funzioni della installazione base di R [1], anche con il pacchetto ggplot2.

I dati qui utilizzati come esempio sono contenuti nel dataset "Indometh" incluso nella installazione base di R: per vedere gli altri dataset disponibili con questa (ma molti altri sono disponibili nei vari pacchetti aggiuntivi) e che possono essere utili per esercitarsi, digitare

data()

nella Console di R  premere ↵ Invio.

Digitando il nome 

Indometh

del dataset che ci interessa vediamo che contiene la concentrazione (conc) nel siero (espressa in μg/mL cioè in microgrammi per millilitro) del farmaco indometacina (un farmaco antinfiammatorio), misurata secondo la stessa precisa sequenza di ore (time) in sei soggetti identificati con i numeri da 1 a 6 (ai quali era stata somministrata una identica quantità di indometacina), allo scopo di determinare la velocità alla quale il farmaco viene eliminato: un dato necessario  per stabilire posologia e intervalli di somministrazione. Ed ecco i dati:

   Subject time conc
1        1 0.25 1.50
2        1 0.50 0.94
3        1 0.75 0.78
4        1 1.00 0.48
5        1 1.25 0.37
6        1 2.00 0.19
7        1 3.00 0.12
8        1 4.00 0.11
9        1 5.00 0.08
10       1 6.00 0.07
11       1 8.00 0.05
12       2 0.25 2.03
13       2 0.50 1.63
14       2 0.75 0.71
15       2 1.00 0.70
16       2 1.25 0.64
17       2 2.00 0.36
18       2 3.00 0.32
19       2 4.00 0.20
20       2 5.00 0.25
21       2 6.00 0.12
22       2 8.00 0.08
23       3 0.25 2.72
24       3 0.50 1.49
25       3 0.75 1.16
26       3 1.00 0.80
27       3 1.25 0.80
28       3 2.00 0.39
29       3 3.00 0.22
30       3 4.00 0.12
31       3 5.00 0.11
32       3 6.00 0.08
33       3 8.00 0.08
34       4 0.25 1.85
35       4 0.50 1.39
36       4 0.75 1.02
37       4 1.00 0.89
38       4 1.25 0.59
39       4 2.00 0.40
40       4 3.00 0.16
41       4 4.00 0.11
42       4 5.00 0.10
43       4 6.00 0.07
44       4 8.00 0.07
45       5 0.25 2.05
46       5 0.50 1.04
47       5 0.75 0.81
48       5 1.00 0.39
49       5 1.25 0.30
50       5 2.00 0.23
51       5 3.00 0.13
52       5 4.00 0.11
53       5 5.00 0.08
54       5 6.00 0.10
55       5 8.00 0.06
56       6 0.25 2.31
57       6 0.50 1.44
58       6 0.75 1.03
59       6 1.00 0.84
60       6 1.25 0.64
61       6 2.00 0.42
62       6 3.00 0.24
63       6 4.00 0.17
64       6 5.00 0.13
65       6 6.00 0.10
66       6 8.00 0.09

Ora copiate e incollate nella Console di R questo script e premete ↵ Invio.

# GRAFICO A LINEE con ggplot
#
library(ggplot2) # carica il pacchetto per la grafica
#
ggplot(data=Indometh, aes(x=time, y=conc, group=Subject, color=Subject, linetype=Subject, shape=Subject)) + geom_line() + geom_point() + theme_classic()
#

Il grafico risultante


viene quindi realizzato:
→ specificando l'origine dei dati (Indometh);
→ riportando in ascisse il tempo (time) e in ordinate la concentrazione (conc); 
→ aggregando i dati per soggetto (group=Subject); 
→ impiegando per ciascun soggetto (Subjectun differente colore (color), linea (linetype) e simbolo (shape);  
→ riportando sul grafico i punti (geom_point) e le linee (geom_line) che li uniscono

Niente di più facile per produrre una versione base del grafico, anche se ovviamente è poi possibile aggiustare a piacere colori, dimensione dei simboli, spessore e tipo delle linee, legenda e quant'altro: esempi si trovano anche in altri post di questo sito [2], ma ovviamente raccomando comunque di scaricare e tenere a portata di mano il manuale di riferimento del pacchetto [3]. Da notare infine che il messaggio che si vede comparire

Messaggio di avvertimento:
Using shapes for an ordinal variable is not advised 

è semplicemente un suggerimento e può essere ignorato.

Ora, visto l'andamento simile delle sei curve di eliminazione del farmaco, l'idea è di realizzare un grafico che riporti per ciascuno dei tempi la media delle concentrazioni rilevate nei sei soggetti e i suoi limiti di confidenza al 95%, rappresentati dalla media +1.96 volte l'errore standard (es) e dalla media -1.96 volte l'errore standard. Per questo copiate e incollate nella Console di R queste righe e premete ↵ Invio.

#
# aggrega i dati per ciascun tempo
#
library(plotrix) # carica il pacchetto per il calcolo dell'errore standard
#
mydata <- aggregate(conc~time, data=Indometh, FUN=function(x) c(mean=mean(x), se=std.error(x))) # calcola media ed errore standard della concentrazione per ciascun tempo
#
mydata # mostra i dati calcolati
#
media <- mydata$conc[,1] # salva in un vettore le medie calcolate
es <- mydata$conc[,2] # salva in un vettore gli errori standard calcolati
#

Come si vede:
→ serve il pacchetto plotrix, che deve essere preventivamente installato e che fornisce la funzione std.error() per calcolare l'errore standard della media;
→ con la funzione aggregate() sono aggregate le concentrazioni del farmaco rilevate nei sei soggetti a ciascun tempo (conc~time);
→ con FUN=function(x) sono calcolati sui sei valori di concentrazione rilevati a ciascun tempo la media mean(x) e l'errore standard std.err(x)

Questi sono i dati calcolati che troviamo in mydata

> mydata # mostra i dati calcolati
   time   conc.mean     conc.se
1  0.25 2.076666667 0.168832593
2  0.50 1.321666667 0.110616957
3  0.75 0.918333333 0.071991512
4  1.00 0.683333333 0.083373324
5  1.25 0.556666667 0.076361712
6  2.00 0.331666667 0.039616214
7  3.00 0.198333333 0.031242777
8  4.00 0.136666667 0.015846486
9  5.00 0.125000000 0.026172505
10 6.00 0.090000000 0.008164966
11 8.00 0.071666667 0.006009252

mentre per semplificare e rendere più leggibile il codice successivo media (conc.mean) ed errore standard (conc.se) sono salvati nei due vettori media ed es.

Dopo questo necessario passo intermedio possiamo di nuovo tornare al grafico a linee, copiate e incollate nella Console di R queste ultime righe di codice e premete ↵ Invio.

#
windows() # apre e inizializza una nuova finestra grafica
#
ggplot(data=mydata, aes(x=time, y=media)) + geom_line() + geom_point() + theme_classic() + geom_errorbar(aes(ymin=media-1.96*es, ymax=media+1.96*es), width=.1)
#

Dopo avere aperto con windows() una nuova finestra grafica vediamo che la sola novità rispetto al grafico a linee di base iniziale è rappresentata dalla funzione geom_errorbar() che con gli argomenti ymin e ymax provvede ad aggiungere al grafico, rispettivamente sottraendo e sommando alla media l'errore standard es moltiplicato per 1.96, i limiti di confidenza al 95% della media

Ed ecco il grafico risultante che, vale la pena di sottolinearlo, fornisce una chiave di lettura cruciale per l'interpretazione dei risultati. 


Conclusione: anche nel caso assai semplice di un grafico a linee – che come detto può essere realizzato con le funzioni base di R [1], ma sicuramente con maggior difficoltà – il pacchetto ggplot2 fornisce un esempio di versatilità, di rapidità di realizzazione e di ottimi risultati grafici, che rappresentano un invito al suo impiego e al suo approfondimento [3]. 


----------

[1] Vedere il post Grafici a linee.

[2] Fate click su ggplot2 nelle Parole chiave o digitate ggplot2 nella casella Cerca nel blog quindi fate click su Cerca.

[3] Vedere il link al manuale di riferimento su:
https://cran.r-project.org/web/packages/ggplot2/index.html



Nessun commento:

Posta un commento