Applicazioni di informatica nella ricerca Psicosociale, avanzato nella elaborazione di dati campionari Corso di Laurea Magistrale in Psicologia Sociale, del Lavoro e della Comunicazione (Introduzione all’uso della grafica in R ) Crivellari Franco Introduzione alla grafica di R Sistemi grafici disponibili in R Sistema base standard > plot.new() > rect(0.2,0.2,0.6,0,4) > box() Il Sistema di coordinate e loro trasformazione in scala Sistema grafico “grid” (di basso livello) > library(grid) > grid.newpage() > grid.rect(gp=gpar(fill="grey")) > grid.circle(x=0.5, y=0.5, r=0.5, default.units="npc", name=NULL, gp=gpar(), draw=TRUE, vp=NULL) Sistema grafico “lattice” (usato in S) > data(cats, package="MASS") > library(lattice) > xyplot(Hwt~Bwt|Sex, data=cats) > histogram(~Bwt|Sex, data=cats) > densityplot(~Bwt|Sex+equal.count(Hwt, 4), data=cats) 24/03/2010 © Franco Crivellari 2 Il sistema grafico usato per default da R Il sistema di base utilizza comandi: di alto livello per generare grafici completi di assi, titoli, etc. > data(iris) > hist(iris$Sepal.Length,breaks=c(3,4.5,6,6.5,7,9),col="gray") I comandi a basso livello sono usati per: aggiungere particolari ad un grafico già disegnato per creare un nuovo grafico da zero: funzione plot.new() per consentire l’interazione con l’utente A volte i comandi di alto livello sono usati solo per indicare quale sistema di coordinate usare nel disegno parametri grafici utilizzabili nei comandi: di alto livello di basso livello 3 24/03/2010 © Franco Crivellari Comadi di alto livello: Esistenza di comandi anche generici: es. plot() Caratteristica: iniziano generando sempre una nuova immagine Sono progettati per realizzare grafici completi sulla base delle informazioni fornite loro in argomento: Oltre a scegliere il grafico più opportuno, disegnano in genere per default anche: gli assi cartesiani le etichette sugli assi i titoli da aggiungere agli assi Ma soprattutto calcolano la (o le) scale di valori da usare negli assi delle ascisse (X) e delle ordinate (Y) nel disegno A volte vengono usati non per disegnare, bensì solo per calcolare quali scale di valori sono usatee nel grafico. Ad es.: > plot.new() # Grafico vuoto, coord. tra 0 e 1 > plot(0, type="n", xlim=c(0, 10), ylim=c(20,30), axes=F, xlab="", ylab="") 24/03/2010 © Franco Crivellari 4 funzione plot() è un comando generico di alto livello, il tipo di grafico generato dipende dal tipo di informazione passata attraverso il primo argomento: plot(x): se x è un 24/03/2010 vettore numerico, produce un grafico che presenta i valori rispetto alle loro posizioni vettore di tipo fattore, genera un grafico a barre delle freq. assolute [barplot()] plot(y~x): (vedi) se ambedue i vettori sono numerici, genera un diagramma di dispersione di y rispetto a x; questa forma equivale a: plot(x, y) se x è di tipo fattore e y è numerico, genera boxplot di y per ciascun livello di x se ambedue sono fattori, genera un grafico a barre sovrapposte di tipo barplot(), in cui le modalità della var indip. (x) sono indicate in ascissa, mentre appaiono in forma sovrapposta le corrispondenti frequenze riguardanti la var indicata come dipendente (y) plot(df): se df è un data frame: opera come pairs() © Franco Crivellari 5 le funzioni pairs() e coplot() pairs(df): se df è un data frame o una matrice pairs(df) produce una matrice (n per n) di diagrammi di dispersione (uno per ciascuna combinazione di variabile presente) la funzione coplot(formula, data=df) 24/03/2010 se la formula è: y ~ x | f (dove x e y sono var. numeriche mentre f di tipo fattore), in una unica immagine sono generati più diagrammi di dispersione, uno per ciascun valore di f se la formula è: y ~ x | f + g (dove x e y sono var. numeriche mentre f e g sono di tipo fattore), n una unica immagine sono generati più diagrammi di dispersione, uno per ciascun combinazione di f e di g © Franco Crivellari 6 altre funzioni di alto livello qqnorm(x) grafica la distribuzione di x rispetto alla corrispondente distribuzione normale che possiede la stessa media e la stessa varianza qqplot(x, y) grafica i quantili di x rispetto ai corrispondenti di y in modo da verificare se ambedue le var. si distribuiscono nello stesso modo dotchart(x) sulle ordinate è indicata la posizione dei dati, sulle ascisse i loro valori hist(x) istogramma in base ai valori di x; la suddivisione è legata al parametro passato a breaks= curve(espressione, da a, …) 7 24/03/2010 © Franco Crivellari Parametri locali usabili nelle funzioni grafiche di “alto livello” main=“ stringa” : titolo # intestazione della figura in alto sub=“stringa” : sottotitolo # in basso sotto l’intestaz. delle ascisse xlim=c(xmin, xmax) e ylim=c(ymin, ymax) xlab=“stringa”, ylab=“stringa” da inserirexlim sotto l’asse delle X o a sin. delle Y type= “p” punti (esempi) “l” linee “b” punti connessi da linee (both) “o” punti sovrapposti a linee “h” linee verticali che partono dall’ascissa “n” non disegna nulla; le assi sono però disegnate e la scala di coordinate è calcolata axes=F sopprime la generazione degli assi log=“x”, oppure “y”, oppure “xy” add=T richiede di aggiungere il grafico e non di crearne uno nuovo 24/03/2010 © Franco Crivellari 8 Altri parametri utili Sono disponibili altri parametri che consentono di modificare le linee o i simboli che appaiono: pch=n oppure “ch”: dove se n è intero, individua un carattere (vedi pag. 232 del testo), se è un carattere, viene usato proprio quello! lwd=n: larghezza delle linee tracciate col=“colore”: nome del colore in inglese lty=n o “indicazione inglese”: tipo di linea (vedi pag. 210) 24/03/2010 © Franco Crivellari 9 Come si struttura una immagine 24/03/2010 Regione interna © Franco Crivellari Margine esterno 1 Margine esterno 4 Margine esterno 2 Margine esterno 3 10 20 10 4 5 6 7 8 0.4 Prima immagine lato destro 0.8 Sepal.Length 0.0 0.2 0.4 primo disegno Con solo comandi a basso livello Grafico ottenuto con un comando ad alto livello 0 0.6 0.8 Frequency 30 1.0 Disegno su parti diverse dello schermo 0.0 0.0 0.0 24/03/2010 0.4 0.2 0.8 0.4 0.6 © Franco Crivellari 0.8 1.0 11 Comandi grafici a basso livello Per disegnare nella parte interna dell’immagine: text(x,y, “testo”, …) points(vx, vy, …) lines(vx, vy, …) arrows(x0, y0, x1,y1, …) polygon(vx, vy, …) segments(x0, y0, x1, y1, …) box() abline(a, b, [oggetto]…) Margine esterno 3 Margine esterno 4 Margine esterno 2 Regione interna Per disegnare nei margini: 24/03/2010 mtext(‘’testo”, lato, linea) axis(lato, …) © Franco Crivellari Margine esterno 1 12 Parametri grafici: Permanenti, cioè validi fino alla chiusura della finestra grafica, o fino a quando si cambia nuovamente il parametro par(parametro=, …) new= richiede che il prossimo comando ad alto livello NON crei una nuova immagine Temporanei: cioè scelti quando si attivano le funzioni grafiche ad alto o a basso livello: 24/03/2010 fig= c(xbl,ybl,xur,yur) definizione di una finestra interna mar= c(v1,v2,v3,v4) dimensione in righe dei 4 margini col lwd lty font pch srt colore delle linee o del testo larghezza della linea tipo della linea fonte di caratteri (plain, bold italic) tipo di simbolo rotazione [NB: solo per text(), valore in gradi] © Franco Crivellari 13 Comandi di basso livello per disegnare all’interno della regione sono usati per disegnare nuove immagini o per “aggiungere” particolari ad un disegno già iniziato primitive disponibili: dove x, y sono vettori di coordinate points(x, y, type=“ch”, …) # default: type=“p” lines(x, y, type=“ch”, …) # default: type=“l” abline(a, b), o abline(h=x), o abline(v=x), …. qqline(x) rect() text(xv, yv, labels=“testo”,srt=45, …) # aggiunge testi nei punti indicati polygon(xv, yv, …) grid(nx, ny, …) # sovra disegna una griglia disegna il poligono indicato dai due vettori di coordinate (xvi, yvi) solo i poligoni chiusi possono avere l’interno colorato o tratteggiato polygon(x, y, density = NULL, angle = 45, border =, col =, density=, ...) 24/03/2010 © Franco Crivellari 14 Inserimento di un tratteggio o di una colorazione Solo le figure chiuse possono essere internamente colorate o tratteggiate: rect(x1, y1, x2, y2, …) color=“red” border=“blue” density=30 # linee per inch (per il tratteggiato) angle=45 # gradi (per il tratteggiato) polygon(x, y, … ) La funzione provvede a chiudere la figura connettando, con una linea, il punto di partenza con quello di arrivo 24/03/2010 © Franco Crivellari 15 Altri comandi di basso livello segments(x0, y0, x1, y1) # aggiunge segmenti di linea ad un disegno arrows(xi, yi, xf, yf) # aggiunge freccie orientate ad un disegno title(main=“testo” , sub=“testo”) legend(x,y, legend=) nel caso al parametro legend= sia passato un vettore di etichette, deve essere anche fornito come ulteriore parametro un altro vettore, della stessa lunghezza del precedente, utilizzando uno dei seg. parametri: fill=v # colore del riempimento col=v # colore dei punti o delle linee lty=v # stile delle linee lwd=v # larghezza del tratto delle linee pch=v # caratteri disegnati title(main=, sub=) box(which=“plot”, …) axis(side, …) mtext(“testo”, side=, line=) 24/03/2010 # side= da 1 a 4 verso orario dal basso # line= 0, 1, 2, (pos. righe verso esterno) © Franco Crivellari 16 usando solo plot.new e com. basso livello 0.4 0.6 0.8 1.0 (0 . 1.0 0.2 9, 0. 9) 0.0 0.6 0.8 (0.4,0.8) (0.2,0.3) 1, 0. 1) (0.8,0.2) 0.0 (0 . punta 0.2 0.4 (0.1,0.5) Esempio di lucido 24/03/2010 © Franco Crivellari 17 15 20 25 30 vettore y: 15, 21, 23, 30, 20, 24, 17, 12, 11.3 punto con minimo y 2 24/03/2010 3 4 5 6 7 vettore x: 2, 2.5, 3, 5, 8, 4, 7, 2, 6.1 © Franco Crivellari 8 18 -1 0 1 2 funzione dnorm(x)*3 con x da -5 a 5 -5 24/03/2010 -4 -3 -2 -1 0 © Franco Crivellari 1 2 3 4 5 6 19 par( mar=c(5.1, 4.1, 4.1, 2.1), col=“blue”) 18 riga 0 riga 1 16 14 12 10 Valori da 11 a 20 in linea 3 20 Primo esempio 0 1 2 3 © Franco Crivellari 24/03/2010 4 5 6 riga 2 riga 3 riga 4 7 8 9 10 20 Altro disegno Tratto da Paul Murrel (Univ. Auckland): barplot(matrix(sample(1:4, 16, replace=T),ncol=4), angle=45, density=1:4*10, col="blue", legend=paste(“Gruppo”,1:4)) 8 2 par(fig=c(0.8, 1, 0, 1), mar=c(4, 0, 4, 1), new=T) plot(0, xlim=c(0, 1), ylim=c(0, 5), axes=F, xlab="", ylab="", type="n") legend(0, 4, legend=paste("Gruppo",1:4), density=1:4*10) Gruppo 1 Gruppo 2 Gruppo 3 Gruppo 4 6 # crea area per disegnare la legenda in posizione esterna alla barplot 4 # Disegna una barplot. barplot(matrix(sample(1:4, 16, replace=T),ncol=4), angle=45, density=1:4*10, col=“blue”) 10 # Oppure si crea un’area a lato per disegnare barplot, lasciando il posto per la legenda par(fig=c(0, 0.75, 0, 1), mar=c(4, 2, 4, 0)) © Franco Crivellari 24/03/2010 0 21 2.5 Anderson Iris data 1.5 1.0 0.5 Petal width (cm) 2.0 Three species of Iris setosa versicolor virginica 1 2 3 4 5 6 Petal length (cm) Centroids: mean (verde) and median (blu) 7 Parametri grafici con par() La funzione par(…) definisce o modifica parametri grafici in modo permanente, cioè fino a quando non si chiude la finestra grafica, oppure non viene dato un nuovo comando par() possibilità di ricordare i parametri usati precedentemente: > oldpar<-par(lty=2, col=“blue”) La lista parziale dei parametri utilizzabili è illustrata a pag. 230, o sono ottenibili richiedendo ?par I parametri ritornano al loro valore iniziale quando si chiude la finestra grafica quando si passa alla funzione par() i parametri salvati precedentemente > par(oldpar) 24/03/2010 © Franco Crivellari 23 Generare più grafici in aree diverse della stessa dimensione: 1.0 0.5 -1.5 -1.0 -0.5 0.0 0.5 0.0 -0.5 -1.0 -1.5 10 15 20 5 10 15 20 0 0.0 0.5 2 1.0 4 1.5 5 -1.0 -2 -0.5 Esempio par(mfrow=c(2, 2), mar=c(2, 2, 1, 1), cex=0.6) y <- rnorm(20) plot(y, type="l", lwd=3) plot(y, type="l", col=“red") plot(y, type="l", lty="dashed") plot(y, type="l", ylim=c(-4, 4)) 1.0 1.5 par(mfrow=c(n,m), mar=c(nr1,nr2,nr3,nr4)) par(mfcol=c(n,m), mar=c(…)) 1.5 © Franco Crivellari 24 -4 -1.5 24/03/2010 5 10 15 20 5 10 15 20 Più grafici in aree diverse Parametri fig e di mar 10 15 Velocit‡ dei veicoli 0 par(fig=c(0.0,0.7,0.0,0.7), mar=c(4,4,2,1), cex=0.8) plot(dist~speed, data=cars, pch="*") title("Lung. frenata rispetto al velocità") 5 Frequency 0 par(fig=c(0.0,0.7,0.7,1), mar=c(2,4,2,2), cex=0.7, new=T) hist(cars$speed,col="red",breaks=5, main="Velocità dei veicoli") 5 10 15 20 25 Lung. Frenata (100,120] 120 Lung. frenata rispetto alla velocità 100 * 60 * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * 40 * * * * * * * * * * 5 (60,80] * 20 par(fig=c(0.7,1,0.05,0.7), mar=c(2,2,2,2), cex=0.7, new=T) rdist<-hist(cars$dist, breaks=6, plot=F) tcut<-cut(cars$dist, breaks=rdist$breaks) barplot(table(tcut),horiz=T, col="blue", 24/03/2010 © Franco Crivellari main="Lung. Frenata") * * * (0,20] (20,40] 80 * 0 generando 3 grafici diversi in parti diverse della medesima immagine: Da notare l’uso del parametro new=T e l’uso di hist() per il calcolo degli intervalli di classe dist 25 10 15 speed 20 25 0 5 10 15