studio - superponer graficas en r ggplot
Diferentes cortes por faceta en el histograma de ggplot2. (4)
Un latticista desafiado por ggplot2 necesita ayuda: ¿Cuál es la sintaxis para solicitar roturas variables por faceta en un histograma?
library(ggplot2)
d = data.frame(x=c(rnorm(100,10,0.1),rnorm(100,20,0.1)),par=rep(letters[1:2],each=100))
# Note: breaks have different length by par
breaks = list(a=seq(9,11,by=0.1),b=seq(19,21,by=0.2))
ggplot(d, aes(x=x) ) +
geom_histogram() + ### Here the ~breaks should be added
facet_wrap(~ par, scales="free")
Como señaló jucor , here algunas soluciones más.
A pedido especial, y para mostrar por qué no soy un gran fan de ggplot, la versión de lattice
library(lattice)
d = data.frame(x=c(rnorm(100,10,0.1),rnorm(100,20,0.1)),par=rep(letters[1:2],each=100))
# Note: breaks have different length by par
myBreaks = list(a=seq(8,12,by=0.1),b=seq(18,22,by=0.2))
histogram(~x|par,data=d,
panel = function(x,breaks,...){
# I don''t know of a generic way to get the
# grouping variable with histogram, so
# this is not very generic
par = levels(d$par)[which.packet()]
breaks = myBreaks[[par]]
panel.histogram(x,breaks=breaks,...)
},
breaks=NULL, # important to force per-panel compute
scales=list(x=list(relation="free")))
Aquí hay una alternativa:
hls <- mapply(function(x, b) geom_histogram(data = x, breaks = b),
dlply(d, .(par)), myBreaks)
ggplot(d, aes(x=x)) + hls + facet_wrap(~par, scales = "free_x")
Si necesita reducir el rango de x, entonces
hls <- mapply(function(x, b) {
rng <- range(x$x)
bb <- c(rng[1], b[rng[1] <= b & b <= rng[2]], rng[2])
geom_histogram(data = x, breaks = bb, colour = "white")
}, dlply(d, .(par)), myBreaks)
ggplot(d, aes(x=x)) + hls + facet_wrap(~par, scales = "free_x")
Estrictamente hablando, no es posible dar diferentes rupturas en las diferentes facetas. Pero puede obtener el mismo efecto al tener una capa diferente para cada faceta (como en la respuesta del usuario20650 ), pero en su mayoría automatizando las múltiples llamadas del geom_histogram
:
d <- data.frame(x=c(rnorm(100,10,0.1),rnorm(100,20,0.1)),
par=rep(letters[1:2],each=100))
breaks <- list(a=seq(9,11,by=0.1),b=seq(19,21,by=0.2))
ggplot(d, aes(x=x)) +
mapply(function(d, b) {geom_histogram(data=d, breaks=b)},
split(d, d$par), breaks) +
facet_wrap(~ par, scales="free_x")
La llamada mapply
crea una lista de geom_histogram
s que se pueden agregar a la trama. La parte difícil es que tiene que dividir manualmente los datos ( split(d, d$par)
) en los datos que entran en cada faceta.
No creo que sea posible dar diferentes puntos de quiebre en cada faceta.
Como solución alternativa, puede hacer dos gráficos y luego, con la función grid.arrange()
de la biblioteca gridExtra
, gridExtra
. Para establecer puntos de ruptura en geom_histogram()
use binwidth=
y establezca un valor para el ancho de bin.
p1<-ggplot(subset(d,par=="a"), aes(x=x) ) +
geom_histogram(binwidth=0.1) +
facet_wrap(~ par)
p2<-ggplot(subset(d,par=="b"), aes(x=x) ) +
geom_histogram(binwidth=0.2) +
facet_wrap(~ par)
library(gridExtra)
grid.arrange(p1,p2,ncol=2)
Siguiendo el ejemplo de Didzis:
ggplot(dat=d, aes(x=x, y=..ncount..)) +
geom_histogram(data = d[d$par == "a",], binwidth=0.1) +
geom_histogram(data = d[d$par == "b",], binwidth=0.01) +
facet_grid(.~ par, scales="free")
EDIT: esto funciona para más niveles pero, por supuesto, ya hay mejores soluciones
# More facets
d <- data.frame(x=c(rnorm(200,10,0.1),rnorm(200,20,0.1)),par=rep(letters[1:4],each=100))
# vector of binwidths same length as number of facets - need a nicer way to calculate these
my.width=c(0.5,0.25,0.1,0.01)
out<-lapply(1:length(my.width),function(.i) data.frame(par=levels(d$par)[.i],ggplot2:::bin(d$x[d$par==levels(d$par)[.i]],binwidth=my.width[.i])))
my.df<-do.call(rbind , out)
ggplot(my.df) + geom_histogram(aes(x, y = density, width = width), stat = "identity") + facet_wrap(~par,scales="free")
desde https://groups.google.com/forum/?fromgroups=#!searchin/ggplot2/bin $ 20histogram $ 20by $ 20facet / ggplot2 / xlqRIFPP-zE / CgfigIkgAAkJ