2016-04-19 4 views
1

Я пытаюсь добавить легенду к моему сюжету, и вот что у меня есть на данный момент:Пользовательские легенды с ggplot2 в R, имеющий несколько участков плотности

require(ggplot2) 
d1 = data.frame(rnorm(100, mean=5)) 
d2 = data.frame(rnorm(50, mean=7)) 
single_data = 5.5 
max_y = max(max(density(d1[,1])$y), max(density(d2[,1])$y)) 
print(ggplot() + geom_density(aes(x=d1), colour='black', data=d1, kernel='gaussian', alpha=.1, fill='red') + 
     geom_density(aes(x=d2), colour="black", data=d2, kernel='gaussian', alpha=.1, fill='blue') + 
     geom_segment(aes(x=single_data, xend=single_data, y=0, yend=max_y), colour='blue') + 
     xlab("Count") + ylab("Density") + ggtitle('Main Title') + 
     theme(legend.position='right') + 
     scale_color_manual(name = "Data", 
          labels = c(5, 7), 
          values = c('red', 'blue')) 
) 

Я ожидаю увидеть легенду на правой стороне сюжета, но вот выход:

Code sample output

Как я могу добавить легенду для этих двух графиков плотности?

+3

Легенды сделаны для вещей, которые вы нарисовали в 'aes', например, цвета, заливки, формы ... У вас их нет. Но кроме этого, хорошо сформированный вопрос, пример кода, изображение выхода. У него все получилось, Кейт Уинслет выйдет замуж. –

ответ

3

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

library(ggplot2) 
set.seed(9) 
d1 = data.frame(d1 = rnorm(100, mean=5)) 
d2 = data.frame(d2 = rnorm(50, mean=7)) 
single_data = 5.5 

xy <- data.frame(d1 = d1, d2 = d2) 

library(tidyr) 
xy <- gather(xy) 

ggplot(xy, aes(x = value, fill = key)) + 
    geom_density(kernel = "gaussian", alpha = 0.1) + 
    geom_vline(xintercept = single_data) 

enter image description here

1

Вы можете сделать это:

require(ggplot2) 
df <- data.frame(density=c(rnorm(50, mean=5), rnorm(50, mean=7)), 
       name=c(rep('d1', 50), rep('d2', 50))) 

single_data = 5.5 
max_y = max(max(density(d1[,1])$y), max(density(d2[,1])$y)) 

p1 <- ggplot(data=df) + 
     geom_density(aes(x=density, group=name, colour=name, fill=name), kernel='gaussian', alpha=.5) + 
     geom_segment(aes(x=single_data, xend=single_data, y=0, yend=max_y), colour='blue') + 
    scale_color_manual('Legend Name', labels=c('density 1', 'density 2'), values=c('blue', 'green')) + 
    scale_fill_manual('Legend Name', labels=c('density 1', 'density 2'), values=c('blue', 'green')) + 
     xlab("Count") + ylab("Density") + ggtitle('Main Title') + 
     theme(legend.position='right') 
p1 

Вы должны создать достойные dataframes, прежде чем ploting их. Это ключ к превосходству ggplot: p. Здесь вертикальный сегмент не включен в легенду. Если вы хотите, чтобы это было так, вам нужно использовать эстетику цвета для сегмента и эстетику заполнения для плотностей (а не для плотности, как в примере).

+0

Спасибо, теперь я пытаюсь сделать то, что вы упомянули с помощью сегмента, и изменить альфу цвета заливки в легенде. И как побочная заметка, у меня изначально были два вектора в двух переменных, потому что я не знал, как объединить векторы разной длины в один data.frame, который решается в другом заданном здесь ответе. – adrin