Saltar al contenido

ggplot2: ¿cómo alinear las barras de un histograma con el eje x?

Solución:

¿Por qué las barras están “extrañamente alineadas”?

Permítanme comenzar explicando por qué su código conduce a barras extrañamente alineadas. Esto tiene que ver con la forma en que se construye un histograma. Primero, el eje x se divide en intervalos y luego, se cuenta el número de valores en cada intervalo.

Por defecto, ggplot divide los datos en 30 contenedores. Incluso escupe un mensaje que lo dice:

stat_bin() utilizando bins = 30. Elija un mejor valor con binwidth.

El número predeterminado de no siempre es una buena opción. En su caso, donde todos los puntos de datos son números enteros, es posible que desee elegir los límites de los contenedores como 5, 6, 7, 8, ... o 4.5, 5.5, 6.5, ..., de modo que cada contenedor contiene exactamente un valor entero. Puede obtener los límites de los contenedores que se han utilizado en el gráfico de la siguiente manera:

data <- data.frame(number = c(5, 10, 11 ,12, 12, 12, 13, 15, 15))
p <- ggplot(data, aes(x = number)) + geom_histogram()
ggplot_build(p)$data[[1]]$xmin
##  [1]  4.655172  5.000000  5.344828  5.689655  6.034483  6.379310  6.724138  7.068966  7.413793
## [10]  7.758621  8.103448  8.448276  8.793103  9.137931  9.482759  9.827586 10.172414 10.517241
## [19] 10.862069 11.206897 11.551724 11.896552 12.241379 12.586207 12.931034 13.275862 13.620690
## [28] 13.965517 14.310345 14.655172

Como puede ver, los límites de los contenedores no se eligen de una manera que conduzca a una buena alineación de las barras con los números enteros.

Entonces, en resumen, la razón de la extraña alineación es que ggplot simplemente usa un número predeterminado de 30 contenedores, lo que no es adecuado, en su caso, para tener barras que estén bien alineadas con números enteros.

Hay (al menos) dos formas de obtener barras bien alineadas que discutiré a continuación

Use un diagrama de barras en su lugar

Dado que tiene datos enteros, es posible que un histograma no sea la opción de visualización adecuada. En su lugar, podrías usar geom_bar(), que dará lugar a barras centradas en números enteros:

ggplot(data, aes(x = number)) + geom_bar() + scale_x_continuous(breaks = 1:16)

ingrese la descripción de la imagen aquí

Puede mover las barras a la derecha de los enteros sumando 0.5 para number:

ggplot(data, aes(x = number + 0.5)) + geom_bar() + scale_x_continuous(breaks = 1:16)

ingrese la descripción de la imagen aquí

Cree un histograma con los contenedores apropiados

Sin embargo, si desea usar un histograma, puede hacer que ggplot use bins más razonables de la siguiente manera:

ggplot(data, aes(x = number)) +
  geom_histogram(binwidth = 1, boundary = 0, closed = "left") +
  scale_x_continuous(breaks = 1:16)

ingrese la descripción de la imagen aquí

Con binwidth = 1, anula la opción predeterminada de 30 bins y requiere explícitamente que los bins tengan un ancho de 1. boundary = 0 asegura que el agrupamiento comience en un valor entero, que es lo que necesita, si desea que los enteros estén a la izquierda de las barras. (Si lo omite, los bins se eligen de manera que las barras estén centradas en números enteros).

El argumento closed = "left" es un poco más complicado de explicar. Como describí anteriormente, los límites de los contenedores ahora se eligen para ser 5, 6, 7, .... La pregunta ahora es, ¿en qué contenedor, por ejemplo, 6 debería estar? Podría ser el primero o el segundo. Esta es la elección que está controlada por closed: si lo configura en "right" (el valor predeterminado), los contenedores se cierran a la derecha, lo que significa que se incluirá el límite derecho del contenedor, mientras que el límite izquierdo pertenece al contenedor de la izquierda. Entonces, 6 estaría en el primer contenedor. Por otro lado, si eliges "left", el límite izquierdo será parte del contenedor y el 6 estará en el segundo contenedor.

Como desea que las barras estén a la izquierda de los enteros, debe elegir closed = "left".

Comparación de las dos soluciones

Si compara el histograma con el gráfico de barras, notará dos diferencias:

  • Hay un pequeño espacio entre las barras en el gráfico de barras, mientras se tocan en el histograma. Puede hacer que las barras se toquen en el primero usando geom_bar(width = 1).
  • La barra más a la derecha está entre 15 y 16 para el gráfico de barras, mientras que está entre 14 y 15 para el histograma. La razón es que mientras que para todos los contenedores solo el límite izquierdo es parte del contenedor, para el contenedor más a la derecha, ambos límites están incluidos.

Esto centrará la barra en el valor

data <- data.frame(number = c(5, 10, 11 ,12,12,12,13,15,15))
ggplot(data,aes(x = number)) + geom_histogram(binwidth = 0.5)

Aquí hay un truco con la etiqueta de verificación para alinear la barra a la izquierda. Pero si agrega otros datos, también debe cambiarlos

ggplot(data,aes(x = number)) + 
  geom_histogram(binwidth = 0.5) + 
  scale_x_continuous(
    breaks=seq(0.75,15.75,1), #show x-ticks align on the bar (0.25 before the value, half of the binwidth) 
    labels = 1:16 #change tick label to get the bar x-value
    )

otra opción: binwidth = 1, breaks=seq(0.5,15.5,1) (podría tener más sentido para integer)

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *