In this tutorial, we are going to create the following plot of the median and the interquartile range of sepal length for each iris species using the iris dataset:

1. Using geom_pointrange()
We start by calculating the median, the 1st quartile, and the 3rd quartile as follows:
library(dplyr)
iris_summary <- iris |>
group_by(Species) |>
summarize(med = median(Sepal.Length),
Q1 = quantile(Sepal.Length, 0.25),
Q3 = quantile(Sepal.Length, 0.75))
iris_summary
## A tibble: 3 x 4
# Species med Q1 Q3
# <fct> <dbl> <dbl> <dbl>
#1 setosa 5 4.8 5.2
#2 versicolor 5.9 5.6 6.3
#3 virginica 6.5 6.22 6.9
Then we give these variables to geom_pointrange() in ggplot2 and add some labels to the plot:
library(ggplot2)
ggplot(iris_summary, aes(x = Species, color = Species)) +
geom_pointrange(aes(y = med,
ymin = Q1,
ymax = Q3),
show.legend = FALSE) +
labs(y = 'Sepal length',
title = 'Difference in sepal length between iris species',
subtitle = 'Median and interquartile range',
caption = 'Based on the iris dataset in R') +
theme_light()
Output:

2. Using geom_boxplot()
Boxplots also show the median and the interquartile range, and can be plotted using the following code:
ggplot(iris, aes(x = Species, y = Sepal.Length, color = Species)) +
geom_boxplot(show.legend = FALSE) +
labs(y = 'Sepal length',
title = 'Difference in sepal length between iris species',
caption = 'Based on the iris dataset in R') +
theme_light()
Output:

Here’s how to read a boxplot:
