Fecha de la última revisión

## [1] "2023-08-22"

Gráficos de puntos con geom_dotplot

# Es necesario instalar los siguienntes paquetes:

library(ggversa) # la función "library" activa el paquete de **ggversa** donde se encuentra los archivos de datos
library(ggplot2) # ggplot2 es la librería que se usará para visualizar los datos
library(tidyverse) # una serie de paquetes para organizar y visualizar los datos
library(gt) # Un paquete para que las tablas se vean más organizada. 
library(gridExtra) # Un paquete para organizar las figuras de ggplot2

# Mostrar las primeros 6 filas con la función *head*
gt(head(dipodium)) 
Tree Number Tree species DBH Plant number Ramet number Distance Orientation Number_of_Flowers Height_Inflo Herbivory RowPosition_NF Number_Flowers_position Number_of_fruits Perc_FR_set pardalinum_or_roseum Fruit_position_effect Frutos_si_o_no P_or_R_Infl_Lenght Num of fruits Species_Name Cardinal orientation
1 E.o 75 1 1 2.47 40 11 35 n 1 24 0 0.00 r 1 0 r 0 r 1
1 E.o 76 2 1 1.97 50 19 47 n 2 23 0 0.00 r 2 0 r 0 r 2
2 E.o 76 3 1 1.95 350 18 63 n 3 25 1 0.04 r 3 0 r 1 r 8
3 E.o 58 4 1 3.24 210 24 47 n 4 20 5 0.25 r 4 0 r 5 r 5
4 E.o NA 5 1 0.85 80 25 61 n 5 13 0 0.00 r 5 0 r 0 r 2
5 E.o 59 6 1 2.62 160 17 35 n 6 25 2 0.08 p 6 0 r 2 p 4

Gráfico para una variable discreta

Los gráficos de una variable frecuentemente tienen como objetivo evaluar la dispersión de un conjunto de datos. Estos datos pueden ser continuos (por ejemplo, medidas de largo o ancho, conteos) o discretos (agrupados por categoría). A continuación se demuestra la producción de gráficos cuando la variable es discreta al representar el número de frutos. (Los casos en que la variable es continua se explica en detalle como un tópico aparte de visualización.)

Gráficos de puntos Wilkinson

En el gráfico de puntos, conocido como Wilkinson dotplot, la posición de los compartimentos (bins), depende de los datos, mientras que la concentración de los puntos determina el ancho máximo de los compartimentos. De forma predeterminada los datos serán agrupados uno por encima de los otros en el eje de Y. Ese gráfico se hace con la función con geom_dotplot. Esto se demuestra en el gráfico Figura: Gráfico básico de puntos Wilkinson que utiliza los datos de la orquídea dipodium del archivo de ggversa. Note que se podría haber usado geom_dotplot sin parámetros adicionales y los puntos quedarían representados de color negro. El parámetro fill cambia el color de los puntos y el parámetro colour o color cambia el color de la línea que rodea los puntos.


a=ggplot(dipodium, aes(Number_of_fruits))

a+geom_dotplot(fill="blue", colour="yellow",
                stackratio=.5) +
  labs(x="Número de Frutos", y="Frecuencia")+
  theme(axis.title=element_text(size=10,face="bold"))+
  labs(title="Figura: Gráfico básico de puntos Wilkinson")


Definir la posición de los puntos

Podemos definir la posición de los puntos en el eje de Y con la opción stackdir y los parámetros. Por ejemplo, se pueden centrar los puntos al eje de Y como se muestra en la Figura.a: Con puntos centrados al eje de Y (en rojo). Como se puede apreciar, para especificar la dirección en que se quieren ubicar los puntos, se indica que los puntos comiencen al centro con el parámetro center. Si se desea que se desplieguen alineados justo al centro, con centerwhole (Figura.b: Alineas justo al centro, en azul); si desde abajo, con up (Figura.c: Puntos desplegados desde arriba, en anaranjado); y desde arriba, con down (Figura.d: Puntos desplegados desde arriba, en negro). OJO: No se ve claramente la diferencia entre parámetro center y parámetro centerwhole o algo no está bien explicado.

