2015-11-03 3 views
-1

У меня есть кадр данных, который выглядит примерно как df, ниже. Это близко к тому, что мне нужно, но одна легенда печатает для всех четырех исходных категорий группировки, а не только для двух. Ниже я хотел бы иметь одну легенду, которая отражает линии для «красных» и «синих» категорий группировки df1, а затем отдельную легенду, которая отражает линии для категорий «зеленого» и «оранжевого» группированияКак получить отдельные легенды для отдельных слоев в ggplot?

Мотивация в два раза. Во-первых, я хотел бы создать сюжет, который показывает, что может обеспечить цвет для онлайн-публикации и быть информативным черно-белым для печатной версии. Во-вторых, у моего реального набора данных есть 5 категорий группировки, и действительно только два (красный и синий) являются наиболее информативными.

Итак, мое решение, которое я пытаюсь воспроизвести ниже, - это выбрать красный и синий, сделать эти линии толстыми, изменить тип линий одного и сделать их красными и синими цветами. И тогда я бы хотел добавить второй слой с другими, менее информативными категориями и сделать их тоньше и изменить их по типам линий. Благодарю.

test<-rep(c('red', 'blue', 'green', 'orange'), 6) 
test1<-rnorm(24, mean=10, sd=2) 
test2<-seq(1,24,2) 
df<-data.frame(test, test1, test2) 
df1<-subset(df, test=='red'|test=='blue') 
df2<-subset(df, test!='red'&test!='blue') 

library(ggplot2) 
test.plot <- ggplot(df1, aes(x=test2, y=test1, group=test)) + geom_line(aes(col=test,linetype=test), size=2) + scale_color_manual(values=c('red'='red3', 'blue'='darkblue')) 
test.plot + geom_line(data=df2, aes(x=test2, y=test1, linetype=test)) 
+0

Но вы хотите, отдельные легенды, или одна легенда? – Heroka

ответ

1

Как правило, аспекты фигуры, которые представляют одно и то же, должны быть в одной и той же легенде. Это решение проблемы? Он использует три ручные шкалы (цвет, тип и размер шрифта), чтобы получить все тесты внутри одной легенды, с конкретной заметной линией.

library(grid) #for unit 
library(ggplot2) 

#make proper factor levelling in data, easier than setting breaks 
df$test <- factor(df$test, levels=c("blue","red","green","orange")) 

#plot with a lot of manual scales (but no second sets) 
p2 <- ggplot(df, aes(x=test2,y=test1, group=test, col=test)) + 
    geom_line(aes(linetype=test,size=test)) + 
    scale_color_manual(values=c('red'='red3','blue'='darkblue','green'='black','orange'='black')) + 
    scale_linetype_manual(values=c('red'='dashed','blue'='solid','green'='dashed','orange'='dotted')) + 
    scale_size_manual(values=c('red'=2,'blue'=2,'green'=0.5,'orange'=0.5)) + 
    theme(legend.key.width=unit(3,"lines")) #to show dashes in red 
p2 

enter image description here

данные используются (seed=123):

df <- structure(list(test = structure(c(2L, 1L, 3L, 4L, 2L, 1L, 3L, 
4L, 2L, 1L, 3L, 4L, 2L, 1L, 3L, 4L, 2L, 1L, 3L, 4L, 2L, 1L, 3L, 
4L), .Label = c("blue", "red", "green", "orange"), class = "factor"), 
    test1 = c(8.87904870689557, 9.53964502103344, 13.1174166282982, 
    10.1410167828492, 10.2585754703219, 13.4301299737666, 10.9218324119784, 
    7.46987753078693, 8.62629429621295, 9.10867605980008, 12.4481635948789, 
    10.7196276541147, 10.8015429011881, 10.2213654318902, 8.88831773049185, 
    13.5738262736062, 10.9957009564585, 6.06676568674072, 11.4027118031274, 
    9.05441718454413, 7.86435258802631, 9.56405017068341, 7.94799110338552, 
    8.54221754141772), test2 = c(1, 3, 5, 7, 9, 11, 13, 15, 17, 
    19, 21, 23, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23)), .Names = c("test", 
"test1", "test2"), row.names = c(NA, -24L), class = "data.frame") 
+0

Это работает просто отлично, за исключением странной темы (legend.key.width = unit (3, 'lines') аргумент дает мне ошибку: «не удалось найти функциональный блок» – spindoctor

+0

Получил ответ. Ответ заключается в загрузке библиотеки (сетка) – spindoctor

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