1 Nuestros datos

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 ...

2 Valores medios a representar

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

3 Gráfico de barras con R base

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)")

4 Gráfico de barras con ggplot2

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 aesle indicamos la variable en x y la variable en y. Con geom_barel tipo de gráfico.

4.1 Color en las barras

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"))

4.2 Paleta de colores

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:

4.3 Escala de grises

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()

4.4 Cambiar el fondo

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:

4.5 Anchura de las barras

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()

4.6 Rotular el gráfico

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.

4.7 Mostrar valores en la figura

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)

4.8 Barras en horizontal

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()

4.9 Barras de error

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.

5 CRÉDITOS

Álvaro Alonso Fernández

Departamento de Ciencias de la Vida

Universidad de Alcalá (España)