# práctica cambiando stackdir con los parámetros center, centerwhole, up, down:

a=ggplot(dipodium, aes(Number_of_fruits))
a=a+geom_dotplot(fill="red", colour="black",
                stackdir="center", stackratio = 0.5) + 
  labs(x="Número de Frutos", y="Frecuencia")+
  theme(axis.title=element_text(size=10,face="bold"))+
  labs(title="Figura.a: Con puntos centrados al eje de Y")+
  theme(title=element_text(size=8))

b=ggplot(dipodium, aes(Number_of_fruits))
b=b+geom_dotplot(fill="blue", colour="black",
                stackdir="centerwhole", stackratio = 0.5) + 
  labs(x="Número de Frutos", y="Frecuencia")+
  theme(axis.title=element_text(size=10,face="bold"))+
  labs(title="Figura.b: Alineados justo al centro")+
  theme(title=element_text(size=8))

c=ggplot(dipodium, aes(Number_of_fruits))
c=c+geom_dotplot(fill="orange", colour="black",
                stackdir="up", stackratio = 0.5) + 
  labs(x="Número de Frutos", y="Frecuencia")+
  theme(axis.title=element_text(size=10,face="bold"))+
  labs(title="Figura.c: Puntos desplegados desde abajo")+
  theme(title=element_text(size=8))

d=ggplot(dipodium, aes(Number_of_fruits))
d=d+geom_dotplot(fill="black", colour="white",
                stackdir="down", stackratio = 0.5) + 
  labs(x="Número de Frutos", y="Frecuencia")+
  theme(axis.title=element_text(size=10,face="bold"))+
  labs(title="Figura.d: Puntos desplegados desde arriba")+
  theme(title=element_text(size=8))

Modificar la estética del gráfico

A continuación se demostrará cómo modificar algunas características del gráfico geom_dotplot; por ejemplo, el tamaño y color de los puntos, y la intensidad del color. (NOTE: Cuando se utilicen otras funciones tipo geom_, muchas de las opciones explicadas a continuación pueden ser viables y aplicables.)

Se cambia el tamaño de los puntos con dotsize, a la vez que se cambia la orientación de los datos como se muestra en la Figura.a: Dotplot con puntos más grandes. Por otro lado, en la Figura.b: Dotplot con puntos más pequeños y menos intensos se cambia la intensidad del color usando alpha (0.5 en este caso). Esa opción tiene un rango de 0 (color pálido) a 1 (color intenso); en otras palabras, cuando se usan valores altos, resulta en mayor intensidad el color en la opción fill (color rojo en este caso), y cuando se usan valores bajos la intensidad del color es más tenue. Note que en los dos gráficos se cambia el stackratio, que es la proporción de solapamiento de puntos.

