2014-10-04 2 views
0

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

library(ggplot2) 
set.seed(111) 
x = seq(1,10,length=10) 
y1 = rnorm(10, 0, 0.1) 
y2 = rnorm(10, 5, 0.1) 
y3 = rnorm(10, 10, 0.3) 
y4 = rnorm(10, 20, 0.4) 
label = c(rep("Cat",10), rep("Dog", 10), rep("Owl", 10), rep("Eagle", 10)) 
dat1 = data.frame(cbind(x, y=y1)) 
dat2 = data.frame(cbind(x, y=y2)) 
dat3 = data.frame(cbind(x, y=y3)) 
dat4 = data.frame(cbind(x, y=y4)) 
dat = data.frame(rbind(dat1, dat2, dat3, dat4)) 
dat = cbind(dat, label) 
dat 

я использую следующие коды для генерации участка:

ggplot(dat, aes(x=x, y=y, colour=label)) + 

    geom_line(data=dat[dat$label=="Cat", ], aes(x=x, y=y, linetype=label)) + 
    geom_line(data=dat[dat$label=="Dog", ], aes(x=x, y=y, linetype=label)) + 

    geom_point(data=dat[dat$label=="Owl", ], aes(x=x, y=y, colour=label)) + 
    geom_point(data=dat[dat$label=="Eagle", ], aes(x=x, y=y, colour=label)) + 

    scale_color_manual("Animal", 
        values = c("Cat" = "darkgreen", 
           "Dog" = "blue", 
           "Owl" = "red", 
           "Eagle" = "cyan")) + 
    theme_bw() + 
    scale_linetype_manual(values=c(1,2)) + 
    scale_alpha_manual(values=c(0.8, 0.8, 0.2, 0.2)) + 
    scale_size_manual(values=c(1.8, 1.8, 0.6, 0.6)) + 
    theme(legend.key=element_blank(), 
     legend.key.width = unit(3, "line"), 
     legend.key = element_blank()) 

Выходного ток участок выглядит следующим образом: enter image description here

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

  1. удалите легенду «этикетки» и покажите только легенду «Животное»
  2. для легенд «Cat» и «Dog», только отображающие точки, а не линии; для «Совы» и легенды «Орел», показываю только линию, а не точки
  3. типов линий в легенде должны соответствуют тем в сюжете
  4. порядка легенды должна быть в том же порядке, как я указать метку: Кошка, Собака, Сова и Иглы
  5. Я надеюсь, что линии тиккер (ширина = 2, например), а точки являются более прозрачными (альфа = 0,4, например)
  6. положение легенды находится внутри участка , не для снаружи

    Я ценю вашу помощь/предложения. Спасибо!

ответ

1

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

dat$label<-factor(dat$label,levels=c("Cat","Dog","Owl","Eagle")) 

Для сюжета я хотел бы использовать только один вызов для geom_point() и geom_line() и установить colour=, linetype= и shape= к label внутри aes() из ggplot(). Затем с помощью scale_color_manual() установите нужные вам цвета, затем с помощью scale_linetype_manual() установите типы линий 1 и 2 для Cat и Dog и 0 (невидимая строка) для других двух уровней. Внутри scale_shape_manual() установить значения NA для Cat и Dog. Во всех ручных шкалах используется одно и то же имя, чтобы получить только одну легенду. Альфа и размер меняются внутри geom_point() и geom_line(). Обозначение позиции опущено аргументом legend.postion= функции theme().

ggplot(dat, aes(x=x, y=y, colour=label,linetype=label,shape=label)) + 
     geom_point(alpha=0.4)+ 
     geom_line(size=2)+ 
     scale_color_manual("Animal", 
         values = c("Cat" = "darkgreen", 
            "Dog" = "blue", 
            "Owl" = "red", 
            "Eagle" = "cyan")) + 
     scale_linetype_manual("Animal",values=c(1,2,0,0)) + 
     scale_shape_manual("Animal",values=c(NA,NA,16,16))+ 
     theme_bw()+ 
     theme(legend.position=c(0.85,0.80)) 

enter image description here

+0

спасибо! Это именно то, что я хочу :) – alittleboy

+0

Извините, у меня есть еще один вопрос: есть ли способ скрыть легенду для «Eagle»? Я просто хочу показать легенды других трех переменных, но на графиках должны отображаться все четыре переменные. Благодаря! – alittleboy

+1

Добавить аргумент 'breaks = c (" Cat "," Dog "," Owl ")' ко всем трем функциям 'scale _...' –

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