InicioGr谩ficosGr谩fico de puntos en R

Gr谩fico de puntos en R

Crea graficos de puntos en R

Un diagrama de puntos o gr谩fico de puntos es similar a un diagrama de dispersi贸n. La principal diferencia es que el gr谩fico de puntos en R muestra el 铆ndice (cada categor铆a) en el eje vertical y el valor correspondiente en el eje horizontal, por lo que puedes ver el valor de cada observaci贸n siguiendo una l铆nea horizontal desde la etiqueta correspondiente. El gr谩fico de puntos en R se puede utilizar como alternativa a los gr谩ficos de barras horizontales. Adem谩s, puedes etiquetar los puntos correspondientes en el eje vertical en diferentes grupos e incluso ordenarlos en funci贸n de alguna variable.

Ten en cuenta que hay varios tipos de gr谩ficos de puntos. En este tutorial mostraremos c贸mo crear dot plots de Cleveland y de Dumbbell.

La funci贸n dotchart

La funci贸n dotchart permite crear un diagrama de puntos de Cleveland en R. Considera el siguiente conjunto de datos, que representa las ventas esperadas y reales de una empresa para cada mes.

set.seed(1)

mes <- month.name
esperado <- c(15, 16, 20, 31, 11, 6,
              17, 22, 32, 12, 19, 20)
vendido <- c(8, 18, 12, 10, 41, 2,
          19, 26, 14, 16, 9, 13)
trimestre <- c(rep(1, 3), rep(2, 3), rep(3, 3), rep(4, 3))

datos <- data.frame(mes, esperado, vendido, trimestre)
datos
         mes esperado vendido trimestre
1    January       15      8       1
2   February       16     18       1
3      March       20     12       1
4      April       31     10       2
5        May       11     41       2
6       June        6      2       2
7       July       17     19       3
8     August       22     26       3
9  September       32     14       3
10   October       12     16       4
11  November       19      9       4
12  December       20     13       4

Puedes crear un gr谩fico de puntos en R de la variable vendido pas谩ndola a la funci贸n dotchart. Tambi茅n puedes etiquetar cada observaci贸n con el argumento labels y especificar argumentos adicionales, como el s铆mbolo, el tama帽o del s铆mbolo o el color del s铆mbolo con los argumentos, pch, bg y pt.cex, respectivamente.

dotchart(datos$vendido, labels = datos$mes, pch = 21, bg = "green", pt.cex = 1.5)
Gr谩fico de puntos simple

Gr谩fico de puntos por grupo en R

Si tienes una variable que clasifique los datos en grupos, puedes separar el gr谩fico de puntos en esos grupos, pas谩ndolos al argumento labels. Tambi茅n puedes especificar colores para cada grupo si as铆 lo deseas, especific谩ndolos en el argumento color.

# Grupos
colores <- numeric(4)
colores[trimestre == "1"] <- "red"
colores[trimestre == "2"] <- "blue"
colores[trimestre == "3"] <- "green"
colores[trimestre == "4"] <- "orange"

dotchart(datos$esperado, labels = datos$mes, pch = 19,
         pt.cex = 1.5, groups = rev(datos$trimestre), color = colores)
Gr谩fico de puntos con la funci贸n dotplot basado en grupos

Ordenar el gr谩fico de puntos por una variable

Adem谩s, puedes ordenar un dotchart en R por una variable si previamente ordenas los datos. Para ello puedes escribir:

x <- datos[order(datos$esperado), ] 

dotchart(x$esperado, labels = x$mes, pch = 19,
         xlim = range(x$esperado, x$vendido) + c(-2, 2),
         pt.cex = 1.5, color = colors, groups = rev(datos$trimestre))
Dotplot con la variable ordenada

Gr谩fico de dumbbell en R

A veces resulta interesante crear un gr谩fico de puntos con dos variables, que representen los valores m铆nimos y m谩ximos de algunos eventos o el cambio de algunas observaciones en el tiempo.

En nuestro ejemplo, podr铆a ser interesante representar las variables vendido y esperado juntas, para analizar la diferencia entre las ventas esperadas y las reales. Este tipo de gr谩ficos de puntos se conocen como gr谩ficos de Dumbbell.

dotchart(datos$sold, pch = 21, labels = datos$mes, bg = "green",
         pt.cex = 1.5, xlim = range(datos$esperado, datos$vendido) + c(-2, 2))
points(datos$esperado, 1:nrow(datos), col = "red", pch = 19, cex = 1.5)
Gr谩fico de puntos con m铆nimo y m谩ximo

Tambi茅n puedes agregar segmentos y textos para etiquetar los puntos de la siguiente manera:

dotchart(datos$vendido, labels = datos$mes, pch = 21, bg = "green",
         xlim = range(datos$esperado, datos$vendido) + c(-2, 2),
         pt.cex = 1.5)

points(datos$esperado, 1:nrow(datos), col = "red", pch = 19, cex = 1.5)

