Histogramas con etiquetas de frecuencias

Este sencillo post nace de una pregunta que fue hecha en Stackoverflow. En su momento me pareció interesante para mostrar el uso de ... dentro la definición de nuevas funciones que sólo requieren fijar un par de parámetros y mantener la funcionalidad del resto, en este caso se redefine la función hist, utilizada para estimar y dibujar histogramas, que a partir de ella se crea histL que en esencia hace lo mismo pero adicionalmente crea y pinta las etiquetas (labels) de los conteos de frecuencia o probabilidad, según sea el caso, sobre cada barra del histograma, algo así parecido a lo que hace SPSS, pero sin encasillarlas dentro de cuadros. El nombre histL es debido a que se hacen histogramas con Labels.

Para resumir (lo que ya era corto), histL estima un histograma a partir de datos tal y cual lo hace hist, la diferencia es que esta nueva función añade etiquetas sobre cada barra que indica el conteo o la frecuencia asociada a esa barra particular, se imprime un indicador por cada barra del histograma. Todos los demás parámetros de la función hist son aplicables a histL de manera que la documentación de R disponible para hist también es válida para histL esto es cierto porque los parámetros son pasados a través del operator ... como se muestra a continuación.

Definición de la función histL

# ============================================================================
# Nombre : histL
# Autor : J. Urbina
# Version : 0.01
# Descripción : Histogramas con etiquetas de frecuencias/probabilidades
# ============================================================================


histL <- function(x, ylim = NULL, freq = TRUE, ...) {

    y <- hist(x, plot = FALSE)

    if (freq == TRUE) {
        z <- y$counts
    } else {
        z <- y$density
    }

    if (is.null(ylim)) {
        ylim <- c(0, max(z) + ifelse(is.integer(z), 3, 0.1))
    }


    plot(y, ylim = ylim, freq = freq, ...)
    # parámetros perdeterminados más `...` para aprovechar la funcionalidad ya
    # implementada de `hist` a través de `plot.histogram`

    text(y$mids, z + ifelse(is.integer(z), 1, 0.03), z, cex = 0.75)

}

Ejemplos

Algunos ejemplos que muestran que se pueden pasar todos los argumentos de hist a histL.

# Generando una muestra pseudo-aleatoria a partir de una normal estándar
set.seed(1)
x <- rnorm(100)
# Simple
hist(x)  # sin etiquetas  

plot of chunk unnamed-chunk-2

histL(x)  # con etiquetas

plot of chunk unnamed-chunk-2


# se pueden usar todos los demás argumentos tal cual si fuera `hist`
histL(x, main = "Histograma de x con título")

plot of chunk unnamed-chunk-2


hist(x, freq = FALSE)  # histograma de la densidad de probabilidades sin etiquetas

plot of chunk unnamed-chunk-2

histL(x, freq = FALSE)  # histograma de la densidad de probabilidades con etiquetas

plot of chunk unnamed-chunk-2


histL(x, freq = FALSE, main = "Histograma con líndea de densidad \n título en cursiva", 
    cex.main = 1.25, font.main = 3, xlab = "", las = 1, cex.axis = 0.8)
lines(density(x), col = "red")

plot of chunk unnamed-chunk-2

No hay comentarios:

Publicar un comentario