2013-11-11 4 views
3

Мой вопрос тесно связан с R: Custom Legend for Multiple Layer ggplot, а также с Format legend for multiple layers ggplot2 именно: Я хочу создать пользовательские легенды для многослойного сюжета. Однако есть небольшая разница: В исходных вопросах желаемый эффект заключался в том, чтобы отделить два разных метода группировки: fill и color, и именно поэтому можно было использовать две различные функции scale_XXX. В моем случае я создаю график , который содержит точки (один слой) и линии (второй слой). Оба слоя различаются по цвету:Контроль над легендами многослойного участка в ggplot2

x <- seq(0, 10, .1) 
y <- sin(x) 
lbl <- ifelse(y > 0, 'positive', 'non-positive') 
data.one <- data.frame(x=x, y=y, lbl=lbl) 

data.two <- data.frame(x=c(0, 10, 0, 10), y=c(-0.5, -0.5, 0.5, 0.5), classification=c('low', 'low', 'high', 'high')) 
plt <- ggplot(data.one) + geom_point(aes(x, y, color=lbl)) + scale_color_discrete(name='one', guide='legend') 
plt <- plt + geom_line(data=data.two, aes(x, y, color=classification)) + scale_color_discrete(name='two', guide='legend') 
print(plt) 

Вот результат:

before

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

after

Я не мог найти способ принять подход цитируемых вопросы к моей ситуации , Есть идеи?

+1

Вы можете взглянуть на [этот пост и комментарии в нем] (http://stackoverflow.com/questions/17642190/how-to-set-multiple-legends-for-the-same-aesthetic-in-ggplot2), например «ggplot2 по дизайну не допустит нескольких легенд для одной и той же эстетики». Таким образом, решения, вероятно, будут хакерскими. – Henrik

ответ

5

Следующий взломан. Он извлекает легенды из временных сюжетов, а затем объединяет все, используя grid.arrange.

g_legend<-function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    return(legend)} 

n <- 4; cols <- hcl(h=seq(15, 375-360/n, length=n)%%360, c=100, l=65) 

cols1 <- cols[4:3] 
names(cols1) <- c("positive", "non-positive") 
plt_1 <- ggplot(data.one) + 
    geom_point(data=data.one,aes(x, y, color=lbl)) + 
    scale_color_manual(values=cols1) 


cols2 <- cols[1:2] 
names(cols2) <- c("high", "low") 
plt_2 <- ggplot(data.one) + 
    geom_line(data=data.two, aes(x, y, color=classification)) + 
    scale_color_manual(values=cols2) 


mylegend_1<-g_legend(plt_1) 
mylegend_2<-g_legend(plt_2) 

plt <- ggplot(data.one) + 
    geom_point(data=data.one,aes(x, y, color=lbl)) + 
    geom_line(data=data.two, aes(x, y, color=classification)) + 
    scale_color_discrete(guide="none") 

library(gridExtra) 
grid.arrange(plt, 
      arrangeGrob(mylegend_1, mylegend_2, nrow=6), 
      ncol=2,widths=c(7,1)) 

enter image description here

Вы должны были бы поиграться немного больше, чтобы получить оправдание, как в вашем ожидаемого результата.

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