2013-05-07 2 views
2

Я хотел бы поставить подкладку на набор ящиков, чтобы указать диапазон некоторых данных, взятых из отдельного источника, и в отдельный фрейм данных. Изготовление накладного легко; сделать подкладку трудно.geom_ribbon overlay, когда ось x дискретна

Представьте себе, для этих целей, что я пытаюсь подкладывать некоторые данные из mtcars на boxplot из diamonds данных:

# Find quantiles of mtcars$drat 
mQ <- quantile(mtcars$wt, c(0.025, 0.975)) 

# Place them in a data frame with factor limits of diamonds$cut 
mtcarsQ <- data.frame(x=c(min(as.numeric(diamonds$cut)), max(as.numeric(diamonds$cut))), ymin=rep(mQ[1], 2), ymax=rep(mQ[2], 2)) 

# Plot diamonds$cut, with overlay of quantiles from mtcars 
ggplot() + 
    geom_boxplot(data=diamonds, aes(x=cut, y=y)) + 
    geom_ribbon(data=mtcarsQ, aes(x=x, ymin=ymin, ymax=ymax), alpha=0.2)+ 
    coord_cartesian(ylim=c(0, 12)) 

enter image description here

Это работает отлично - за исключением того, что я (на самом деле: мой соавторы) хотели бы, чтобы geom_ribbon лежал под, а не над коробки. (Цвет ленты якобы препятствует цвету коробки). Когда я пытаюсь изменить порядок в геометрий, как так:

ggplot() + 
    geom_ribbon(data=mtcarsQ, aes(x=x, ymin=ymin, ymax=ymax), alpha=0.2)+ 
    geom_boxplot(data=diamonds, aes(x=cut, y=y)) 

Я получаю Error: Discrete value supplied to continuous scale, потому что ggplot не хочет отобразить фактор в непрерывной шкале.

Я мог бы попытаться сделать фактор числовой:

ggplot() + 
    geom_ribbon(data=mtcarsQ, aes(x=x, ymin=ymin, ymax=ymax), alpha=0.2)+ 
    geom_boxplot(data=diamonds, aes(x=as.numeric(cut), y=y)) 

Однако это изменение метки оси х. Я бы подумал, что я мог бы добавить метки осей назад следующим образом:

ggplot() + 
    geom_ribbon(data=mtcarsQ, aes(x=x, ymin=ymin, ymax=ymax), alpha=0.2)+ 
    geom_boxplot(data=diamonds, aes(x=as.numeric(cut), y=y, fill=cut, group=cut)) + 
    scale_x_discrete(labels=levels(diamonds$cut)) + 
    coord_cartesian(ylim=c(0, 12)) 

Но ось й выходит с дополнительными уровнями факторов по причинам, которые я не понимаю.

enter image description here

Есть более простой способ поставить прямоугольник под более boxplot, когда boxplot имеет дискретную ось х?

ответ

5

Наиболее общий способ заставить весы по умолчанию так, как вы хотите, чтобы это начиная с geom_blank, который определит масштабы, но не сделать ничего. Я считаю, что он предназначен именно для этой ситуации:

ggplot() + 
    geom_blank(data=diamonds, aes(x=cut, y=y)) + 
    geom_ribbon(data=mtcarsQ, aes(x=x, ymin=ymin, ymax=ymax), alpha=0.2)+ 
    geom_boxplot(data=diamonds, aes(x=cut, y=y, fill=cut, group=cut)) + 
    coord_cartesian(ylim=c(0, 12)) 

enter image description here

3

Наносите boxplot во второй раз:

ggplot() + 
geom_boxplot(data=diamonds, aes(x=cut, y=y, fill=cut, group=cut)) + 
geom_ribbon(data=mtcarsQ, aes(x=x, ymin=ymin, ymax=ymax), alpha=0.2)+ 
geom_boxplot(data=diamonds, aes(x=cut, y=y, fill=cut, group=cut)) + 
coord_cartesian(ylim=c(0, 12)) 

enter image description here

3

Ваше решение с принятием значения коэффициента как числовой будет работать, если вы используете scale_x_continuous(), а затем при условии не только labels=, но также breaks=.

ggplot() + 
    geom_ribbon(data=mtcarsQ, aes(x=x, ymin=ymin, ymax=ymax), alpha=0.2)+ 
    geom_boxplot(data=diamonds, aes(x=as.numeric(cut), y=y, fill=cut, group=cut)) + 
    scale_x_continuous(breaks=1:5,labels=levels(diamonds$cut)) + 
    coord_cartesian(ylim=c(0, 12)) 

enter image description here

Смежные вопросы