Jonas Stein
Jonas Stein

Reputation: 7043

Align geom_text to a geom_vline in ggplot2

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

Upvotes: 46

Views: 83119

Answers (2)

Quinten
Quinten

Reputation: 41603

Another option could be using the geom_textvline function from the great geomtextpath package. This can actually combine the functions geom_text and geom_vline. This package has some create function to create curved, straight automatic text annotations. Check this link for some extra examples. Here is a reproducible example:

library(ggplot2)
library(geomtextpath)
# Using geom_textvline
ggplot(data=mtcars, aes(x=hp, y=mpg)) +
  geom_point() +
  geom_textvline(label = "the strong cars", xintercept = 200, vjust = 1.3) +
  geom_textvline(label="the weak cars", xintercept = 200, vjust = -0.7) +
  theme_bw()

# Using geom_textabline with slope
ggplot(data=mtcars, aes(x=hp, y=mpg)) +
  geom_point() +
  geom_textabline(slope = 0.05, label = "the strong cars", intercept = 10, vjust = 1.3) +
  geom_textabline(slope = 0.05, label="the weak cars", intercept = 10, vjust = -0.7) +
  theme_bw()

Created on 2022-08-25 with reprex v2.0.2

Upvotes: 4

Rosen Matev
Rosen Matev

Reputation: 1878

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

Upvotes: 50

Related Questions