Skip to content

Instantly share code, notes, and snippets.

@mikmart
Last active September 21, 2018 13:07
Show Gist options
  • Select an option

  • Save mikmart/877698e4b5511e99b9d570d627723b46 to your computer and use it in GitHub Desktop.

Select an option

Save mikmart/877698e4b5511e99b9d570d627723b46 to your computer and use it in GitHub Desktop.
Flipping gridlines in ggplot2 themes
library(tidyverse)
library(fbcutils)

# Produce a grob to be used as for panel backgrounds
guide_grid2 <- function(theme, x.minor, x.major, y.minor, y.major) {

  x.minor <- setdiff(x.minor, x.major)
  y.minor <- setdiff(y.minor, y.major)

  ggplot2:::ggname("grill", grid::grobTree(
    ggplot2:::element_render(theme, "panel.background"),
    if (length(y.minor) > 0) ggplot2:::element_render(
      theme, "panel.grid.minor.x",
      x = rep(0:1, length(y.minor)), y = rep(y.minor, each = 2),
      id.lengths = rep(2, length(y.minor))
    ),
    if (length(x.minor) > 0) ggplot2:::element_render(
      theme, "panel.grid.minor.y",
      x = rep(x.minor, each = 2), y = rep(0:1, length(x.minor)),
      id.lengths = rep(2, length(x.minor))
    ),
    if (length(y.major) > 0) ggplot2:::element_render(
      theme, "panel.grid.major.x",
      x = rep(0:1, length(y.major)), y = rep(y.major, each = 2),
      id.lengths = rep(2, length(y.major))
    ),
    if (length(x.major) > 0) ggplot2:::element_render(
      theme, "panel.grid.major.y",
      x = rep(x.major, each = 2), y = rep(0:1, length(x.major)),
      id.lengths = rep(2, length(x.major))
    )
  ))
}

CoordFlip$render_bg <- function(panel_params, theme) {
    x.major <- if (length(panel_params$x.major) > 0) unit(panel_params$x.major, "native")
    x.minor <- if (length(panel_params$x.minor) > 0) unit(panel_params$x.minor, "native")
    y.major <- if (length(panel_params$y.major) > 0) unit(panel_params$y.major, "native")
    y.minor <- if (length(panel_params$y.minor) > 0) unit(panel_params$y.minor, "native")

    guide_grid2(theme, x.minor, x.major, y.minor, y.major)
}

theme_thl <- function() {
 theme_minimal()  %+replace%
   theme(panel.grid.major.x = element_blank(),
         panel.grid.minor = element_blank(),
         axis.title.x = element_text(hjust = 1),
         axis.title.y = element_text(vjust = 1))

}

data <- tribble(
 ~alue, ~p,
 "hus", 0.3,
 "ahvenanmaa", 0.28,
 "vsshp", 0.195,
 "kymshp", 0.04,
 "vaasan shp", 0.03,
 "others", 0.16
)

p <- data %>%
 mutate(alue = str_to_upper(alue) %>% as_factor() %>% fct_rev()) %>%
 ggplot(aes(alue, p)) +
 geom_col(show.legend = FALSE, fill = thl_green) +
 scale_y_continuous(
   labels = scales::number_format(decimal.mark = ",", accuracy = 0.1),
   expand = expand_scale(c(0, 0.01))
  ) +
 theme_thl() +
 labs(x = NULL, y = "%")

p

p + coord_flip()

Created on 2018-09-21 by the reprex package (v0.2.0.9000).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment