Ajouter une ligne horizontale au tracé et à la légende dans ggplot2

Ce code crée un joli tracé mais je voudrais ajouter une ligne noire horizontale à y=50 et que la légende affiche une ligne noire avec le texte "coupure" dans la légende, mais laisse des points dans la légende pour les sources. Je peux ajouter la ligne avec geom_line mais ne peut pas obtenir la ligne dans la légende.

    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))
32
demandé sur Greg 2012-11-06 19:41:23

2 réponses

(1) Essayez ceci:

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)

capture

(2) en ce qui concerne votre commentaire, si vous ne voulez pas que la coupure soit répertoriée comme une légende séparée, il serait plus facile d'étiqueter la ligne de coupure directement sur l'intrigue:

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")

capture

53
répondu G. Grothendieck 2017-10-19 13:42:50

Une autre solution:

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) 

Ce code génère exactement le même graphique que celui du point (1) de @G. Grothendieck. Mais il est plus facile de s'adapter aux graphiques avec plusieurs couches.

11
répondu Stéphane Laurent 2013-07-10 21:36:19