thomasp85 / ggforce

Accelerating ggplot2
https://ggforce.data-imaginist.com
Other
916 stars 105 forks source link

Easy way to split one field into n facets #259

Open rjake opened 2 years ago

rjake commented 2 years ago

I often create a heat map that is too long to display on one chart. I have to scratch my head each time to figure out how to break it into columns. I eventually end up with some integer division solution x %/% y like here:

Code ```r library(tidyverse) library(scales) df <- USJudgeRatings |> as_tibble(rownames = "y") |> gather(x, fill, -y) |> mutate( x = fct_reorder(x, fill, mean), y = fct_reorder(y, fill, sum, .desc = FALSE) ) |> print() # number of columns for plot n_col <- 2 # separate into columns and keep factor order plot_prep <- df |> mutate( y_order = as.integer(y), max_rows = ceiling(n_distinct(y) / n_col), facets = (-y_order %/% max_rows) # needs something to facet on, need '-' to keep highest values on left ) |> print() # plot p <- plot_prep |> ggplot(aes(x, y, fill = fill)) + facet_wrap(~facets, ncol = n_col, scales = "free_y") + geom_tile(color = "white", size = 0.5) + scale_fill_stepsn(breaks = breaks_pretty(6), colours = viridis_pal()(5)) + theme( strip.background.y = element_blank(), strip.text = element_blank(), axis.text = element_text(size = 7) ) p + theme(aspect.ratio = 1) # identify aspect ratio aspect <- plot_prep |> select(x, y) |> summarise_all(n_distinct) |> mutate(ratio = y / x / n_col) |> print() p + theme(aspect.ratio = aspect$ratio) # <------ fixed 1:1 size ```

Could a solution be implemented like one of these?


Additionally, I often struggle to get the ratios correct. coord_fixed() throws an error and aspect.ratio affects each panel rather than "unit of y per unit of x". I included code ☝️ to show how I do it: [# unique y] / [# unique x] / [# of cols]

I originally posted in the ggplot2 repo https://github.com/tidyverse/ggplot2/issues/4763 but was directed to work with other package creators who might be able to take this on. I :heart: ggforce and think it could be a good home for this type of faceting.

thomasp85 commented 2 years ago

I like the idea but I do unfortunately not have the bandwidth to develop such a thing at the moment. I'll leave it open in case someone else want to take it on and create a PR