Objetivo

Queremos realizar diferentes gráficos en R para comprender como son nuestros datos. Dependiendo de la naturaleza de nuestras variables debemos optar por uno u otro. Se trata de poder hacer un primer análisis visual de nuestros datos, y a partir de ellos empezar a sacar las primeras conclusiones preliminares.

Cargamos nuestra matriz de datos, que tendrá el siguiente aspecto:

setwd(dir = "C:/R/MARKDOWN/graphs")
datos<-read.table("graphs.csv", sep = ";", header = TRUE, dec = ".")
datos
##    Treatment Var1 Var2
## 1          1  2.2 0.20
## 2          1  2.3 0.30
## 3          1  2.4 0.40
## 4          1  4.5 0.50
## 5          1  5.4 0.20
## 6          1  5.4 0.40
## 7          1  5.4 0.40
## 8          1  4.0 1.00
## 9          1  4.0 0.90
## 10         1  4.4 0.80
## 11         2  0.0 0.90
## 12         2  0.0 0.80
## 13         2  4.0 0.90
## 14         2  5.0 1.20
## 15         2  6.0 1.30
## 16         2  8.0 1.30
## 17         2  9.0 1.20
## 18         2  8.0 1.40
## 19         2  0.0 2.00
## 20         2  9.0 2.00
## 21         3  9.0 3.20
## 22         3  8.0 3.40
## 23         3  7.8 4.50
## 24         3  8.9 5.60
## 25         3 12.0 6.50
## 26         3  2.0 5.40
## 27         3 12.0 4.50
## 28         3 11.0 6.40
## 29         3 14.0 6.70
## 30         3  3.0 6.90
## 31         4 45.0 9.00
## 32         4 54.0 9.80
## 33         4 46.0 9.80
## 34         4 56.0 9.80
## 35         4 76.0 9.90
## 36         4 54.0 9.00
## 37         4 54.0 7.00
## 38         4 34.0 8.00
## 39         4 45.0 9.00
## 40         4 44.0 6.00
## 41         5 22.0 6.80
## 42         5 33.0 9.00
## 43         5 33.0 9.00
## 44         5 33.0 9.90
## 45         5 33.0 9.89
## 46         5 33.0 9.90
## 47         5 32.0 6.90
## 48         5 32.0 9.90
## 49         5 43.0 9.99
## 50         5 55.0 9.80
str(datos)
## 'data.frame':    50 obs. of  3 variables:
##  $ Treatment: int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Var1     : num  2.2 2.3 2.4 4.5 5.4 5.4 5.4 4 4 4.4 ...
##  $ Var2     : num  0.2 0.3 0.4 0.5 0.2 0.4 0.4 1 0.9 0.8 ...

En este caso tenemos cinco grupos (=tratamientos) y dos variables dependientes (Var1 y Var2).

BARRAS

Gráfico de barras. Es adecuado para variables dependientes agrupadas por tratamientos (por ejemplo la altura media de los ciudadanos de tres ciudades). No se puede hacer directamente, se requiere el cálculo de la media y la desviación de nuestras variables dependientes en función del tratamiento.

Primero hay que calcular la media y la desviación de nuestros datos en función del tratamiento y para cada variable:

mediasvar1<-aggregate(datos$Var1~datos$Treatment, FUN=mean)
sdvar1<-aggregate(datos$Var1~datos$Treatment, FUN=sd)
mediasvar1
##   datos$Treatment datos$Var1
## 1               1       4.00
## 2               2       4.90
## 3               3       8.77
## 4               4      50.80
## 5               5      34.90
library(plyr)
## Warning: package 'plyr' was built under R version 3.5.3
medvar1<-ddply(datos,.(Treatment), summarize, mean=mean(Var1))
sdvar1<-ddply(datos,.(Treatment), summarize, sd=sd(Var1))
str(medvar1)
## 'data.frame':    5 obs. of  2 variables:
##  $ Treatment: int  1 2 3 4 5
##  $ mean     : num  4 4.9 8.77 50.8 34.9

Ahora representamos esas medias en función de cada tratamiento:

BARRAS<-barplot(medvar1$mean, axes=FALSE,axisname=FALSE, ylim=c(0,100),
        col=c('white', 'gray','azure4','dimgray','black'),main="Título Var1",
        xlab="Treatments", ylab="Var1")
axis(1,labels=c("control", "T1","T2","T3","T4"), at=BARRAS)
axis(2,at=seq(0,100,by=10))

Ponemos las barras de error:

BARRAS<-barplot(medvar1$mean, axes=FALSE,axisname=FALSE, ylim=c(0,100),
        col=c('white', 'gray','azure4','dimgray','black'),main="Título Var1",
        xlab="Treatments", ylab="Var1")
