En esta parte de la clase vamos a ver las diferentes formas para gráficar variables discretas y continuas. Para esto, vamos a utilizar nuevamente nuestra base de datos msleep
library(tidyverse)
## -- Attaching packages -------------- tidyverse 1.3.0 --
## v ggplot2 3.3.0 v purrr 0.3.4
## v tibble 3.0.1 v dplyr 0.8.5
## v tidyr 1.0.2 v stringr 1.4.0
## v readr 1.3.1 v forcats 0.5.0
## -- Conflicts ----------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(readxl)
msleep <- read_excel("data/msleep_database_excel.xls", sheet = "msleep", na = "NA")
glimpse(msleep)
## Rows: 83
## Columns: 11
## $ name <chr> "Cheetah", "Owl monkey", "Mountain beaver", "Greater s...
## $ genus <chr> "Acinonyx", "Aotus", "Aplodontia", "Blarina", "Bos", "...
## $ vore <chr> "carni", "omni", "herbi", "omni", "herbi", "herbi", "c...
## $ order <chr> "Carnivora", "Primates", "Rodentia", "Soricomorpha", "...
## $ conservation <chr> "lc", NA, "nt", "lc", "domesticated", NA, "vu", NA, "d...
## $ sleep_total <dbl> 12.1, 17.0, 14.4, 14.9, 4.0, 14.4, 8.7, 7.0, 10.1, 3.0...
## $ sleep_rem <dbl> NA, 1.8, 2.4, 2.3, 0.7, 2.2, 1.4, NA, 2.9, NA, 0.6, 0....
## $ sleep_cycle <dbl> NA, NA, NA, 0.1333333, 0.6666667, 0.7666667, 0.3833333...
## $ awake <dbl> 11.9, 7.0, 9.6, 9.1, 20.0, 9.6, 15.3, 17.0, 13.9, 21.0...
## $ brainwt <dbl> NA, 0.01550, NA, 0.00029, 0.42300, NA, NA, NA, 0.07000...
## $ bodywt <dbl> 50.000, 0.480, 1.350, 0.019, 600.000, 3.850, 20.490, 0...
geom_bar()En ggplot, la geometria geom_bar() tiene mucha versatilidad. Por default, ggplot hace gráficos de barra de “cuentas” (counts) lo que significa que la frecuencia de cada item esta especificado en el aesthetics x.
Por ejemplo, gráfiquemos la frecuencia de los ordenes de las especies en msleep:
ggplot(data = msleep, aes(x = order)) +
geom_bar()+
theme(axis.text.x=element_text(angle=90, hjust=1))
Dentro de aesthetics, es posible ditinguir el número de especies determinado estatus de conservación.
ggplot(data = msleep, aes(x = order, fill = conservation))+
geom_bar()+
theme(axis.text.x=element_text(angle=90, hjust=1))
Por default, geom_bar hace un grafico con agrupado (stacket) con los valores de cada estatus de conservación.
Para convertir estos valores en frecuencias relativas, solo es necesario agregar dentro de geom_bar el parametro position = fill.
ggplot(data = msleep, aes(x = order, fill = conservation))+
geom_bar(position = "fill")+
theme(axis.text.x=element_text(angle=90, hjust=1))
Para esto
msleep_count <- msleep %>%
count(order, sort = TRUE)
ggplot(data = msleep_count, aes(x = order, y = n))+
geom_bar(stat = "identity")+
theme(axis.text.x=element_text(angle=90, hjust=1))
Para ordenar la grafica en orden ascendente usa:
x = reorder(order, -n).
#2: Gráficas de variables continuas
Uno de los primeros aspectos que analizamos cuando tenemos una base de datos, es la disperción de los datos. Una forma de visualziarlo es mediante una gráfica de densidad.
ggplot(msleep, aes(x = sleep_total))+
geom_density()
Utilizando el parametro col podemos distinguir la disperción entre distintos grupos en combinación con facet_wrap()podemos diferenciar la dispercion entre los grupos
ggplot(msleep, aes(x = sleep_total, col = order))+
geom_density()+
facet_wrap(.~order)
## Warning: Groups with fewer than two data points have been dropped.
## Warning: Groups with fewer than two data points have been dropped.
## Warning: Groups with fewer than two data points have been dropped.
## Warning: Groups with fewer than two data points have been dropped.
## Warning: Groups with fewer than two data points have been dropped.
geom_pointAhora vamos a analizar la relación que existe entre las horas totales de sueño y con las horas de rem. Ambas constituyen variables continuas.
Para visualizar los datos, usamos la geometria de puntos geom_point
ggplot(data = msleep, aes(x = sleep_total, y = sleep_rem)) +
geom_point()
## Warning: Removed 22 rows containing missing values (geom_point).
Ahora se gráficara la información pero con datos sumarizados, es decir, con datos de promedios,desviación, etc.
Para este ejercicio, usaremos los datos de actividad enzimatica de la tauropina deshidrogenasa (TDH) los cuales estan en su carpeta de datos editados
tdh <- read_csv("data/Datos_enzimas_TDH.csv")
## Parsed with column specification:
## cols(
## individuo = col_double(),
## ExpNum = col_double(),
## TreatTemp = col_double(),
## ActivityTDH = col_double()
## )
glimpse(tdh)
## Rows: 210
## Columns: 4
## $ individuo <dbl> 1, 2, 5, 6, 9, 10, 13, 14, 17, 18, 21, 22, 25, 26, 29, ...
## $ ExpNum <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
## $ TreatTemp <dbl> 18, 18, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,...
## $ ActivityTDH <dbl> 12.749196, 12.491961, 17.025723, 17.926045, 23.006431, ...
como primera parte de la transformación, convertiremos las columnas ExpNum y TreatTemp en factores
tdh <- tdh %>%
mutate(ExpNum = factor(ExpNum),
TreatTemp = factor(TreatTemp))
tdh
## # A tibble: 210 x 4
## individuo ExpNum TreatTemp ActivityTDH
## <dbl> <fct> <fct> <dbl>
## 1 1 1 18 12.7
## 2 2 1 18 12.5
## 3 5 1 24 17.0
## 4 6 1 24 17.9
## 5 9 1 24 23.0
## 6 10 1 24 23.0
## 7 13 1 24 13.6
## 8 14 1 24 13.5
## 9 17 1 24 16.2
## 10 18 1 24 16.1
## # ... with 200 more rows
como primera inspección de los datos, hagamos graficas de densidad con las diferentes temperaturas diferenciadas por colores y cada experimento en un facet diferente
ggplot(data = tdh, aes(x = ActivityTDH, col = TreatTemp))+
geom_density()+
facet_grid(.~ ExpNum)
Otra alternativa para visualizar la disperción de los datos es mediante una gráfica de violin. Este requiere de una variable discreta x y una continua y.
ggplot(data = tdh, aes(x = TreatTemp, y = ActivityTDH, col = TreatTemp))+
geom_violin()+
facet_grid(.~ ExpNum)
Ahora vamos a obtener el promedio, la desviación estandar y el tamaño de muestra para cada tratamiento de cada experiento
tdh_sum <- tdh %>%
group_by(TreatTemp, ExpNum) %>%
summarise(promedio = mean(ActivityTDH),
desviacion = sd(ActivityTDH),
N = n())
tdh_sum
## # A tibble: 16 x 5
## # Groups: TreatTemp [4]
## TreatTemp ExpNum promedio desviacion N
## <fct> <fct> <dbl> <dbl> <int>
## 1 18 1 13.3 4.08 12
## 2 18 2 14.8 6.14 12
## 3 18 3 18.5 3.27 12
## 4 18 4 17.0 5.49 12
## 5 24 1 17.3 3.39 12
## 6 24 2 15.3 2.93 16
## 7 24 3 17.0 3.53 12
## 8 24 4 21.9 5.66 18
## 9 30 1 13.6 4.63 12
## 10 30 2 18.0 2.85 12
## 11 30 3 17.9 4.56 18
## 12 30 4 14.0 4.38 12
## 13 32 1 13.7 5.52 12
## 14 32 2 32.4 15.4 14
## 15 32 3 21.4 4.13 12
## 16 32 4 17.2 2.97 12
Con estos datos, podemos hacer un gráfico de barras, incluyendo cada temperatura en el eje x y el valor promedio de sleep total en el eje y.
Recuerda incluir stat = "identity dentro de geom_bar
ggplot(tdh_sum , aes(x = TreatTemp, y = promedio ))+
geom_bar(stat = "identity")
La gráfica anterior muestra los valores promedio de cada temperatura, sin hacer distinción entre cada experimento. Trata de hacer que se distingan usando colores diferentes
ggplot(tdh_sum , aes(x = TreatTemp, y = promedio, fill = ExpNum ))+
geom_bar(stat = "identity")
Esta gráfica nos incluye el valor de cada experimento, pero pone uno arriba del otro. Para graficarlos de forma separada, es necesario incluir el paramtro position = position_dodge()dentro de geom_bar()
ggplot(tdh_sum , aes(x = TreatTemp, y = promedio, fill = ExpNum ))+
geom_bar(stat = "identity", position = position_dodge())
El parametro position = position_dodge()es muy importante y tenemos que considerarlo para cada capa adicional que agreguemos al gráfico.
Ahora vamos a agregar barrar de error a la gráfica. Para esto, vamos a utilizar la funcion geom_errorbar(). Para esto, necesitamos los valores promedio y desviación de la tabla
ggplot(tdh_sum , aes(x = TreatTemp, y = promedio, fill = ExpNum ))+
geom_bar(stat = "identity", position = position_dodge(0.9)) +
geom_errorbar(aes(ymin = promedio - desviacion, ymax = promedio + desviacion),
width = 0.2, #ancho de las barras,
position = position_dodge(.9))
¿Como podemos mejorar nuestra gráfica?
ggplot(tdh_sum , aes(x = TreatTemp, y = promedio, fill = ExpNum))+
geom_bar(stat = "identity", position = position_dodge(0.9)) +
geom_errorbar(aes(ymin = promedio - desviacion, ymax = promedio + desviacion),
width = 0.2, #ancho de las barras,
position = position_dodge(.9))+
labs(title = "Acitvidad TDH", x = "Temperatura (°C)", y = "Actividad", caption = "Esta gráfica fue generada con ggplot2") +
theme_classic()
Ahora trata de generar el mismo gráfico pero usando dos geometrias: puntos y lineas, en lugar de barras
ggplot(tdh_sum , aes(x = TreatTemp, y = promedio, col = ExpNum, group = ExpNum))+
geom_point(position = position_dodge(0.1))+
geom_line(position = position_dodge(0.1))+
geom_errorbar(aes(ymin = promedio - desviacion, ymax = promedio + desviacion),
width = 0.2, #ancho de las barras,
position = position_dodge(0.1))+
labs(title = "Acitvidad TDH", x = "Temperatura (°C)", y = "Actividad", caption = "Esta gráfica fue generada con ggplot2") +
theme_classic()
Recuerda que si tienes que repetir un parametro varias veces, es posible definirlo como un objeto.
dodge = position_dodge(0.2)
ggplot(tdh_sum , aes(x = TreatTemp, y = promedio, col = ExpNum, group = ExpNum))+
geom_point(position = dodge)+
geom_line(position = dodge)+
geom_errorbar(aes(ymin = promedio - desviacion, ymax = promedio + desviacion),
width = 0.2, #ancho de las barras,
position = dodge)+
labs(title = "Acitvidad TDH", x = "Temperatura (°C)", y = "Actividad",caption = "Esta gráfica fue generada con ggplot2") +
theme_classic()
themes()Ahora vamos a usar themes() para modificar algunos parametros de la gráfica
dodge = position_dodge(0.2)
p <- ggplot(tdh_sum , aes(x = TreatTemp, y = promedio, col = ExpNum, group = ExpNum))+
geom_point(position = dodge)+
geom_line(position = dodge)+
geom_errorbar(aes(ymin = promedio - desviacion, ymax = promedio + desviacion),
width = 0.2, #ancho de las barras,
position = dodge)+
labs(title = "Acitvidad TDH", x = "Temperatura (°C)", y = "Actividad", caption = "Esta gráfica fue generada con ggplot2") +
theme_classic()
p = p + theme(legend.position = "right",
legend.text = element_text(size = 12),
legend.justification = "center",
legend.title = element_text(face = "bold"))
agregar lineas solamente en el eje y
p = p + theme(panel.grid.major.y = element_line(size = 0.5, color = "grey", linetype = "dashed"))
Cambiar las etiquetas de la leyenda
p = p + scale_color_discrete(name = "Experimento", labels = c("Exp1", "Exp2", "Exp3", "Exp4"))
p