2015-02-26 3 views
2

Вот мои данные и мой текущий участокЗамена точек цвета, однородной цветной поверхности

require(ggplot2) 
a = rep(c(2,5,10,15,20,30,40,50,75,100), each=7) 
b = rep(c(0.001,0.005,0.01,0.05,0.5,5,50), 10) 
c = c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE) 
dt = data.frame(a=a,b=b,c=c) 
ggplot(dt, aes(x=a, y=b, color=c)) + geom_point() + scale_y_log10() 

enter image description here

Вместо вышеуказанных синих и оранжевых точек, я хотел бы, фон должен быть окрашен в синий и оранжевый. Граница может быть либо прямыми, либо линией LOESS, либо тем, что проще реализовать (какая-то гладкая линия будет более интересной, я думаю)! Для меня это звучит как сложная проблема. Я приветствую варианты решения, которые я задал, пока он выглядит хорошо!

Можете ли вы мне помочь? Спасибо.

ответ

2

Вы могли бы попробовать это, идея состоит в том, чтобы найти точки для каждой группы, которая была бы при разделении этих двух регионов, а затем взять на середину этих двух точек и получить лесс линии как границы:

library(dplyr) 
#make column c numeric and order the dataframe 
dt$c<-dt$c*1 
dt<-dt[order(a,c),] 

#get all the points that are where the change of "region" happens 
#here it is where the c variable switches from 0 to 1, since dt is ordered 
#by a and c, you can just find the first 1 and take that point and the one 
#before 

get_group_change<-function(x){ 
    idx<-min(which(x[,"c"]==1)) 
    x[c(idx-1,idx),] 
} 

boundary_points<-dt %>% group_by(a) %>% do(get_group_change(.)) 

#get the point in the middle of the boundary points 
get_middle<-function(x){exp(mean(log(x)))} 

middle_points<-boundary_points %>% group_by(a) %>% summarise_each(funs(get_middle),a,b) 
middle_points$c<-2 

#make a boundary data frame with a LOESS prediction for b 
boundary<-data.frame(a=2:100,b=exp(predict(loess(log(b)~a,middle_points),2:100)),c=2) 


#plot the regions, the middle_points are also plotted 
ggplot(rbind(dt,middle_points), aes(x=a, y=b, color=as.factor(c))) + geom_point() + scale_y_log10()+ 
    geom_ribbon(data=boundary,aes(ymin=min(dt$b),ymax=b),alpha=0.1,fill="red",colour=NA)+ 
    geom_ribbon(data=boundary,aes(ymin=b,ymax=max(dt$b)),alpha=0.1,fill="green",colour=NA) 

я получаю что-то вроде этого:

enter image description here

Или с прямыми линиями на границе:

ggplot(rbind(dt,middle_points), aes(x=a, y=b, color=as.factor(c))) + geom_point() + scale_y_log10()+ 
    geom_ribbon(data=middle_points,aes(ymin=min(dt$b),ymax=b),alpha=0.1,fill="red",colour=NA)+ 
    geom_ribbon(data=middle_points,aes(ymin=b,ymax=max(dt$b)),alpha=0.1,fill="green",colour=NA) 

enter image description here

не будет ли это возможно, если точки не имеют дискретную b ...

+0

Это выглядит здорово. Большое спасибо! Однако это не работает для меня. Не требуется строка 'require (dplyr)'. Я не могу найти определение 'm'. 'get_group_change' не используется, но используется' getChange'. Я полагаю, что они должны быть той же самой функцией. –

+0

сожалею об этом, я изменил некоторые имена функций, чтобы сделать его чище, но пропустил эти два, я отредактировал, должен быть исправлен – NicE

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