es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

espacios no deseados en el eje x de un gráfico de histograma.

Quería crear un histograma con una serie de datos enteros. Debido a un rango amplio en el eje x, decidí utilizar una escala logarítmica para el eje x. Pero hay un espacio entre los números “1”, “2” y “3” en la gráfica. ¿Alguien podría ayudarme con la razón y decirme cómo eliminar estos espacios?

Aquí está mi código:

H1 <- as.data.frame(floor(runif(10000, min = 1, max = 100)))
colnames(H1) <- "H"
breaks <- c(1,2,3,4,5,6,7,8,9,10,100,500,1000,max((H1$H)))

ggplot (H1, aes(H)) + 
  geom_histogram(colour="darkgreen", size=1, fill="green", binwidth = 0.1) + 
  stat_bin(geom="text", aes(label=..count..) , hjust=-0.4, vjust = 0.4, binwidth = 0.1 , angle = 90, size = 2.5) + 
  scale_x_log10('Datos enteros', breaks = breaks, labels = breaks, expand = expansion(mult = c(0, 0.01))) +
  scale_y_continuous('Cantidad', expand = expansion(mult = c(0, 0.1))) +
  theme(axis.text.x = element_text(size = 8, angle = 60, vjust = 0.8, hjust=1))

Y este es el resultado:

Imagen

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón de los espacios entre los números “1”, “2” y “3” en el gráfico se debe a la escala logarítmica en el eje x. Los cortes especificados en el código están espaciados uniformemente en la escala logarítmica, lo que significa que hay un espacio más grande entre 1 y 2, y entre 2 y 3, que entre otros números enteros adyacentes.

    Para eliminar estos espacios, un enfoque podría ser especificar los cortes manualmente de manera que estén espaciados uniformemente en la escala lineal. Por ejemplo, podríamos usar los siguientes cortes:

    breaks <- c(seq(1, 10, by = 1), seq(20, 100, by = 10), seq(200, 1000, by = 100), seq(2000, 10000, by = 1000))
    

    Esto creará cortes en cada número entero entre 1 y 10, luego en cada 10 números enteros entre 20 y 100, luego en cada 100 números enteros entre 200 y 1000, y finalmente en cada 1000 números enteros entre 2000 y 10000.

    El código actualizado con estos cortes sería:

    H1 <- as.data.frame(floor(runif(10000, min = 1, max = 100)))
    colnames(H1) <- "H"
    breaks <- c(seq(1, 10, by = 1), seq(20, 100, by = 10), seq(200, 1000, by = 100), seq(2000, 10000, by = 1000))
    
    ggplot (H1, aes(H)) + 
      geom_histogram(colour="darkgreen", size=1, fill="green", binwidth = 0.1) + 
      stat_bin(geom="text", aes(label=..count..) , hjust=-0.4, vjust = 0.4, binwidth = 0.1 , angle = 90, size = 2.5) + 
      scale_x_log10('Datos Enteros', breaks = log10(breaks), labels = breaks, expand = expansion(mult = c(0, 0.01))) +
      scale_y_continuous('Recuento', expand = expansion(mult = c(0, 0.1))) +
      theme(axis.text.x = element_text(size = 8, angle = 60, vjust = 0.8, hjust=1))
    

    Esto debería producir un histograma con números enteros espaciados uniformemente en el eje x, sin espacios entre números enteros adyacentes.

Comments are closed.