Pregunta

Estoy intentando generar un histograma en R con una escala logarítmica para y. Actualmente hago:

hist(mydata$V3, breaks=c(0,1,2,3,4,5,25))

Esto me da un histograma, pero la densidad entre 0 y 1 es tan grande (alrededor de un millón de diferencia valores) que apenas se puede hacer ninguna de las otras barras.

A continuación, he intentado hacer:

mydata_hist <- hist(mydata$V3, breaks=c(0,1,2,3,4,5,25), plot=FALSE)
plot(rpd_hist$counts, log="xy", pch=20, col="blue")

Me da sorta lo que quiero, pero la parte inferior me muestra los valores 1-6 en lugar de 0, 1, 2, 3, 4, 5, 25. Es también muestran los datos como puntos en lugar de barras. obras barplot pero luego no reciben ningún eje inferior.

¿Fue útil?

Solución

Un histograma es una estimación de la densidad del hombre pobre. Cabe destacar que en su llamada a hist() usando los argumentos por defecto, se obtiene frecuencias no probabilidades - Añadir ,prob=TRUE a la llamada si desea probabilidades.

En cuanto al problema del eje de registro, no utilice 'x' si no desea que el eje x transformó:

plot(mydata_hist$count, log="y", type='h', lwd=10, lend=2)

Le permite obtener barras en una escala log-y -. El aspecto y la sensación es todavía un poco diferente, pero probablemente pueden ser ajustados

Por último, también se puede hacer hist(log(x), ...) para obtener un histograma del registro de los datos.

Otros consejos

Otra opción sería utilizar el ggplot2 paquete.

ggplot(mydata, aes(x = V3)) + geom_histogram() + scale_x_log10()

No está del todo claro por su pregunta si desea un conectado eje X o un eje y conectado. Un eje y conectado no es una buena idea cuando se utilizan barras, ya que están ancladas en cero, lo que se convierte en infinito negativo cuando está conectado. Puede solucionar este problema mediante el uso de un polígono de frecuencias o la densidad de trama.

La respuesta de Dirk es un grande. Si desea una apariencia semejante a lo que produce hist, también puede probar esto:

buckets <- c(0,1,2,3,4,5,25)
mydata_hist <- hist(mydata$V3, breaks=buckets, plot=FALSE)
bp <- barplot(mydata_hist$count, log="y", col="white", names.arg=buckets)
text(bp, mydata_hist$counts, labels=mydata_hist$counts, pos=1)

La última línea es opcional, se añade etiquetas de valor justo debajo de la parte superior de cada barra. Esto puede ser útil para gráficos de escala logarítmica, pero también puede ser omitido.

I también pasan main, xlab, y los parámetros ylab para proporcionar un título parcela, eje x etiqueta, y la etiqueta de eje y.

Ejecutar la hist () función sin hacer un gráfico, log-transformada de los recuentos, y luego dibujar la figura.

hist.data = hist(my.data, plot=F)
hist.data$counts = log(hist.data$counts, 2)
plot(hist.data)

Debe tener un aspecto como el histograma regular, pero el eje y será log2 frecuencia.

He creado una función que se comporta de forma idéntica a HIST en el caso por defecto, pero acepta el argumento de registro. Utiliza varios trucos de otros carteles, pero añade algunas de su propia. hist(x) y myhist(x) parecen idénticos.

El problema original se resolvería con:

myhist(mydata$V3, breaks=c(0,1,2,3,4,5,25), log="xy")

La función:

myhist <- function(x, ..., breaks="Sturges",
                   main = paste("Histogram of", xname),
                   xlab = xname,
                   ylab = "Frequency") {
  xname = paste(deparse(substitute(x), 500), collapse="\n")
  h = hist(x, breaks=breaks, plot=FALSE)
  plot(h$breaks, c(NA,h$counts), type='S', main=main,
       xlab=xlab, ylab=ylab, axes=FALSE, ...)
  axis(1)
  axis(2)
  lines(h$breaks, c(h$counts,NA), type='s')
  lines(h$breaks, c(NA,h$counts), type='h')
  lines(h$breaks, c(h$counts,NA), type='h')
  lines(h$breaks, rep(0,length(h$breaks)), type='S')
  invisible(h)
}

El ejercicio para el lector: Por desgracia, no todo lo que trabaja con hist trabaja con myhist tal como está. Eso debería ser corregible con un esfuerzo poco más, sin embargo.

Esto es una solución bastante ggplot2:

library(ggplot2)
library(scales)  # makes pretty labels on the x-axis

breaks=c(0,1,2,3,4,5,25)

ggplot(mydata,aes(x = V3)) + 
  geom_histogram(breaks = log10(breaks)) + 
  scale_x_log10(
    breaks = breaks,
    labels = scales::trans_format("log10", scales::math_format(10^.x))
  )

Tenga en cuenta que para establecer las roturas en geom_histogram, tuvieron que ser transformados para trabajar con scale_x_log10

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top