Search code examples
rggplot2visualizationfacet-wrapwaffle-chart

ordering facet_wrap levels by frequency


I'm trying to do a waffle chart for the championships won by F1 drivers so far. The chart comes out good but it comes out with alphabetical labels. I want it to start from the most titles won to the least.

I've tried ordering and fct_relevel. But nothing works. Below is the code

ggplot(data = dfc, aes(fill=Champions, values=one)) +
  geom_waffle(color = "cornsilk", size=0.25, n_rows=7)+
  facet_wrap(~Champions, nrow = 3, strip.position = "bottom",labeller = label_wrap_gen(6))

And this is the result I'm looking for.

You can find the entire code here

The dataset looks like

Season    Champions    Team   one
1              a           x     1
2              a           x     1
3              b           y     1
4              a           x     1
5              c           z     1

Solution

  • Here's a solution using forcats (also part of the tidyverse package).

    fct_infreq() orders factors according to their frequency in the data, and you can use that to specify the ordering of the levels in your data.

    dfc$Champions <- factor(dfc$Champions, levels=levels(fct_infreq(dfc$Champions)))
    
    ggplot(data = dfc, aes(fill=Champions, values=one)) +
      geom_waffle(color = "cornsilk", size=0.25, n_rows=7) +
      facet_wrap(~Champions, nrow = 3, strip.position = "bottom", labeller = label_wrap_gen(6))