axis(1,labels=c("control", "T1","T2","T3","T4"), at=BARRAS)
axis(2,at=seq(0,100,by=10))
segments(BARRAS-0.1,medvar1$mean-sdvar1$sd,BARRAS+0.1,medvar1$mean-sdvar1$sd,lwd=2)
segments(BARRAS-0.1,medvar1$mean+sdvar1$sd,BARRAS+0.1,medvar1$mean+sdvar1$sd,lwd=2)
segments(BARRAS,medvar1$mean-sdvar1$sd,BARRAS,medvar1$mean+sdvar1$sd,lwd=2)

BOXPLOT

Hacemos un Boxplot con nuestros datos. el Boxplot aporta mucha información sobre nuestros datos, la caja representa

boxplot(Var1 ~ Treatment, data=datos, col="green", cex.axis=0.7,las = 2, ylab="var1", xlab="Treatments", cex.lab=0.75)

boxplot(Var2 ~ Treatment, data=datos, col="red", cex.axis=0.7,las = 2, ylab="var2", xlab="Treatments", cex.lab=0.75)

Estos gráficos se interpretan de la siguiente manera: LA LÍNEA que separa el rectángulo en dos es la MEDIANA (varible en posición central de un conjunto de datos). LOS EXTREMOS DEL RECTÁNGULO son los cuartiles extremos, es decir en el recuadro están el 75% de nuestros datos.

BAGPLOT

Variante en dos dimensiones del Boxplot:

library(aplpack)
## Loading required package: tcltk
bagplot(datos$Var1,datos$Var2,xlab="Var1", ylab="Var2", main="Bagplot Example")

La zona sombreada recoge el 50% de los datos, los puntos con líneas son outlayers.

DISPERSIÓN

Gráfico de dispersión de las dos variables enfrentadas coloreadas en función del tratamiento:

with(datos, plot(Var1, Var2, col=Treatment))
abline(h = 12, lwd = 2, lty = 2)

Un gráfico de dispersión de var1 frente a var2 para cada uno de los tratamientos:

par(mfrow = c(1, 2), mar = c(5, 4, 2, 1))
with(subset(datos, Treatment == "1"), plot(Var1, Var2, main = "Tratamiento 1"))
with(subset(datos, Treatment == "2"), plot(Var1, Var2, main = "Tratamiento 2"))

with(subset(datos, Treatment == "3"), plot(Var1, Var2, main = "Tratamiento 3"))
with(subset(datos, Treatment == "4"), plot(Var1, Var2, main = "Tratamiento 4"))

with(subset(datos, Treatment == "5"), plot(Var1, Var2, main = "Tratamiento 5"))

HISTOGRAMA

Hacemos un Histograma de frecuencias para cada variable:

hist(datos$Var1, col = "green")

hist(datos$Var2, col = "red")

Se pueden mostrar los datos en la figura:

hist(datos$Var1, col = "green")
rug(datos$Var1)

Podemos romper en más columnas el histograma:

hist(datos$Var1, col = "green", breaks = 100)

HISTOGRAMA SIMULTÁNEO

par(mfrow = c(2, 1), mar = c(4, 4, 2, 1))
hist(datos$Var1, col = "green")
hist(datos$Var2, col = "red")

KERNEL DENSITY PLOTS

Una forma alternativa de ver la distribución de nuestros datos. Visualmente es más fácil ver si los datos siguen una distribución normal.

density1 <- density(datos$Var1) 
plot(density1)
polygon(density1, col="green", border="black")

density2 <- density(datos$Var2) 
plot(density2)
polygon(density2, col="red", border="black")

MODELOS EN GGPLOT

Representación sencilla

Vamos a representar figuras para modelos ajustados a dos variables cuantitativas, por ejemplo la cobertura de plantas y la altura sobre el nivel del mar.

setwd(dir = "C:/R/MARKDOWN/graphs")
datoss<-read.table("alturacobertura.csv", sep = ";", header = TRUE, dec = ".")
datoss
##    altura cobertura Zona
## 1      10         0    A
## 2      25         1    A
## 3      65         3    A
## 4      89        10    A
## 5     152        10    A
## 6     521        20    C
## 7     462        20    C
## 8     321        65    C
## 9     357        55    C
## 10    451        50    C
## 11    210        65    C
## 12     89        10    A
## 13     99        21    A
## 14     68        15    A
## 15     79        12    A
## 16     99        19    A
## 17     98        12    A
## 18     96         9    A
## 19     93        16    A
## 20     91        13    A
## 21    102        21    B
## 22    165        29    B
## 23    186        23    B
## 24    102        24    B
## 25    177        22    B
## 26    145        23    B
## 27    196        31    B
## 28    215        26    C
## 29    568         5    C
## 30    265        59    C
## 31    289        49    C
## 32    457        45    C
## 33    566         2    C
## 34     65        15    A
## 35    200        39    C
## 36    201        38    C
## 37    198        39    C
## 38    199        39    C
## 39    298        41    C
## 40    289        42    C
## 41    458        51    C
str(datoss)
## 'data.frame':    41 obs. of  3 variables:
##  $ altura   : int  10 25 65 89 152 521 462 321 357 451 ...
##  $ cobertura: int  0 1 3 10 10 20 20 65 55 50 ...
##  $ Zona     : Factor w/ 3 levels "A","B","C": 1 1 1 1 1 3 3 3 3 3 ...

