2012-11-06 22 views
23

Ten kod tworzy ładną fabułę, ale chciałbym dodać poziomą czarną linię na y = 50 I mieć legendę pokazać czarną linię z tekstem "cutoff" w legendzie , ale pozostaw punkty w legendzie dla źródeł. Mogę dodać linię z geom_line, ale nie mogę uzyskać linii w legendzie.Dodaj poziomą linię do wydruku i legendy w ggplot2

library(ggplot2) 
    the.data <- read.table(header=TRUE, sep=",", 
    text="source,year,value 
    S1,1976,56.98 
    S1,1977,55.26 
    S1,1978,68.83 
    S1,1979,59.70 
    S1,1980,57.58 
    S1,1981,61.54 
    S1,1982,48.65 
    S1,1983,53.45 
    S1,1984,45.95 
    S1,1985,51.95 
    S1,1986,51.85 
    S1,1987,54.55 
    S1,1988,51.61 
    S1,1989,52.24 
    S1,1990,49.28 
    S1,1991,57.33 
    S1,1992,51.28 
    S1,1993,55.07 
    S1,1994,50.88 
    S2,1993,54.90 
    S2,1994,51.20 
    S2,1995,52.10 
    S2,1996,51.40 
    S3,2002,57.95 
    S3,2003,47.95 
    S3,2004,48.15 
    S3,2005,37.80 
    S3,2006,56.96 
    S3,2007,48.91 
    S3,2008,44.00 
    S3,2009,45.35 
    S3,2010,49.40 
    S3,2011,51.19") 
    ggplot(the.data, aes(x = year, y = value)) + 
     geom_point(aes(colour = source)) + 
     geom_smooth(aes(group = 1)) 

Odpowiedz

41

(1) Spróbuj to:

cutoff <- data.frame(x = c(-Inf, Inf), y = 50, cutoff = factor(50)) 
ggplot(the.data, aes(year, value)) + 
     geom_point(aes(colour = source)) + 
     geom_smooth(aes(group = 1)) + 
     geom_line(aes(x, y, linetype = cutoff), cutoff) 

screenshot

(2) W odniesieniu do Twojego komentarza, jeśli nie chcesz odcięcia wymieniony jako oddzielna legendy byłoby łatwiej tylko oznaczyć linię graniczną tuż przy działce:

ggplot(the.data, aes(year, value)) + 
    geom_point(aes(colour = source)) + 
    geom_smooth(aes(group = 1)) + 
    geom_hline(yintercept = 50) + 
    annotate("text", min(the.data$year), 50, vjust = -1, label = "Cutoff") 

screenshot

+0

To powinno zadziałać, czy można połączyć dwie legendy? – Greg

+0

Próbowałem dodać tekst bezpośrednio na działce, ale czcionka nie wyglądała dobrze w porównaniu do reszty wątku po kompilacji na moim komputerze z Linuksem. Na razie wykorzystam osobne legendy. Dziękuję – Greg

+1

Zauważ, że można podać 'fontface =' i 'family =' w 'geom_text'. Zobacz przykłady na dole '? Geom_text'. –

9

Innym rozwiązaniem:

gg <- ggplot(the.data, aes(x = year, y = value)) + 
     geom_point(aes(colour = source)) + 
     geom_smooth(aes(group = 1)) 

cutoff <- data.frame(yintercept=50, cutoff=factor(50)) 
gg + 
    geom_hline(aes(yintercept=yintercept, linetype=cutoff), data=cutoff, show_guide=TRUE) 

Kod ten generuje dokładnie taki sam graficzny jak w punkcie (1) z @G. Grothendieck. Łatwiej jest jednak dostosować się do grafiki za pomocą kilku warstw.

+0

'show_guide' jest przestarzałe, użyj zamiast niego' show.legend'. – Zhanxiong

Powiązane problemy