Различные разрывы на фасет в гистограмме ggplot2
Решающий вопрос ggplot2 нуждается в помощи: Какой синтаксис запрашивает переменные разрывы на фасет в гистограмме?
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")
Как отметил Юкор, здесь есть еще несколько решений.
По специальному запросу и чтобы показать, почему я не большой поклонник ggplot, 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")))
4 ответа
Вот одна альтернатива:
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")
Если вам нужно уменьшить диапазон х, то
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")
Я не думаю, что можно дать разные точки разрыва в каждом аспекте.
В качестве обходного пути вы можете сделать два участка, а затем с grid.arrange()
функция из библиотеки gridExtra
собрать их вместе. Чтобы установить точки останова в geom_histogram()
использование binwidth=
и установите одно значение для ширины бина.
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)
Следуя примеру Дидзиса:
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")
РЕДАКТИРОВАТЬ: Это работает для большего количества уровней, но, конечно, уже есть лучшие решения
# 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")
из https://groups.google.com/forum/?fromgroups=$20 гистограммы $20by$20facet/ggplot2/xlqRIFPP-zE/CgfigIkgAAkJ
Строго говоря, невозможно дать различные перерывы в разных аспектах. Но вы можете получить тот же эффект, имея различный слой для каждого аспекта (как в ответе пользователя 20650), но в основном автоматизируя множественные 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")
mapply
вызов создает список geom_histogram
с, которые могут быть добавлены к сюжету. Сложность в том, что вы должны вручную разделить данные (split(d, d$par)
) в данные, которые входят в каждый аспект.