Representamos nuestros datos.

plot(cobertura~altura,data=datoss,pch=16)
abline(lm(cobertura~altura,data=datoss),col="red")

Podemos ver los parámetros del lm para nuestros datos:

model<-lm(cobertura~altura,data=datoss)
summary(model)
## 
## Call:
## lm(formula = cobertura ~ altura, data = datoss)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -40.42 -10.87  -0.56  12.10  38.67 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 16.84268    4.60315   3.659 0.000748 ***
## altura       0.04520    0.01748   2.586 0.013566 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 17.02 on 39 degrees of freedom
## Multiple R-squared:  0.1464, Adjusted R-squared:  0.1245 
## F-statistic: 6.686 on 1 and 39 DF,  p-value: 0.01357

Vamos a utilizar ggplot2 para representar nuestros datos:

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.5.3
qplot(datoss$altura,datoss$cobertura)

Unimos por líneas todos los puntos:

qplot(altura,cobertura,data=datoss,geom=c("point", "line"))

Ahora representamos un modelo sobre la nube de puntos:

qplot(altura,cobertura,data=datoss,geom = c("point", "smooth"))
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Con ggplotse puede representar lo mismo:

ggplot(datoss,aes(altura,cobertura))+geom_point()+geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Representación por categorías

Representamos las tres zonas en nuestra figura:

qplot(altura,cobertura,data=datoss, color=factor(Zona), geom=c("point"))

Ahora incluimos modelo para cada zona:

qplot(altura,cobertura,data=datoss, color=factor(Zona), geom=c("point","smooth"))
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Boxplot por categorías

Vamos a representar la altura por cada una de nuestras zonas:

qplot(Zona, altura, data=datoss, geom="boxplot")

Vamos a representar la cobertura por cada una de nuestras zonas:

qplot(Zona, cobertura, data=datoss, geom="boxplot")

Vamos a representar la cobertura por cada una de nuestras zonas con las observaciones:

qplot(Zona, cobertura, data=datoss, geom=c("boxplot","jitter"))

Representamos solamente las observaciones para las coberturas por zonas:

qplot(Zona, cobertura, data = datoss, 
      geom=c("dotplot"), 
      stackdir = "center", binaxis = "y") 
## `stat_bindot()` using `bins = 30`. Pick better value with `binwidth`.

Podemos representar como un violín para las coberturas por zonas (nos informa de lo dispersos o agrupados que se encuentran los datos):

qplot(Zona, cobertura, data = datoss, 
      geom=c("violin"), trim = FALSE)

Vamos a poner a cada zona un color:

qplot(Zona, cobertura, data = datoss, 
      geom=c("boxplot","jitter"), fill=Zona) 

Histogramas

Un histograma para todos los datos de cobertura:

qplot(cobertura, data = datoss, geom = "histogram",bins=30)

Histograma por zonas:

qplot(cobertura, data = datoss, geom = "histogram", fill=Zona,bins=30)

Densidades

Un gráfico de densidad para todos los datos de cobertura:

qplot(cobertura, data = datoss, geom = "density")

Densidad de la cobertura en función de la zona:

qplot(cobertura, data = datoss, geom = "density", color=Zona,linetype=Zona)

Qué no se nos olvide poner los nombres a nuestras figuras:

qplot(cobertura, data = datoss, geom = "density",
      xlab = "Cobertura (%)", ylab = "Densidad", 
      main = "Densidad en función de la cobertura")

Gráfico Barras

Calculo los valores medios y Sd para la figura de la cobertura en cada una de las zonas:

meancob<-aggregate(datoss$cobertura~datoss$Zona, FUN=mean)
sdcob<-aggregate(datoss$cobertura~datoss$Zona, FUN=sd)
meancob
##   datoss$Zona datoss$cobertura
## 1           A         11.06667
## 2           B         24.71429
## 3           C         39.47368
sdcob
##   datoss$Zona datoss$cobertura
## 1           A          6.08824
## 2           B          3.77334
## 3           C         18.00422

Ahora hacemos un data.frame con las zonas y sus correspondientes medias y lo representamos:

df<-data.frame(zona=c("A","B","C"), outcome=c(11.07,24.71,39.47))
ggplot(df,aes(zona,outcome))+geom_col()