a=ggplot(dipodium, aes(Number_of_fruits))+
  geom_dotplot(fill="blue", colour="black",
               dotsize=3, stackdir="center",  stackratio = 0.2) +
  labs(x="Especie de orquídea", y="Frecuencia")+
  theme(axis.title=element_text(size=10,face="bold"))+
  labs(title= "Figura.a: Dotplot con puntos más grandes
       ")+
  theme(title=element_text(size=8))


b=ggplot(dipodium, aes(Number_of_fruits))+
  geom_dotplot(fill="red", colour="black",
               dotsize=1, stackdir="center",  alpha=.5, stackratio = 0.7) +
  labs(x="Especie de orquídea", y="Frecuencia")+
  theme(axis.title=element_text(size=10,face="bold"))+
  labs(title= "Figura.b: Dotplot con puntos más pequeños
               y menos intensos")+
  theme(title=element_text(size=8))


Controlar solapamiento de puntos

La opción de stackratio es para especificar el grado de solapamiento de los puntos uno sobre el otro, o el espacio que separa cada punto. A la figura anteriormente, ahora se le añade un solapamiento diferente. Además, para que los puntos no se solapen unos con otros se usa la función position=dodge. Si quiere modificar el solapamiento tiene que usar position=position_dodge(width = 0.1) para identificar la cantidad de solapamiento de los grupos, más pequeño el número más solapamiento entre los grupos

a=ggplot(dipodium, aes(Number_of_fruits, fill=Species_Name))+
  geom_dotplot(binwidth = .3, stackratio = .7, position = "dodge") +
  labs(x="Número de Frutos", y="Frecuencia")+
  theme(axis.title=element_text(size=10,face="bold"))+
  theme(legend.position = "none")


b=ggplot(dipodium, aes(Number_of_fruits, fill=Species_Name))+
geom_dotplot(binwidth = .3, stackratio = .7, position=position_dodge(width = 0.7)) +
  labs(x="Número de Frutos", y="Frecuencia")+
  theme(axis.title=element_text(size=10,face="bold"))+
  theme(legend.position = "none")


Cómo apilar los puntos

Ahora veremos cómo ubicar los puntos uno encima de los otros o sea apilar los puntos pero que a la misma vez la cantidad de puntos cambie de acuerdo al grupo. Continuaremos con el ejemplo anterior de las orquídeas Dipodium. En la Figura se usa la opción stackgroups en combinación con binwidth y method para lograr ese efecto, tal como se muestra a continuación:

a=ggplot(dipodium, aes(Number_of_fruits, fill=Species_Name))
a+geom_dotplot(stackgroups = TRUE, binwidth = .5, method = "histodot", stackratio = 0.5) +
  labs(x="Número de Frutos", y="Frecuencia")+
  theme(axis.title=element_text(size=10,face="bold"))


Definir ancho de compartimentos

El ancho de los compartimentos (o puntos en nuestro caso) es por defecto 1/30 el rango de los datos. Eso se puede cambiar utilizando la opción binwidth (binwidth o sea el ancho del compartimento). Cuando el método (o sea, si se especifica la opción method) para representar los puntos es la densidad de puntos (opción dotdensity), entonces binwidth es el máximo del ancho de compartimiento. Alternativamente, cuando el método se específica como histodot, el binwidth organizará los puntos a una distancia fija de los compartimiento. A continuación, se demuestra la opción por densidad de puntos (así es por omisión) y con un ancho de 2 y de 1 por punto. Para este caso, las categorías están agrupadas por unidades de 2; las plantas con 0 y 1 fruto, con 2 y 3 frutos y así subsiguientemente. Además, se cambió el tamaño de los puntos con dotsize a 0.1.

a=ggplot(dipodium, aes(Number_of_fruits))+
  geom_dotplot(binwidth = 2, dotsize=0.1) +
  labs(x="Número de Frutos", y="Frecuencia")+
  theme(axis.title=element_text(size=10,face="bold"))


b=ggplot(dipodium, aes(Number_of_fruits))+
  geom_dotplot(binwidth = 1, dotsize=0.1) +
  labs(x="Número de Frutos", y="Frecuencia")+
  theme(axis.title=element_text(size=10,face="bold"))


Alternativa para apilar los puntos

Otra alternativa para lograr la misma representación de poner los puntos uno encima de los otros por grupo es utilizar la opción binpositions con el parámetro all, como se muestra en la Figura: Con los puntos apilados.

a=ggplot(dipodium, aes(Number_of_fruits, fill=Species_Name))
a+geom_dotplot(stackgroups = TRUE, binwidth = .5, binpositions = "all", dotsize = .5) +
  labs(x="Número de Frutos", y="Frecuencia")+
  theme(axis.title=element_text(size=10,face="bold"))+
  labs(title="Figura: Con los puntos apilados")


Remover los NA con drop_na

Cuando hay un grupo no indentificado típicamente se usa NA en la el archivo para identifica la falta de información. En otros programas por ejemplo se usa el 999. En este archivo se identificó dos especie de orquídea, Dipodium roseum y Dipodium pardalinum y hubo ocasiones que no se podia asignar la información una especies especifica (ya que se parecen mucho morfologicamente). Entonces, se identificó como NA en el gráfico (la columna de puntos de la derecha). Normalmente uno no va a querer mostrar esos datos al menos que haya una razón para ello. Esos datos se pueden remover utilizando una opción de excluir datos innecesarios del archivo antes de generar el gráfico. Con las funciones en drop_na del paquete tidyr uno puede remover las variables que tienen NA. Se aprovecha y se usa también la opción binaxis para agrupar los datos en el eje de X o el eje de Y; en este ejemplo se agruparon los puntos en el eje de Y como se muestra a continuación, pero centrados los puntos de acuerdo a su especie:

conNA=dipodium%>%
  dplyr::select(Species_Name, Number_of_fruits)%>%
  ggplot(aes(Species_Name, Number_of_fruits, fill=Species_Name))+
geom_dotplot(dotsize=.5, stackdir="center", alpha=.5, binaxis = "y") +
  labs(x="Especie de orquídea", y="Número de frutos")+
  theme(axis.title=element_text(size=10,face="bold"))+
  theme(legend.position = "none")


sinNA=dipodium%>%
  dplyr::select(Species_Name, Number_of_fruits)%>%
  drop_na()%>%
  ggplot(aes(Species_Name, Number_of_fruits, fill=Species_Name))+
geom_dotplot(dotsize=.5, stackdir="center", alpha=.9, binaxis = "y") +
  labs(x="Especie de orquídea", y="Número de frutos")+
  theme(axis.title=element_text(size=10,face="bold"))+
  theme(legend.position = "none")


Opciones y parámetros de geom_dotplot

A continuación se resumen las opciones y parámetros más importantes de geom_dotplot:

  • ggplot(el archivo de datos, aes(la variable continua))
  • geom_dotplot (x, y, alpha, color, fill, na.rm, binwidth, binaxis, method, binposition, stackdir, stackratio, dotsize, stackgroup)
    • alpha: la intensidad del color
    • fill: el color de los puntos
    • color: el color de la línea alrededor (en este caso alrededor de los puntos)
    • na.rm: remueve los datos NA con una advertencia, el valor predeterminado es {FALSE}; si se define como {TRUE}, los remueve sin advertencia
    • binwidth: el ancho de los compartimentos donde por omisión el rango es de 1/30 el rango de los datos
    • binaxis: determina si se agrupa en el eje de {X} (de forma predeterminada) o en el eje de {Y}
    • method: el método predeterminado es {dotdensity}, donde los {bins} estarán organizados por la densidad de los puntos; cuando es {histodot}, estarán organizados por una distancia fija de los {bins}
    • binposition: cuando {method} es {dotdensity}, {bygroup} (el predeterminado) posiciona los grupos {bins} por separado; cuando el {method} es {all}, determina las posiciones de los bins con todos los datos sin tomar en cuenta los diferentes grupos a que pertenecen los datos; este último parámetro se usa cuando hay más de un grupo.
    • stackdir: determina en qué dirección se apilan los puntos; para arriba es {up} (predeterminado), para abajo es {down}, para el centro es {center}, y en el centro con los puntos alineados es {centerwhole}
    • stackratio: determina cuán cercano se amplían los datos; el predeterminado es 1, donde los puntos apenas se tocan; si se quieren más cercanos, se usa un número más pequeño; si se quieren más separados, se usa un número más grande
    • dotsize: el tamaño de los puntos relativo al {binwidth}; el valor predeterminado es 1
    • stackgroup: determina si los puntos deberían estar apilados en una variable de grupo.