varias superponer studio lineas histogramas graficos graficas r histogram logarithm

superponer - Histograma con escala logarítmica y saltos personalizados



superponer graficas en r (7)

Aquí hay una bonita solución de 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 interrupciones en geom_histogram, tuvieron que transformarse para funcionar con scale_x_log10

Intento generar un histograma en R con una escala logarítmica para y. Actualmente lo 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 diferencias de valores) que apenas puedes distinguir alguna de las otras barras.

Entonces 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 lo que quiero, pero la parte inferior me muestra los valores 1-6 en lugar de 0, 1, 2, 3, 4, 5, 25. También muestra los datos como puntos en lugar de barras. barplot funciona pero no obtengo ningún eje inferior.


Ejecute la función hist () sin hacer un gráfico, log-transform los recuentos, y luego dibuje la figura.

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

Debería verse exactamente como el histograma regular, pero el eje y será la frecuencia log2.


He creado una función que se comporta de manera idéntica a hist en el caso predeterminado, pero acepta el argumento de registro. Utiliza varios trucos de otros carteles, pero agrega algunos propios. 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) }

Ejercicio para el lector: Desafortunadamente, no todo lo que funciona con hist funciona con myhist tal como está. Sin embargo, eso debería ser reparable con un poco más de esfuerzo.


La respuesta de Dirk es genial. Si quieres una apariencia como lo que hist produce, también puedes 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, agrega 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 se puede omitir.

También paso los parámetros main , xlab y ylab para proporcionar un título de trazado, una etiqueta de eje x y una etiqueta de eje y.


No queda del todo claro a partir de su pregunta si desea un eje x registrado o un eje y registrado. Un eje y registrado no es una buena idea cuando se utilizan barras porque están ancladas en cero, que se convierte en infinito negativo cuando se registran. Puede solucionar este problema utilizando un polígono de frecuencia o un diagrama de densidad.


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

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


Un histograma es la estimación de densidad de un hombre pobre. Tenga en cuenta que en su llamada a hist() usando argumentos predeterminados, obtiene frecuencias, no probabilidades - add ,prob=TRUE a la llamada si quiere probabilidades.

En cuanto al problema del eje del registro, no use ''x'' si no desea que el eje x se transforme:

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

obtiene barras en una escala de log-y, la apariencia es un poco diferente, pero probablemente pueda modificarse.

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