tests/testthat/test-element-text-repel.R

test_that("element_text_repel positions are interpreted correctly", {

  # Unit calculations require an active device
  tmp <- tempfile(fileext = ".pdf")
  pdf(tmp)
  withr::defer({
    dev.off()
    unlink(tmp)
  })

  columns <- c("x", "y", "nudge_x", "nudge_y")

  examplar <- calc_element("text", theme_get())
  element <- element_text_repel(margin = margin(1, 1, 1, 1, "cm"))
  el <- merge_element(element, examplar)

  grob <- element_grob(el, label = "foo")
  expect_s3_class(grob, "titleGrob")

  grob <- element_grob(el, label = "foo", x = 0.25)
  expect_s3_class(grob, "element_textrepeltree")
  data <- unlist(grob$data[columns], use.names = FALSE)
  expect_equal(data, c(0.25, 1, 0, 0))

  grob <- element_grob(el, label = "foo", y = 0.25)
  data <- unlist(grob$data[columns], use.names = FALSE)
  expect_equal(data, c(1, 0.25, 0, 0))

  # Create new element with position = "right" (can't modify S7 repel property)
  el_right <- element_text_repel(margin = margin(1, 1, 1, 1, "cm"), position = "right")
  el_right <- merge_element(el_right, examplar)
  grob <- element_grob(el_right, label = "foo", y = 0.25)
  data <- unlist(grob$data[columns], use.names = FALSE)
  expect_equal(data, c(0, 0.25, 0, 0))

  # Create new element with position = "top"
  el_top <- element_text_repel(margin = margin(1, 1, 1, 1, "cm"), position = "top")
  el_top <- merge_element(el_top, examplar)
  grob <- element_grob(el_top, label = "foo", x = 0.25)
  data <- unlist(grob$data[columns], use.names = FALSE)
  expect_equal(data, c(0.25, 0, 0, 0))

})

test_that("element_text_repel renders as expected", {

  x <- c(0, 4.9, 5, 5.1, 10)
  labels <- c("Lorem ipsum", "dolor amet", "consectetur", "adipiscing", "elit")

  p <- ggplot(mapping = aes(x, x, colour = x, shape = labels)) +
    geom_point() +
    scale_x_continuous(breaks = x, labels = labels) +
    scale_y_continuous(breaks = x, labels = labels) +
    scale_colour_viridis_c(breaks = x, labels = labels) +
    guides(x.sec = "axis", y.sec = "axis") +
    theme(
      axis.text.x.bottom = element_text_repel(
        margin = margin(t = 10),
        colour = "dodgerblue",
        seed = 42
      ),
      axis.text.y.left = element_text_repel(
        margin = margin(r = 10),
        segment.colour = "dodgerblue",
        seed = 42
      ),
      axis.text.x.top = element_text_repel(
        margin = margin(b = 10), position = "top",
        arrow = arrow(length = unit(2, "mm")),
        seed = 42
      ),
      axis.text.y.right = element_text_repel(
        margin = margin(l = 10), position = "right",
        segment.curvature = 0.1, segment.inflect = TRUE,
        seed = 42
      ),
      legend.text = element_text_repel(
        margin = margin(l = 10), position = "right",
        segment.linetype = "dotted", colour = "dodgerblue",
        seed = 42
      )
    )

  vdiffr::expect_doppelganger("element_text_repel", p)
})

Try the ggrepel package in your browser

Any scripts or data that you put into this service are public.

ggrepel documentation built on Feb. 25, 2026, 9:06 a.m.