2014-01-23 1 views
0

У меня есть набор данных с этой структурой:ggplot - Добавить линию регрессии на boxplot с Binned (прерывистого) оси х

df<- data.frame (VPD.mean=rnorm(100,mean=2,sd=0.8), treatment=c("ambient","elevated"), variable=rnorm(100,mean=50,sd=10)) 
df$group <- with(df, as.factor (ifelse (VPD.mean>0 & VPD.mean<=1,"0-1",ifelse (
    VPD.mean>1 & VPD.mean<=1.5,"1-1.5",ifelse (
    VPD.mean >1.5 & VPD.mean<2, "1.5-2",ifelse (
     VPD.mean >=2 & VPD.mean<2.5, "2-2.5",ifelse (
     VPD.mean >=2.5 & VPD.mean <3,"2.5-3", ifelse(
      VPD.mean >=3,">3", NA) 
    ))))))) 
df$group<- factor(df$group,levels=c("0-1","1-1.5","1.5-2" ,"2-2.5","2.5-3",">3")) 

Я создал boxplot, используя группы, созданные после биннинга VPD.mean, и, следовательно, ось х не является непрерывным (смотри график ниже): enter image description here

Я хотел бы также добавить линию регрессии (гладкой), и, следовательно, я должен был бы использовать непрерывную переменную (VPD.mean) вместо биндинга (группы) в виде оси х. Результат не очень приятный, потому что гладкая линия не соответствует оси x графиков. Это код ggplot:

ggplot(df[!is.na(df$group),], aes(group,variable,fill=treatment)) + 
    geom_boxplot(outlier.size = 0) + geom_smooth(aes(x=VPD.mean)) 

Что решение построить geom_smooth от другой оси х на одном графике? Thanks

+2

По моему мнению, нецелесообразно составлять эти два разных вида сюжетов в один сюжет (если вообще возможно). Ваш сюжет будет казаться грязным. Поэтому лучше сделать два отдельных участка. – Jaap

ответ

0

Можно сделать то, что вы просите, но это потрясающе плохая идея.

set.seed(1) # for reproducible example 
df<- data.frame (VPD.mean=rnorm(100,mean=2,sd=0.8), treatment=c("ambient","elevated"), variable=rnorm(100,mean=50,sd=10)) 
df$group <- cut(df$VPD.mean, 
       breaks=c(0,seq(1,3,by=0.5),Inf), 
       labels=c("0-1","1-1.5","1.5-2","2-2.5","2.5-3",">3")) 
library(ggplot2) 
ggplot(df[!is.na(df$group),]) + 
    geom_boxplot(aes(x=factor(group),y=variable,fill=treatment), 
       position=position_dodge(.7),width=.8)+ 
    geom_smooth(aes(x=as.integer(group),y=variable,color=treatment,fill=treatment),method=loess) 

Это работает, более или менее, потому что ggplot использует фактор коды к оси х, а уровни фактора для меток осей. as.integer(group) возвращает кодовые коды. Если ваши корзины не имеют одинакового размера (а их нет, в вашем случае), сюжет может вводить в заблуждение.