Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add significance lines outside/between facets

Tags:

r

ggplot2

I wanted to add significant stars over 3 facets to compare them.

I google online but it is so complicated to add things outside plot. There is a ggsignif package but it does nothing to facets (https://github.com/const-ae/ggsignif/issues/22). It seems possible using gridExtra but I cannot make it.

The stars can be draw easily in a single plot, not facets. But I have to use facets to have separate rugs on the left. If you know how to have separate rugs inside a single plot, it should also solve the problem.

Here is the code and plot I want to add things on:

library(ggplot2)
ToothGrowth$dose = factor(ToothGrowth$dose)
ggplot(ToothGrowth, aes(x='', y=len, color=dose)) +
  geom_boxplot() +
  geom_rug(sides="l") +
  facet_grid(. ~ dose)

enter image description here

What I want is:

enter image description here

Sorry for the drawing. The line width should be the same. The final result should be really similar to this but for facets:

enter image description here

like image 268
draw Avatar asked Oct 26 '25 22:10

draw


1 Answers

This is a workaround - plot two plots (one for significance annotation, another for boxplots).

library(ggplot2)
library(ggsignif)
ToothGrowth$dose <- factor(ToothGrowth$dose)

Plot significance annotation. Don't use boxplot here and set tips to 0 (using only one comparison here as others return error from statistical test, but I'm assuming that this is only an example dataset).

p1 <- ggplot(ToothGrowth, aes(as.factor(dose), len)) +
    geom_signif(comparisons = list(c("1", "2")), tip_length = 0.005) +
    coord_cartesian(ylim = c(35, 35.5)) +
    theme_void()

Plot boxplots with different x axis (need this to specify comparisons groups in ggsignif)

p2 <- ggplot(ToothGrowth, aes(factor(dose), len)) +
    geom_boxplot() +
    geom_rug(sides = "l") +  
    facet_grid(. ~ dose, scales = "free_x") +
    labs(x = NULL) +
    theme(axis.text.x = element_blank(),
          axis.ticks.x = element_blank())

Draw plots together geom_signif on-top of geom_boxplot with facet_wrap

egg::ggarrange(p1, p2, heights = c(2, 10))

enter image description here

like image 199
pogibas Avatar answered Oct 28 '25 12:10

pogibas



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!