web-dev-qa-db-fra.com

R ggplot2: étiquetage d'une ligne horizontale sur l'axe des y avec une valeur numérique

J'ai une ligne horizontale dans un ggplot et je voudrais indiquer sa valeur (7.1) sur l'axe des y.

library(ggplot2)
df <- data.frame(y=c(1:10),x=c(1:10))
h <- 7.1
plot1 <- ggplot(df, aes(x=x,y=y)) + geom_point() 
plot2 <- plot1+ geom_hline(aes(yintercept=h))

Merci de votre aide.

24
adam.888

Il n'est pas clair si vous voulez que 7.1 fasse partie de l'axe des ordonnées ou si vous voulez simplement un moyen d'étiqueter la ligne. En supposant que ce soit le cas, vous pouvez utiliser scale_y_continuous() pour définir vos propres ruptures. Quelque chose comme cela peut faire ce que vous voulez (vous aurez probablement besoin de jouer du violon):

plot1+ geom_hline(aes(yintercept=h)) + 
  scale_y_continuous(breaks = sort(c(seq(min(df$y), max(df$y), length.out=5), h)))

enter image description here

En supposant que ce soit le cas, c’est probablement plus ce que vous voulez:

plot1 + geom_hline(aes(yintercept=h)) +
  geom_text(aes(0,h,label = h, vjust = -1))

enter image description here

42
Chase

Que diriez-vous quelque chose comme ça?

plot1 + geom_hline(aes(yintercept=h), colour="#BB0000", linetype="dashed") + 
 geom_text(aes( 0, h, label = h, vjust = -1), size = 3)
6
Maiasaura

Similaire à solution de Chase avec une modification de l'utilisation des étiquettes existantes.


ggplot_build(plot1)$layout$panel_ranges[[1]]$y.major_source peut être utilisé pour extraire les étiquettes existantes et en ajouter de nouvelles h.

plot1 + geom_hline(aes(yintercept=h)) + 
  scale_y_continuous(breaks = sort(c(ggplot_build(plot1)$layout$panel_ranges[[1]]$y.major_source, h)))

enter image description here

5
Prradep

Ceci fait suite à La réponse de Prradep .

Je pense que la réponse de Prradep fonctionne pour une ancienne version de ggplot2. J'utilise ggplot2 version 3.1.0 et pour extraire les étiquettes existantes de plot1 dans cette version, vous devez utiliser:

ggplot_build(plot1)$layout$panel_params[[1]]$y.major

Cela ne fonctionne que pour les AXES LINÉAIRES! Si vous avez un axe des ordonnées non linéaire (par exemple, logarithmique), alors ggplot2 enregistre les repères si l’axe était linéaire dans $y.major. Les étiquettes de graduation réelles sont stockées en tant que vecteur de caractères dans $y.labels. Par conséquent, pour un axe y non linéaire, vous devez utiliser:

as.numeric(ggplot_build(cl.plot.log)$layout$panel_params[[1]]$y.labels)
1
GMSL