invisible(sapply(1:nrow(datos), function(i) {
  segments(min(datos$vendido[i], datos$esperado[i]), i,
           max(datos$vendido[i], datos$esperado[i]), i, lwd = 2)
  text(min(datos$sold[i], datos$esperado[i]) - 1.5, i,
       labels = min(datos$vendido[i], datos$esperado[i]))
  text(max(datos$vendido[i], datos$esperado[i]) + 1.5, i,
       labels = max(datos$vendido[i], datos$esperado[i]))
}))

points(datos$esperado, 1:nrow(datos), col = "red",
       pch = 19, cex = 1.5)
points(datos$vendido, 1:nrow(datos), col = "red",
       pch = 21, bg = "green", cex = 1.5)
Gr谩fico de puntos en R con la funci贸n dumbbell

Sin embargo, esto no es f谩cil de manejar y no se puede usar cuando especificas grupos. Como no existe ninguna alternativa gr谩fica en R que permita esta funcionalidad, hemos desarrollado la funci贸n dumbbell, que funciona con datos agrupados y no agrupados. Los argumentos permiten especificar si quieres agregar los segmentos, el texto, ambos o solo los puntos y adem谩s personalizar el diagrama a tu gusto con argumentos adicionales.

# v1: variable num茅rica
# v2: variable num茅rica
# group: vector (num茅rico o caracter) o factor que contenga grupos
# labels: etiquetas para el eje Y
# segments: a帽adir segmentos (TRUE) o no (FALSE)
# text: a帽adir textos (TRUE) o no (FALSE)
# pch: s铆mbolo
# col1: color de la variable v1. Si quieres
# a帽adir colores para grupos a帽谩delos aqu铆
# col1: color de la variable v2
# pt.cex: tama帽o de los puntos
# segcol: color de los segmentos
# lwd: ancho de los segmentos
# ... : argumentos adicionales para pasar a la funci贸n dotchart

dumbbell <- function(v1, v2, group = rep(1, length(v1)), labels = NULL,
                     segments = FALSE, text = FALSE, pch = 19,
                     colv1 = 1, colv2 = 1, pt.cex = 1, segcol = 1,
                     lwd = 1, ...) {

  o <- sort.list(as.numeric(group), decreasing = TRUE)
  group <- group[o]
  offset <- cumsum(c(0, diff(as.numeric(group)) != 0))
  y <- 1L:length(v1) + 2 * offset
  
  dotchart(v1, labels = labels, color = colv1, xlim = range(v1, v2) + c(-2, 2),
           groups = group, pch = pch, pt.cex = pt.cex)
  
  if(segments == TRUE) {
    for(i in 1:length(v1)) {
      segments(min(v2[i], v1[i]), y[i],
               max(v2[i], v1[i]), y[i],
               lwd = lwd, col = segcol) 
    }
  }
  
  for(i in 1:length(v1)){
    points(v2[i], y[i], pch = pch, cex = pt.cex, col = colv2)
    points(v1[i], y[i], pch = pch, cex = pt.cex, col = colv1)
  }
  
  if(text == TRUE) {
    for(i in 1:length(v1)) {
      text(min(v2[i ], v1[i]) - 1.5, y[i],
           labels = min(v2[i], v1[i]))
      text(max(v2[i], v1[i]) + 1.5, y[i],
           labels = max(v2[i], v1[i])) 
    }
  }
}

Con esta funci贸n puedes crear varias combinaciones. Considera el ejemplo donde quieres mostrar la comparaci贸n entre ventas reales (azul) y ventas esperadas (negro) para cada mes. Para ello podr铆as escribir lo siguiente:

dumbbell(v1 = datos$esperado, v2 = datos$vendido, text = FALSE,
         labels = datos$mes, segments = TRUE, pch = 19,
         pt.cex = 1.5, colv1 = 1, colv2 = "blue")
Salida de la funci贸n dumbbell en R

Ahora, si prefieres dividir los datos en grupos y tambi茅n agregar textos con cada valor, puedes escribir:

dumbbell(v1 = datos$esperado, v2 = datos$vendido, group = datos$trimestre,
         text = TRUE, labels = data$month, segments = TRUE, pch = 19,
         pt.cex = 1.5, colv1 = 1, colv2 = "blue")
Gr谩fico de Dumbbell por grupos

Adem谩s, si quieres agregar colores para cada grupo, puedes usar el argumento colv1.

dumbbell(v1 = datos$esperado, v2 = datos$vendido, group = datos$trimestre,
         text = TRUE, labels = datos$mes, segments = TRUE,
         pch = 19, pt.cex = 1.5, colv1 = colores)
Gr谩fico de puntos de Dumbbell coloreado por grupos

Finalmente, como hicimos en la secci贸n anterior, tambi茅n puedes ordenar los datos para alguna variable:

x <- datos[order(datos$esperado), ] 

dumbbell(v1 = x$esperado, v2 = x$vendido, group = datos$trimestre,
         text = TRUE, segcol = "gray", lwd = 3, labels = x$mes,
         segments = TRUE, pch = 19, pt.cex = 1.5, colv1 = 1, colv2 = "blue")
Gr谩fico de Dumbbell ordenado por una variable

N贸tese que los puntos negros est谩n ordenados en orden creciente.