Manual de R (Estadística)/Gràfics

Introducció

modifica

Aquí es presentarà com fer gràfics de forma interactiva amb R. Tanmateix, existeixen algunes eines amb interfície gràfica que simplifiquen la realització dels gràfics:

  • Grapher: és una interfície gràfica d'usuari que fa que sigui molt fàcil de dibuixar gràfics per a principiants. Aquesta solució és multiplataforma. Després d'instal·lar el paquet GrapheR, es pot executar amb:
> library(GrapheR)
> run.GrapheR()
  • Playwith: proporciona una interfície gràfica d'usuari per personalitzar els gràfics amb. p. ex., títols, una grella o text. Genera el codi necessari per tornar a fer els canvis [1]. Un cop instal·lat el paquet playwith s'executa amb les ordres:
> library("playwith")
> playwith(plot(x1))

També les interfícies generals RKward i R Commander permeten fer molts gràfics de forma molt senzilla.

Existeixen dos sistemes de gràfics en R:

  • Els tradicionals i que es realitzen amb les ordres (funcions) del paquet graphics
  • El tipus grid [2] que permeten crear gràfics més sofisticats. Grid és un paquet que actualment forma part de la versió típica del R (és a dir, es distribueix i s'instal·la com a part de la distribució estàndard de R).[2] Aquest paquet és utilitzat per altres paquets per fer gràfics sofisticats:
    • lattice que permeten la realització dels diagrames trellis proposats per Bill Cleveland amb la finalitat de proporcionar una comunicació fiable de la informació mitjançant gràfics estadístics.
    • Hmisc
    • Design

Hi ha tipus gràfic que es pot fer amb els dos sistemes, encara que el segon permet més flexibilitat. A més a més, mentre que els gràfics tradicionals es visualitzen directament en la finestra gràfica, els grid quan es fan no es veu res i cal utilitzar la funció print per poder-lo visualitzar en la pantalla. Per exemple, si es vol fer un diagrama de dispersió, l'ordre tradicional és plot() i la del grid és xyplot()(lattice). El codi segons els dos sistemes seria:

## Dades simulades de 10 individus
N <- 10
U <-rnorm(N)
X <- 1 + rnorm(N)
Y <- 1 + X + U

## Diagrama de dispersió amb el sistema tradicional
plot(X, Y)               ## Es visualitza directament en la pantalla

## Diagrama de dispersió amb el sistema grid
library(lattice)         ## Es carrega un paquet que genera gràfics grid
print(xyplot(X ~ Y))     ## A fi de visualitzar-lo a la pantalla cal fer servir l'ordre print()

Desar els gràfics

modifica

Com que R s'executa en sistemes operatius diferents, existeix una varietat de formes de desar els gràfics segons el sistema operatiu utilitzat.

Mètode 1: Dispositiu i gràfic

modifica

Aquest mètode funcionarà en qualsevol ordinador amb R, independentment del sistema operatiu utilitzat.

  1. Escollir el format de gràfic que voleu utilitzar (p. ex., JPG).
  2. Cridar el dispositiu corresponent al format escollit amb l'únic argument del nom del fitxer que utilitzarà per guardar el gràfic. Recordi que el fitxer s'emmagatzemarà al directori actual. Pot averiguar quin és el directori actual escrivint l'ordre getwd() en l'indicador del R. Si vol canviar la mida del gràfic, ho pot fer introduint paràmetres addicionals.
  3. A continuació, introduïu les ordres per realitzar el gràfic i per realitzar les modificacions adients. Com que la sortida s'envia al dispositiu gràfic que s'ha obert prèviament, no s'obrirà cap finestra ni amb el gràfic ni es veurà res del mateix.
  4. En acabar el gràfic, introduïu l'ordre dev.off(). És important fer-ho ja que sense això, o el gràfic obtingut estarà incomplet o no no s'obtindrà cap gràfic.

El codi seria:

## Dades simulades de 500 individus
N <- 500
U <-rnorm(N)
X <- 1 + rnorm(N)
Y <- 1 + X + U

jpeg("grafic.jpg")        ## S'obre el dispositiu gràfic

plot(X, Y)                ## Es realitza el diagrama de dispersió

dev.off()                 ## Es tanca el dispositiu gràfic

En el directori de treball es desa el fitxer grafic.jpg. Si el gràfic és per utilitzar-lo en latex o openoffice, és millor utilitzar el dispositiu pdf:

pdf("grafic.pdf")         ## S'obre el dispositiu gràfic
plot(X, Y)                ## Es realitza el diagrama de dispersió
dev.off()                 ## Es tanca el dispositiu gràfic

Per veure la llista complerta dels dispositius gràfics existents, executar l'ordre help(Devices). Els més habituals són jpeg(), png(), postscript() i pdf().

Si es vol un gràfic vectorial amb format obert es pot utilitzar el format svg. És el que s'aconsella en primer lloc en la Viquipèdia [3]. Per generar-lo es pot executar un codi similar a aquest:

svg("grafic.svg")         ## S'obre el dispositiu gràfic
plot(X, Y)                ## Es realitza el diagrama de dispersió
dev.off()                 ## Es tanca el dispositiu gràfic

El problema d'aquest mètode és que primer s'ha de fer el gràfic sense obrir cap dispositiu gràfic per poder-lo veure per pantalla i decidir quan ja està correcte. Després s'ha d'obrir el dispositiu gràfic i tornar a executar totes les ordres per fer el gràfic. El sistema sempre funciona bé, però pot ser una mica lent.

Mètode 2: Gràfic i dispositiu

modifica

Mentre que el mètode anterior primer s'obria el dispositiu gràfic i després es feia el gràfic, amb el segon mètode, primer es fa el gràfic i es visualitza en la pantalla i després es copia el contingut de la pantalla en un fitxer. Per a la majoria de gràfics, aquest mètode és adequat, però de vegades la traducció del que estava a la pantalla en un fitxer no és del tot adequada.

El codi seria:

plot(X, Y)                               ## Es realitza el diagrama de dispersió
dev.copy(png,'grafic.png')               ## Es copia a un fitxer png
dev2bitmap('grafic.jpg', type = "jpeg")  ## Es copia a un fitxer jpg

Paràmetres comuns

modifica

Alguns paràmetres que es poden utilitzar en la majoria de gràfics (adaptat de [4] pàg. 15):


Paràmetre Descripció
log="<x|y|xy>" Eixos amb escala logarítmica
color=n Color dels símbols del gràfic que es pot indicar amb un nombre, el nom o un codi hexadecimal. La funció colors() proporciona un llistat. P. ex. col=3 ó col="green".
lty=n Tipus de línia (contínua, discontínua o puntejada), p.ex. lty="dashed" o lty="solid" "dotted" o digitlty="13",
main="<Títol>" Títol principal del gràfic
mtext("<Subtítol>") Subtítol del gràfic
new=<T|F> Afegeix al gràfic actual. T=Sí F=No
pch="." Caràcter per representar les observacions: ".", <"una caràcter"> <un nombre de caràcter>. Si es representen diverses sèries, es pot especificar una caràcter per cada una (p.ex., amb tres sèries: pch=1:3)
title(sub="<Peu de pàgina>") Afegeix un peu de pàgina
type="<l|p|b|n>" Tipus: línia. punts, ambdós, cap
xlab="Etiqueta de l'eix x" Afegeix una etiqueta a l'eix X
ylab="Etiqueta de l'eix y" Afegeix una etiqueta a l'eix Y
xlim=c(x mínim , x màxim) Valors límits per l'eix horizontal (xlim=c(0, 100)
ylim=c(y mínim , y màxim) Valors límits per l'eix vertical (ylim=c(-100, 100),)

Tanmateix, la interpretació d'aquests arguments estàndard pot variar segons el tipus de gràfic. Per tant cal tenir cura al utilitzar-los.

En el codi següent es mostre com es poden utilitzar aquests paràmetres:

##---------------------------------------------------------------------
## Exemples de paràmetres per un diagrama de caixa
##---------------------------------------------------------------------
library(MASS)                             # Paquet on estan les dades que s'utilitzaran en l'exemple
boxplot(Aids2$age ~ Aids2$status, 
        main   = "Diagrama de caixa de l'edat en funció de l'estat (viu o mort)",
        sub    = "Només homes de les dades Aids2 del paquet MASS",
        lty    = "dashed",                # En aquest tipus de gràfic no te massa sentit
        pch    = "x",                     # En aquest tipus de gràfic no te massa sentit
        xlab   = "Estat A: viu, D: mort",
        ylab   = "Edat",
        ylim   = c(0, 100),               # Límit pels valors de l'eix vertical
        subset = Aids2$sex == "M"         # Se seleccionen només els homes 
        )

Figures amb més d'un gràfic

modifica

Es poden col·locar diversos gràfics en un mateix gràfic. Per exemple, si en una taula de dades (anomenada DADES) es tenen quatre variables (anomenades V1, V2, V3 i V4) i es vol fer un histograma per cada cada una d'elles que es apareguin en una mateixa gràfica, es pot fer amb el codi següent:

layout(matrix(c(1,2,3,4), 2, 2, byrow = TRUE))  # Es defineixen quatre "caselles" 
hist(DADES$V1)
hist(DADES$V2)
hist(DADES$V3)
hist(DADES$V4)
layout(matrix(c(1,1), 1, 1, byrow = TRUE))      # Restablir la configuració inicial

Histograma

modifica

XXX Per fer. Veure Quick-R: Histograms and Density Plots XXX

> data(BP, package="epicalc")     # Carregar les dades en memòria
> head(BP)                        # Llistar el primer registres
  id    sex sbp dbp saltadd  birthdate
1  1   male 110  80     yes 1943-01-06
2  2 female  85  55      no 1969-01-03
3  3   male 167 112     yes 1933-06-10
4  4 female 145 110     yes 1946-11-23
5  5 female 180 120      no 1941-01-03
6  6   male 112  78      no 1942-04-16

hist(BP$dbp[BP$saltadd == "no"])
hist(BP$dbp[BP$saltadd == "yes"])

# Histograma amb corba normal

# Es crea una variable "x"(vector) amb els valors de la pressió pels que NO PRENENT sal
#  i s'eliminen els altres o els valors desconeguts:
x = BP$dbp
H = hist(x, 
         col = "red",
         xlab = "Pressió arterial diastòlica",
         ylab = "Freqüència",
         main = "Histograma amb la corba normal")              # Dibuixa l'histograma
xfit = seq(min(x),max(x),length=40)
yfit = dnorm(xfit,mean=mean(x),sd=sd(x))
yfit = yfit*diff(H$mids[1:2])*length(x)
lines(xfit, yfit, col="blue", lwd=2)                           # Dibuixa la corba normal

# Es crea una variable "x" (vector) amb els valors de la pressió pels que PRENENT sal
#  i s'eliminen els altres o els valors desconeguts:
x = na.omit(BP$dbp[BP$saltadd == "yes"])
H = hist(x, 
         col  = "red",
         xlab = "Pressió arterial diastòlica",
         ylab = "Freqüència",
         main = "Histograma amb la corba normal")              # Dibuixa l'histograma
xfit = seq(min(x),max(x),length=40)
yfit = dnorm(xfit,mean=mean(x),sd=sd(x))
yfit = yfit*diff(H$mids[1:2])*length(x)
lines(xfit, yfit, col="blue", lwd=2)

Diagrama de dispersió

modifica

Aquest gràfic per variables quantitatives, permet visualitzar la relació entre dos variables al mostrar la distribució del núvol de punts. Consisteix en representar cada parell de valors per un punt en el pla. Es construeixen amb la ordre plot(). Exemple de codi per realitzar un diagrama de dispersió de dos variables (X i Y):

## Dades simulades de 500 individus
N <- 500
U <-rnorm(N)
X <- 1 + rnorm(N)
Y <- 1 + X + U

## Diagrama de dispersió
plot(X, Y)

## Diagrama de dispersió amb límits del valor dels eixos
plot(X, Y, xlim=c(0, 4))
plot(X, Y, xlim=c(0, 4), ylim=c(0, 6))

Diagrama de caixa

modifica

Segons el Termcat (consultat 15-07-2012), un diagrama de caixa (en anglès, boxplot) és la "representació gràfica de la distribució de freqüències o de probabilitat d'una variable [quantitativa] mitjançant un rectangle que emmarca les freqüències o probabilitats compreses entre el percentil 25 i el percentil 75 i que està dividit per una línia que representa la mediana, coincident amb el percentil 50".

Distribució d'una variable quantitativa

modifica
library(MASS)
boxplot(Aids2$age, main = "Distribució de l'edat", ylab = "Edat", na.action = NULL)

Si es volen eliminar els valors extrems (outline=F).

## Eliminant valors extrems
boxplot(Aids2$age, outline=F, main = "Distribució de l'edat", ylab = "Edat", na.action = NULL)
title(sub="S'han exclòs els valors extrems")

Amb els estadístics al gràfic ([5], pàg. 65).

## Amb els estadístics al grafic
boxplot(Aids2$age, outline=F, main = "Distribució de l'edat", ylab = "Edat", na.action = NULL)
title(sub="S'han exclòs els valors extrems")
F = fivenum(Aids2$age)
text(rep(1,3,5), F, labels=c("Mínim", "Percentil 25", "Mediana", "Percentil 75", "Màxim"))

Distribució d'una variable quantitativa segons una qualitativa

modifica

Per visualitzar el valor d'una variable quantitativa segons els valors d'una qualitativa, s'ha d'introduir una fórmula:

## Valor de la variable quantitativa en funció dels valors d'una qualitativa
boxplot(Aids2$age ~ Aids2$sex, main = "Distribució de l'edat segons el sexe",
 ylab = "Edat", xlab="Sexe", na.action = NULL)

Es pot assignar un color a cada un dels grups de la variable qualitativa (col = c( "yellow", "red")) i es pot incloure una text explicatiu al gràfic.

## Amb colors i llegenda
boxplot(Aids2$age ~ Aids2$sex, main = "Distribució de l'edat segons el sexe",
 ylab = "Edat", xlab="Sexe", col = c( "yellow", "red"), na.action = NULL)
legend("topleft", c("Homes", "Dones"),fill = c("red", "yellow"))

Distribució d'una variable quantitativa segons dos qualitatives

modifica

Per visualitzar el valor d'una variable quantitativa segons els valors de dos variables qualitatives, s'ha d'introduir una fórmula:

## Valor de la variable quantitativa en funció dels valors de dos qualitatives
boxplot(Aids2$age ~ Aids2$sex + Aids2$status, las=2,
 main = "Distribució de l'edat segons el sexe i l'estat (Viu / Mort)", ylab = "Edat",
 xlab="Sexe.Estat", col = c( "yellow", "red"), na.action = NULL)
legend("topleft", c("Homes", "Dones"),fill = c("red", "yellow"))

Un mateix diagrama per diferents variables quantitatives

modifica

Si s'han de fer diversos diagrames i es vol que el títol del gràfic mostri la variable analitzada, es pot escriure una funció:

BOXPLOT3V = function(DADES, Y, X, GRUP, TITOL) {
    if(missing(TITOL)) {
        TITOL <- deparse(substitute(Y))
	# Treu el $ del DADES$NOMVAR
        if(grepl("\\$", TITOL)) {
            TITOL <- strsplit(TITOL, "\\$")[[1]][2]
        }
    }
  #Nom del fitxer de sortida
  NOMFI <- deparse(substitute(GRUP))
        if(grepl("\\$", NOMFI)) {
            NOMFI <- strsplit(NOMFI, "\\$")[[1]][2]
        }
  NOMFI = paste(NOMFI, "_", TITOL, ".jpg", sep="")
  boxplot(Y ~ GRUP + X, data = DADES, las=2, main = TITOL, ylab = TITOL, col = c( "yellow", "red"))
  topleft=par()$usr[c(1,4)]
  legend("topleft", c("Homes", "Dones"),fill = c("red", "yellow"))
  # Copia el gràfic a un fitxer
  dev2bitmap(NOMFI, type = "jpeg")
  }

BOXPLOT3V(Aids2, Aids2$age, Aids2$status, Aids2$sex)
BOXPLOT3V(Aids2, Aids2$age, Aids2$state, Aids2$sex)

Els gràfics són desats en format jpeg.

Referències

modifica
  1. Playwith
  2. 2,0 2,1 Grid
  3. Tipus de fitxers
  4. Correa JC, González N. Graficos estadísticos con R. 2002.
  5. Verzani J. Using R for introductory statistics. Boca Raton, FL: Chapman & Hall CRC