Nuestro objetivo es construir un gráfico de barras que muestre la altura media de los habitantes de cuatro ciudades. Para ello se ha medido la altura y se ha tomado la edad de cuatro ciudadanos de cada una de las ciudades. Nuestros datos son un dataframe con cuatro ciudades (A, B, C y D) y la altura y edad de cuatro de sus habitantes. Al final de este documento seremos capaces de construir un gráfico de barras con los valores medios de la altura de los ciudanos de las cuatro ciudades y su desviación estándar.
Cargamos nuestra matriz de datos, que tendrá el siguiente aspecto:
setwd(dir = "F:/R/MARKDOWN-ggplot2/bargraphggplot2/")
datos<-read.table("alturas.csv", sep = ";", header = TRUE, dec = ".")
datos
## city heigh age
## 1 A 175 25
## 2 A 184 20
## 3 A 175 24
## 4 A 180 26
## 5 B 169 22
## 6 B 168 28
## 7 B 168 29
## 8 B 171 31
## 9 C 166 32
## 10 C 165 34
## 11 C 163 24
## 12 C 163 33
## 13 D 189 35
## 14 D 188 33
## 15 D 188 35
## 16 D 187 38
str(datos)
## 'data.frame': 16 obs. of 3 variables:
## $ city : chr "A" "A" "A" "A" ...
## $ heigh: int 175 184 175 180 169 168 168 171 166 165 ...
## $ age : int 25 20 24 26 22 28 29 31 32 34 ...
Ahora toca calcular los valores medios de las alturas de los ciudadanos en cada una de las cuatro ciudades. Para ello utilizamos la función aggregate
. Esos valores medios serán los que representaremos en nuestra gráfica de barras.
datosmean<-aggregate(datos[, 2:3], list(datos$city), mean)
datosmean
## Group.1 heigh age
## 1 A 178.50 23.75
## 2 B 169.00 27.50
## 3 C 164.25 30.75
## 4 D 188.00 35.25
Vamos a utilizar la función barplot
que utiliza R base. Sería la forma clásica de utilizar R para gráficos. Es sencilla, pero ggplot permite una mayor cantidad de acciones de forma más fácil (Se van sumando “capas” a la figura, esto facilita la lógica de la construcción del gráfico, luego lo veremos).
barplot(datosmean$heigh~datosmean$Group.1,xlab="City",ylab="Heigh (cm)")
Vamos a utilizar la función ggplot
que utiliza ggplot2. La lógica de este paquete es ir añadiendo capas a la figura, las cuales se añaden por medio de +
. Primero hay que instalar install.packages("ggplot2")
y activar el paquete library("ggplot2")
:
Y ahora la figura:
library(ggplot2)
ggplot(datosmean, aes(x=Group.1, y=heigh)) +
geom_bar(stat="identity")
En este caso con aes
le indicamos la variable en x y la variable en y. Con geom_bar
el tipo de gráfico.
Ahora incluimos color en las barras. Para conseguir esto hacemos lo siguiente:
ggplot(datosmean, aes(x=Group.1, y=heigh, fill=Group.1)) +
geom_bar(stat="identity")
Al incluir fill
vamos a decirle a R que cada una de las ciudades es una categoria diferente y de forma automática le cambia los colores. Esto es útil si por ejmplo tenemos para cada ciudad dos categorias de edad y queremos representarlo en función de esas categorías dentro de cada una de las ciudades. Para seleccionar nosostros los colores utilizamos scale_fill_manual
:
ggplot(datosmean, aes(x=Group.1, y=heigh, fill=Group.1)) +
geom_bar(stat="identity") +
scale_fill_manual(values=c("orange", "red", "green", "black"))
Podemos utilizar paletas de colores, de tal manera que R selecciona colores conjuntados por temáticas por medio de scale_fill_brewer
. Aquí pongo tres ejemplos:
ggplot(datosmean, aes(x=Group.1, y=heigh, fill=Group.1)) +
geom_bar(stat="identity") + scale_fill_brewer(palette="Green")
## Warning in pal_name(palette, type): Unknown palette Green
ggplot(datosmean, aes(x=Group.1, y=heigh, fill=Group.1)) +
geom_bar(stat="identity") + scale_fill_brewer(palette="Reds")
ggplot(datosmean, aes(x=Group.1, y=heigh, fill=Group.1)) +
geom_bar(stat="identity") + scale_fill_brewer(palette="Pastel2")
La paleta de colores es muy diversa y hay para todos los gustos. Aquí os las dejo:
Podemos utilizar escala de grises para nuestras barras por medio de scale_fill_grey
. Puede ser útil para determinadas publicaciones que no admitan el color:
ggplot(datosmean, aes(x=Group.1, y=heigh, fill=Group.1)) +
geom_bar(stat="identity") + scale_fill_grey()
Hay varios temas para cambiar el fondo de la figura. Para ello debemos utilizar theme_
seguido del tema disponible. Aquí varios ejmemplos:
ggplot(datosmean, aes(x=Group.1, y=heigh, fill=Group.1)) +
geom_bar(stat="identity") + scale_fill_grey() + theme_minimal()
ggplot(datosmean, aes(x=Group.1, y=heigh, fill=Group.1)) +
geom_bar(stat="identity") + scale_fill_grey() + theme_classic()
ggplot(datosmean, aes(x=Group.1, y=heigh, fill=Group.1)) +
geom_bar(stat="identity") + scale_fill_grey() + theme_light()
Aquí un resumen de los temas disponibles en ggplot2:
Para cambiar la anchura de las barras utilizamos width
en geom_bar
:
ggplot(datosmean, aes(x=Group.1, y=heigh, fill=Group.1)) +
geom_bar(stat="identity", width=0.6) + scale_fill_brewer(palette="Pastel2") + theme_light()
ggplot(datosmean, aes(x=Group.1, y=heigh, fill=Group.1)) +
geom_bar(stat="identity", width=0.2) + scale_fill_brewer(palette="Pastel2") + theme_light()
Para poner rótulos a los ejes y un título. Lo haremos de la siguiente manera:
ggplot(datosmean, aes(x=Group.1, y=heigh, fill=Group.1)) +
geom_bar(stat="identity", width=0.4) + scale_fill_brewer(palette="Pastel2") + theme_light() +
ggtitle("Altura media ciudadanos") +
xlab("Ciudades") +
ylab("Altura de ciudadanos (cm)")
En este caso se ha utilizado ggtitle
para incluir el título principal de la figura, xlab
e ylab
para los rótulos del eje x y del eje y respectivamente.
Podemos incluir el valor de la media en la parte superior de cada una de las columnas. En este caso se representa la altura media de los ciudadanos en cada una de las cuatro ciudades estudiadas. Para ello se ha utilizado geom_text(aes(label=heigh), vjust=-0.6, size=3)
en donde se puede seleccionar la posición y el tamaño de los números.
ggplot(datosmean, aes(x=Group.1, y=heigh, fill=Group.1)) +
geom_bar(stat="identity", width=0.4) + scale_fill_brewer(palette="Pastel2") + theme_light() +
ggtitle("Altura media ciudadanos") +
xlab("Ciudades") +
ylab("Altura (cm)") +
geom_text(aes(label=heigh), vjust=-0.6, size=3)
Muy sencillo, añadimos coord_flip()
.
ggplot(datosmean, aes(x=Group.1, y=heigh, fill=Group.1)) +
geom_bar(stat="identity", width=0.4) + scale_fill_brewer(palette="Pastel2") + theme_light() +
ggtitle("Altura media ciudadanos") +
xlab("Ciudades") +
ylab("Altura (cm)") +
geom_text(aes(label=heigh), vjust=-0.6, size=4) + coord_flip()
Vamoa a añadir barras de error a nuestra figura. Para ello hay que crear un dataframe que contenga las medias y las desviaciones estándar para las cuatro ciudades (se podría utilizar cualquier otra medida de dispersión, como el máximo y el mínimo o la varianza, etc.). En este caso he utilizado una función que lo calcula. El autor de la misma en STHDA.
data_summary <- function(data, varname, groupnames){
require(plyr)
summary_func <- function(x, col){
c(mean = mean(x[[col]], na.rm=TRUE),
sd = sd(x[[col]], na.rm=TRUE))
}
data_sum<-ddply(data, groupnames, .fun=summary_func,
varname)
data_sum <- rename(data_sum, c("mean" = varname))
return(data_sum)
}
datossummary <- data_summary (datos, varname="heigh",
groupnames=c("city"))
## Loading required package: plyr
datossummary
## city heigh sd
## 1 A 178.50 4.3588989
## 2 B 169.00 1.4142136
## 3 C 164.25 1.5000000
## 4 D 188.00 0.8164966
En nuestro nuevo dataframe ya aparecen para cada una de las ciudades la media y la desviación estándar. Atentos, ya que la SD será la que utilizaremos para representar las barras de error de la nueva figura, del siguiente modo:
ggplot(datossummary, aes(x=city, y=heigh, fill=city)) +
geom_bar(stat="identity",color="black", width=0.4) + scale_fill_brewer(palette="Pastel2") + theme_light() +
ggtitle("Altura media ciudadanos") +
xlab("Ciudades") +
ylab("Altura (cm)") +
geom_errorbar(aes(ymin=heigh-sd, ymax=heigh+sd), width=.2, position=position_dodge(.9))
En este caso por medio de geom_errorbar(aes(ymin=heigh-sd, ymax=heigh+sd), width=.2, position=position_dodge(.9))
hemos indicado las barras (valor minimo con ymin
y el valor máximo con ymax
) y su tamaño y posición. Otra alternativa es representar solamente la parte superior de la barra. Para ello haremos lo siguiente:
ggplot(datossummary, aes(x=city, y=heigh, fill=city)) +
geom_bar(stat="identity",color="black", width=0.4) + scale_fill_brewer(palette="Pastel2") + theme_light() +
ggtitle("Altura media ciudadanos") +
xlab("Ciudades") +
ylab("Altura (cm)") +
geom_errorbar(aes(ymin=heigh, ymax=heigh+sd), width=.2, position=position_dodge(.9))
La anterior figura es muy útil para cualquier tipo de representación de una variable dependiente frente a los diferentes niveles de un factor (en este caso sería ciudad con cuatro ciudades diferentes, pero podrían ser un control y tres concentraciones de un plaguicida, etc.). También se pueden incluir varias variables dependientes en cada uno de los niveles del factor. Para esto último deberían tener unidades similares para evitar barras de muy diferente tamaño.
Departamento de Ciencias de la Vida
Universidad de Alcalá (España)