• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar

Data Viz with Python and R

Learn to Make Plots in Python and R

  • Home
  • Python Viz
  • Seaborn
  • Altair
  • R Viz
  • ggplot2
  • About
    • Privacy Policy
  • Show Search
Hide Search

How to add P-value to each facet in ggplot2

datavizpyr · September 14, 2024 ·

In this tutorial, we will learn how to add p-value to each facet plot made with facet_wrap() function in ggplot2. We will use scatter plot example, where we have multiple scatter plots using facet_wrap and we have done linear regression analysis to find the statisitical significance of the association.

Here we will show with how to annotate the scatter plots with p-value showing the statistical significance of the association with two examples. We will use geom_text() & geom_richtext() functions in combination with packages glue and ggtext.

library(tidyverse)
library(palmerpenguins)
library(ggtext)
library(glue)
theme_set(theme_bw(16))

We will use Palmer penguin dataset to make the scatter plot.

penguins |> head()

# A tibble: 6 × 8
  species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie  Torgersen           39.1          18.7               181        3750
2 Adelie  Torgersen           39.5          17.4               186        3800
3 Adelie  Torgersen           40.3          18                 195        3250
4 Adelie  Torgersen           NA            NA                  NA          NA
5 Adelie  Torgersen           36.7          19.3               193        3450
6 Adelie  Torgersen           39.3          20.6               190        3650
# ℹ 2 more variables: sex <fct>, year <int>

How to annotate multiple plots with p-values

In this post, we will learn how to add p-value to multiple plots made with facet_wrap() in ggplot2. Let us make scatter plots using facet_wrap().

p1 <- penguins |>
  ggplot(aes(flipper_length_mm, body_mass_g, color=species))+
  geom_point()+
  geom_smooth(method = "lm", formula = y ~ x) +
  facet_wrap(~species)+
  theme(legend.position = "none")
p1
ggsave("how_to_annotate_multiple_plots_with_p_value_ggplot2.png",width=9, height=5)
How to annotate multiple plots with p-value in ggplot2
How to add p-values to multiple plots made with facet_wrap()

To add p-value as annotation to each facet, let us first perform linear regression analysis using tidyverse framework and save p-value in a data frame. To do this we use broom packages’ tidy() function.

Since we will be adding p-value as annotation to each facet, we need x & y co-ordinates for placing the p-values on the plot. We add the coordinates in the scale of the variables we are plottting.

pval_df <- penguins %>% 
  group_by(species) %>%
  summarize(lm_mod = list(lm(body_mass_g~flipper_length_mm) ),
            lm_res = map(lm_mod, broom::tidy)) |>
  unnest(lm_res) |>
  filter(term=="flipper_length_mm") |>
  select(species, p.value) |>
  mutate(
    body_mass_g= rep(6100,3), flipper_length_mm= c(220,220,220),
    label=glue("p_val = {signif(p.value,digits=3)}"))

And this is how our dataframe containing p-value and the coordinates to annotate the plots with p-values look like.

 
pval_df

# A tibble: 3 × 5
  species    p.value body_mass_g flipper_length_mm label           
  <fct>        <dbl>       <dbl>             <dbl> <glue>          
1 Adelie    1.34e- 9        6100               220 p_val = 1.34e-09
2 Chinstrap 3.75e- 9        6100               220 p_val = 3.75e-09
3 Gentoo    1.33e-19        6100               220 p_val = 1.33e-19

Annotating each facet with p-value using ggtext’s geom_richtext()

We can now use geom_text() function to add p-value as a label to the plot as shown below.

p1+
  geom_text(
    data = pval_df,
    aes(label = label),
    hjust = 1, vjust = 1,
    size=6
  )

ggsave("annotate_multiple_plots_with_p_value_ggplot2.png", width=9, height=5)
Annotating each facet with p-value using geom_text()
Annotating each facet with p-value using geom_text()

Annotating each facet with p-value using geom_richtext()

ggtext’s geom_richtext() function offers us great customizations for annotating plots. We can add matching colors and a box around p-value to highlight the annotation nicely.

p1+
  geom_richtext(
    data = pval_df,
    aes(
      label = label#,
    ),
    hjust = 1, vjust = 1,
    size=6,
    font="bold"
  )

ggsave("annotate_facet_wrap_plots_with_p_value_ggplot2.png", width=9, height=5)
Annotating each facet with p-value using ggtext's geom_richtext()
Annotating each facet with p-value using ggtext’s geom_richtext()

If you want to annotate a single plot made with ggplot2, check out this post https://datavizpyr.com/annotate-plot-with-p-value-in-ggplot2/

Related posts:

Default ThumbnailHow to Move Facet strip label to the bottom Customizing Mean mark to boxplot with ggplot2How To Show Mean Value in Boxplots with ggplot2? facet_wrap() example with white boxHow To Change facet_wrap() Box Color in ggplot2? Scatterplot with marginal multi-histogram with ggExtraHow To Make Scatterplot with Marginal Histograms in R?

Filed Under: facet_wrap ggplot2, ggplot2, R Tagged With: add p-values to each facet

Primary Sidebar

Tags

Altair barplot Boxplot boxplot python boxplot with jiitered text labels Bubble Plot Color Palette Countplot Density Plot Facet Plot gganimate ggplot2 ggplot2 Boxplot ggplot2 error ggplot boxplot ggridges ggtext element_markdown() Grouped Barplot R heatmap heatmaps Histogram Histograms Horizontal boxplot Python lollipop plot Maps Matplotlib Pandas patchwork pheatmap Pyhon Python R RColorBrewer reorder boxplot ggplot Ridgeline plot Scatter Plot Scatter Plot Altair Seaborn Seaborn Boxplot Stock Price Over Time Stripplot UpSetR Violinplot Violin Plot World Map ggplot2

Buy Me a Coffee

Copyright © 2025 · Daily Dish Pro on Genesis Framework · WordPress · Log in

Go to mobile version