teunbrand / ggh4x

ggplot extension: options for tailored facets, multiple colourscales and miscellaneous
https://teunbrand.github.io/ggh4x/
Other
534 stars 32 forks source link

facet_grid2 produces extra axes ticks when hline/vline is added #125

Closed nonsciencemark closed 6 months ago

nonsciencemark commented 9 months ago

When using facet_grid2(x ~ y, scales = "free", independent = TRUE, render_empty = FALSE), adding a vertical or horizontal line causes axes ticks to appear in the empty plots.

library("ggh4x")

# without extra lines, the empty plots render ok
ggplot(mtcars) +
    aes(x = wt, y = mpg) +
    facet_grid2(cyl ~ vs, scales = "free", 
        independent = TRUE, render_empty = FALSE) +
    geom_point()

# adding either a vline or hline causes the empty plots to get axis ticks
ggplot(mtcars) +
    aes(x = wt, y = mpg) +
    facet_grid2(cyl ~ vs, scales = "free", 
        independent = TRUE, render_empty = FALSE) +
    geom_point() +
    geom_vline(xintercept = 3.5)

ggplot(mtcars) +
    aes(x = wt, y = mpg) +
    facet_grid2(cyl ~ vs, scales = "free", 
        independent = TRUE, render_empty = FALSE) +
    geom_point() +
    geom_hline(yintercept = 15)

# abline doesn't cause this problem BUT it's impossible to do vlines with abline
ggplot(mtcars) +
    aes(x = wt, y = mpg) +
    facet_grid2(cyl ~ vs, scales = "free", 
        independent = TRUE, render_empty = FALSE) +
    geom_point() +
    geom_abline(intercept = 10, slope = 1)
teunbrand commented 9 months ago

This is because geom_vline()/geom_hline() are 'special' in that they don't need data, and ggplot2 draws data without facetting variables in every panel. This technically makes these facets non-empty, which is probably why the axes are drawn there (as render_empty only affects the rendering step, not the setup step).

To work around this, I'd suggest to include the facetting variables in geom_hline()/geom_vline()'s data and put the intercept in the mapping argument.

library(ggh4x)
#> Loading required package: ggplot2

ggplot(mtcars) +
  aes(x = wt, y = mpg) +
  facet_grid2(cyl ~ vs, scales = "free", 
              independent = TRUE, render_empty = FALSE) +
  geom_point() +
  geom_hline(
    data = vctrs::vec_unique(mtcars[c("cyl", "vs")]),
    aes(yintercept = 15)
  )

Created on 2023-09-21 with reprex v2.0.2

teunbrand commented 6 months ago

I'm going to mark this issue as 'won't fix' because this is a quirk in ggplot2 itself rather than ggh4x.