¿Creando un histograma de densidad en ggplot2?
-
26-12-2019 - |
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)
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.
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())
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..))
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
.