2016-12-17 3 views
0

Как бы преобразовать логический 'slope > 0' в цвет в более сложный условный?использовать ifelse в aes_string для строки цвета

Если наклон> 0, то красная линия. Если наклон == 0, то синяя линия. Если наклон < 0, то черная линия.

# setup 
library(dplyr) 
library(ggplot2) 
library(lazyeval) 
set.seed(205) 
dat = data.frame(t=rep(1:2, each=10), 
       pairs=rep(1:10,2), 
       value=rnorm(20)) 
dat$value[dat$pairs==1] <- 1 # forgot to set one pair to slope==0 


# function 
plotFun <- function(df, groupBy, dv, time) { 
    ggplot(df %>% group_by_(groupBy) %>% 
      mutate_(slope = interp(~(dv2[time2==2] - dv2[time2==1])/(2-1), 
            dv2=as.name(dv), 
            time2=as.name(time))), 
     aes_string(time, dv, group = groupBy, 
        colour = 'slope > 0')) + 
    scale_colour_manual(values=c("red", "black")) + 
    geom_point() + 
    geom_line() + 
    stat_summary(fun.y=mean,geom="line",lwd=2,aes(group=1)) 
} 

# plot 
plotFun(dat, "pairs", "value", "t") 
+1

Вы пробовали 'цвет =«IfElse (наклон> 0, "синий", IfElse (наклон == 0, "черный", "красный")) ') 'в отображении эстетики вместо' color =' slope> 0 ') 'и' + scale_color_identity() '? – lukeA

+0

Спасибо, @lukeA. Мне не хватало 'scale_color_identity()'. –

ответ

0

@ комментарий lukeA работал для меня:

# setup 
library(dplyr) 
library(ggplot2) 
library(lazyeval) 
set.seed(205) 
dat = data.frame(t=rep(1:2, each=10), 
       pairs=rep(1:10,2), 
       value=rnorm(20)) 
dat$value[dat$pairs==1] <- 1 # forgot to set one pair to slope==0 


# function 
plotFun <- function(df, groupBy, dv, time) { 
    ggplot(df %>% group_by_(groupBy) %>% 
      mutate_(slope = interp(~(dv2[time2==2] - dv2[time2==1])/(2-1), 
            dv2=as.name(dv), 
            time2=as.name(time))), 
     aes_string(time, dv, group = groupBy, 
        colour = ifelse(slope>0,"blue",   
          ifelse(slope==0,"black","red"))) + 
    scale_color_identity() + 
    geom_point() + 
    geom_line() + 
    stat_summary(fun.y=mean,geom="line",lwd=2,aes(group=1)) 
} 

# plot 
plotFun(dat, "pairs", "value", "t") 
0

Я не уверен, почему вы делаете отдельную функцию для этого. Я хотел бы сделать это, как этот

library(dplyr) 
library(ggplot2) 
#library(lazyeval) 
set.seed(205) 
dat = data.frame(t=rep(1:2, each=10), 
       pairs=rep(1:10,2), 
       value=rnorm(20)) 

dd <- dat %>% group_by(pairs) %>% mutate(sl=(value[t==2]-value[t==1])) 
dd <- as.data.frame(dd) 
ggplot(dd, aes(x=t, y=value, group=pairs)) + 
    geom_point() + 
    geom_line(aes(colour=ifelse(sl>0, "red", ifelse(sl==0,"blue", "black")))) + 
    theme(legend.title=element_blank()) 

я добавил один столбец для наклона, рассчитанный из значений, сгруппированные парами и использовал группу-метод в ggplot. Условие для цветов, которые я вложил в эстетику линии. Поскольку исходное название легенды слишком длинное из-за if-утверждений, я отключил его.

Надеюсь, что помогло.

+0

Извините, непонятый вопрос сначала, но интеграция предложения в вашу функцию также должна работать. – MarBlo

+0

Это тоже полезно. Благодарю. Иногда взломать его так, чтобы это помогло прояснить, что происходит. –