Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to fix inconsistent justification of wrapped labels in geom_label

Tags:

r

ggplot2

Here's some data.

library(ggplot2)
df <- structure(list(date = structure(c(18851, 19958, 18933, 18949, 
                                        18976, 19074, 19304, 19570, 19713, 19766, 20032), class = "Date"), 
                     event = c("Census data released", "Johnson v. WEC filed in state court", 
                               "People's Map Commission releases final proposal", "Gov. Evers vetoes maps", 
                               "SCOWIS receives proposed maps", "SCOTUS rules Evers' map unconstitutional", 
                               "Election held using legislature's map", "Protasiewicz begins term", 
                               "SCOWIS strikes down existing maps & invites proposals", 
                               "Legislature passes Evers' map", "Election held using Evers' map"
                     )), row.names = c(NA, -11L), class = c("tbl_df", "tbl", "data.frame"
                     ))

I plot it like this.

df |>
  ggplot(aes(x = 0, y = date)) +
  geom_line() +
  geom_point() +
  ggrepel::geom_label_repel(aes(label = str_wrap(event, 30)),
                            hjust = -0.2, direction = "y", seed = 3)

example image

Notice how the second line of the labels, when wrapped, is inconsistently aligned with the first row of text.

How can I make subsequent lines of a wrapped label begin with the same justification as the first line of the label?

Note: I use ggrepel::geom_label_repel for clarity's sake, but the same wrapping behavior is shown with ggplot2::geom_label.

like image 924
John J. Avatar asked Dec 09 '25 16:12

John J.


1 Answers

hjust values outside [0, 1] are not officially supported (AFAIK) and can lead to weirdness, such as in this case. Use hjust = 0 and then use e.g. nudge_x to nudge the position to the right, or tweak those parameters to get what you want.

Basically, you should use the position to get what you want, not the justification.

df |>
  ggplot(aes(x = 0, y = date)) +
  geom_line() +
  geom_point() +
  ggrepel::geom_label_repel(
    aes(label = str_wrap(event, 30)), 
    hjust = 0, nudge_x = 1, direction = "y", seed = 3
  )

enter image description here

like image 120
Axeman Avatar answered Dec 11 '25 10:12

Axeman



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!