jaydoc
jaydoc

Reputation: 79

Specify the order for groups when using unite from dplyr for plotting with ggplot

I wanted to do something like this

Add multiple comparisons using ggsignif or ggpubr for subgroups with no labels on x-axis

I got this far:

Packages and Example data

library(tidyverse)
library(ggpubr)
library(ggpol)
library(ggsignif)

example.df <- data.frame(species = sample(c("primate", "non-primate"), 50, replace = TRUE),
                         treated = sample(c("Yes", "No"), 50, replace = TRUE),
                         gender = sample(c("male", "female"), 50, replace = TRUE), 
                         var1 = rnorm(50, 100, 5))

Levels

example.df$species <- factor(example.df$species, 
                             levels = c("primate", "non-primate"), labels = c("p", "np"))
example.df$treated <- factor(example.df$treated, 
                             levels = c("No", "Yes"), labels = c("N","Y"))
example.df$gender <- factor(example.df$gender, 
                            levels = c("male", "female"), labels = c("M", "F"))

Since I have had no luck in getting either ggsignif or ggpubr to work with placing the significant groups correctly when the groups they need to refer to are not explicitly named in the x-axis (as they are subgroups of each variable in the x-axis and are indicated only in the fill legend and not the x-axis, I tried this instead.

example.df %>% 
  unite(groups, species, treated, remove = F, sep= "\n") %>% 
  {ggplot(., aes(groups, var1, fill= treated)) + 
     geom_boxjitter() +
     facet_wrap(~ gender, scales = "free") +
     ggsignif::geom_signif(comparisons =  combn(sort(unique(.$groups)), 2, simplify = F),
                           step_increase = 0.1)}

I get this,

Faceted plot with significance values computed for every group Faceted plot with significance values computed for every group

However, the order of the combined groups on the x -axis is not how I want it. I want to order it with p/N, np/N, p/Y, np/Y for each facet.

How do I do this? Any help is greatly appreciated.

Edit: Creating a new variable using mutate and making it an ordered factor with my preferred plotting order solves.

example.df %>% 
  unite(groups, species, treated, remove = F, sep= "\n") %>% 
  mutate(groups2 = factor(groups, levels = c("p\nN", "np\nN", "p\nY", "np\nY"),
                          ordered = TRUE)) %>% 
  {ggplot(., aes(groups2, var1, fill= treated)) +
     geom_boxjitter() + 
     facet_wrap(~gender,scales = "free") +
     ggsignif::geom_signif(comparisons = combn(sort(unique(.$groups2)), 2, simplify = F), 
                           step_increase = 0.1)}

But I am still looking for solutions to not having to use unite at all and keeping the original factors and still get significance values to plot using ggsignif or ggpubr.

Upvotes: 1

Views: 492

Answers (1)

Z.Lin
Z.Lin

Reputation: 29075

The default parameters for interaction (from the base package) appear to give the factor ordering you are looking for:

result

example.df %>%
  mutate(groups = interaction(species, treated, sep = "\n")) %>%
  {ggplot(., aes(groups, var1, fill= treated)) + 
    geom_boxjitter() +
    facet_wrap(~ gender, scales = "free") +
    geom_signif(comparisons = combn(sort(as.character(unique(.$groups))), 2, simplify = F),
                step_increase = 0.1)}

Upvotes: 1

Related Questions