Pregunta

Quiero crear el siguiente gráfico de densidad de histograma con ggplot2.De la forma "normal" (paquetes base) es realmente fácil:

set.seed(46)
vector <- rnorm(500)  
breaks <- quantile(vector,seq(0,1,by=0.1))
labels = 1:(length(breaks)-1)
den = density(vector)
hist(df$vector,
     breaks=breaks,
     col=rainbow(length(breaks)),
     probability=TRUE)
lines(den)

enter image description here

Con ggplot he llegado a esto hasta ahora:

seg <- cut(vector,breaks,
           labels=labels,
           include.lowest = TRUE, right = TRUE)
df = data.frame(vector=vector,seg=seg)

ggplot(df) + 
     geom_histogram(breaks=breaks,
                    aes(x=vector,
                        y=..density..,
                        fill=seg)) + 
     geom_density(aes(x=vector,
                      y=..density..))

Pero la escala "y" tiene la dimensión incorrecta.He notado que la siguiente ejecución obtiene la escala "y" correcta.

 ggplot(df) + 
     geom_histogram(breaks=breaks,
                    aes(x=vector,
                    y=..density..,
                    fill=seg)) + 
     geom_density(aes(x=vector,
                      y=..density..))

Simplemente no lo entiendo. y=..density.. está ahí, esa debería ser la altura.Entonces, ¿por qué mi escala se modifica cuando intento llenarla?

Necesito los colores.Solo quiero un histograma donde los saltos y los colores de cada bloque se establezcan direccionalmente de acuerdo con los colores de relleno predeterminados de ggplot.

¿Fue útil?

Solución

Manualmente, agregué los colores a tus barras de percentil.A ver si esto funciona para ti.

library(ggplot2)

ggplot(df, aes(x=vector)) +   
   geom_histogram(breaks=breaks,aes(y=..density..),colour="black",fill=c("red","orange","yellow","lightgreen","green","darkgreen","blue","darkblue","purple","pink")) + 
   geom_density(aes(y=..density..)) +
   scale_x_continuous(breaks=c(-3,-2,-1,0,1,2,3)) +
   ylab("Density") + xlab("df$vector") + ggtitle("Histogram of df$vector") +
   theme_bw() + theme(plot.title=element_text(size=20),
                      axis.title.y=element_text(size = 16, vjust=+0.2),
                      axis.title.x=element_text(size = 16, vjust=-0.2),
                      axis.text.y=element_text(size = 14),
                      axis.text.x=element_text(size = 14),
                      panel.grid.major = element_blank(),
                      panel.grid.minor = element_blank())

ingrese la descripción de la imagen aquí

Otros consejos

fill=seg da como resultado la agrupación.En realidad, obtienes un histograma diferente para cada valor de seg.Si no necesitas los colores, puedes usar esto:

ggplot(df) + 
  geom_histogram(breaks=breaks,aes(x=vector,y=..density..), position="identity") + 
  geom_density(aes(x=vector,y=..density..))

enter image description here

Si necesita los colores, puede que sea más fácil calcular los valores de densidad fuera de ggplot2.

La confusión a la hora de interpretar el y-axis podría deberse a que la densidad se traza en lugar de contarse.Entonces, los valores en el y-axis son proporciones de la muestra total, donde la suma de las barras es igual a 1.

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