40

I used vjust as workaround and elaborate an acceptable distance by try and error. But this is sometimes very time consuming and changes with the font size and the axis scale.

Is there a better method to align the text in the example automatic?

library(ggplot2)

ggplot(data=mtcars, aes(x=hp, y=mpg))+
geom_point()+
theme_bw() +
  geom_vline(xintercept=200, colour="grey") +
  geom_text(aes(x=200, label="the strong cars", y=20), colour="blue", angle=90, vjust = 1.2, text=element_text(size=11))+
  geom_text(aes(x=200, label="the weak cars", y=20), colour="red", angle=90, vjust = -1, text=element_text(size=11))

ggsave(filename="geomline.png", width=5.5, height=2*3, dpi=300)

enter image description here

Jonas Stein
  • 6,363
  • 7
  • 39
  • 70
  • how do you want the alignment to be? vjust=0 and vjust=1 seem to do what they're supposed to, values outside this range are always more excentric. – baptiste Aug 06 '13 at 22:44
  • 1
    I want that the computer looks the fontsize up and places the textbox in the correct distance. So the user will not have to play around with the vjust values. – Jonas Stein Aug 06 '13 at 23:05
  • 1
    I think positioning labels automagically is going to be hard, even if the plot is always going to be a simple one. Have you looked at the [`directlabels`](http://cran.r-project.org/web/packages/directlabels/index.html) package? – SlowLearner Aug 08 '13 at 07:31
  • I think directlabels goes in the right direction. But I found no way to annotate lines like in the example above. – Jonas Stein Aug 08 '13 at 11:45

1 Answers1

45

Another solution for the case of one line labels would be to add a line break before/after and keep the default vjust=0.5.

ggplot(data=mtcars, aes(x=hp, y=mpg)) +
  geom_point() +
  theme_bw() +
  geom_vline(xintercept=200, colour="grey") +
  geom_text(aes(x=200, label="\nthe strong cars", y=20), colour="blue", angle=90, text=element_text(size=11)) +
  geom_text(aes(x=200, label="the weak cars\n", y=20), colour="red", angle=90, text=element_text(size=11))
Rosen Matev
  • 1,718
  • 18
  • 20
  • Easy and effective. I like that! – fdetsch Jan 22 '15 at 15:08
  • 8
    Also, to avoid rendering multiple copies, `annotate` should be used instead of `geom_text`, see https://stackoverflow.com/questions/10952832/ggplot2-is-there-a-fix-for-jagged-poor-quality-text-produced-by-geom-text – Valentas May 25 '17 at 07:44
  • @Valentas if `annotate` does the same thing but better, it would be great to update the answer to use it – stevec Apr 14 '20 at 08:59