2013-12-04 6 views
1

У меня есть кадр данных со склонами и перехватами, исходящий из серии простых линейных регрессий. При построении графика abline s я хочу использовать цветовое кодирование, которое является специфическим для всех возможных комбинаций класса и категории.нарисовать несколько аблингов сразу с определенной цветовой схемой

Say кадр данных выглядит следующим образом:

(intercept <- rnorm(n = 40, mean = 1, sd = 0.25)) 
(slope  <- rnorm(n = 40, mean = 2, sd = 1)) 
(clss  <- c(rep("a", 20), rep("b", 20))) 
(ctg  <- c(rep("mm", 10), rep("nn", 10), rep("mm", 10), rep("nn", 10))) 
df   <- data.frame(intercept, slope, clss, ctg) 

мне удалось построить все abline с с помощью:

plot(1, type="n", axes=FALSE, xlab="", ylab="", xlim=c(0, 10), ylim=c(0, 10)) 
mapply(abline, df$intercept, df$slope) 

Я хочу, чтобы построить эти линии все говорят, зеленый, когда clss=="a" и ctg=="mm" и используйте разные цвета для других комбинаций clss * ctg. Возможно, что-то, как это будет работать:

by(df, paste(df$clss, df$ctg), mapply(abline, ...)) 

Но я не мог понять, каким образом.

ответ

1

Использование ggplot:

library(ggplot2) 
gg  <- df 
gg$color <- paste(gg$clss,".",gg$ctg,sep="") 
ggplot(gg) + 
    geom_point(aes(x=-10,y=-10,color=color)) + # need this to display a legend... 
    geom_abline(aes(slope=slope, intercept=intercept, color=color)) + 
    xlim(0,10) + ylim(0,10) + labs(x="X",y="Y") 

Производит это :

1

Оказывается, в вашем случае у вас есть только 4 уникальных clss и ctg комбинации, так что я просто взял некоторые случайные цвета и редактировали mapply

# get colour for each combination 
x <- sample(colours(), length(unique(paste0(df$clss, df$ctg)))) 
# how many of each combination are there 
q <- aggregate(df$intercept, by=list(paste0(df$clss, df$ctg)), length) 
# make a colour vector 
mycols <- rep(x, q[,2]) 


mapply(function(x,y,z) { abline(x, y, col=z) }, 
     df$intercept, df$slope, 
     as.list(mycols)) 

#You could obviously pick the colours yourself or choose a gradient 
Смежные вопросы