In this tutorial, we will learn how to make a donut plot in R using ggplot2. Donut plot is nothing but a bar plot, reshaped into pie-chart, and then adding a hole at the center to make it look like a donut. We will learn these in step by step manner to understand making Donut plot with ggplot2.
Let us load tidyverse.
library(tidyverse) theme_set(theme_bw(16))
Let us create some sample data to make a Donut plot.
data <- tibble( category = c("Google", "Meta", "Apple", "Nvidia"), value = c(100, 120, 50, 150) ) data # A tibble: 4 × 2 category value <chr> <dbl> 1 Google 100 2 Meta 120 3 Apple 50 4 Nvidia 150
We will using proportion to make a Donut plot, so let us compute the proportion of each group of interest.
# Calculate the percentage and cumulative percentage data <- data |> mutate( percentage = value / sum(value) ) data # A tibble: 4 × 3 category value percentage <chr> <dbl> <dbl> 1 Google 100 0.238 2 Meta 120 0.286 3 Apple 50 0.119 4 Nvidia 150 0.357
Making a Donut plot: Step 1
Now we have the data needed in hand, let us make bar plot using geom_bar() as the first step.
data |> ggplot(aes(x = 2, y = percentage, fill = category)) + geom_bar(stat = "identity", width = 1, color = "white")
Making a Donut plot: Step 2
In second step, we use coord_polar() in ggplot2 to reshape the bars in barplot to pie-chart.
data |> ggplot(aes(x = 2, y = percentage, fill = category)) + geom_bar(stat = "identity", width = 1, color = "white") + coord_polar(theta = "y")
Making a Donut plot: Step 3
In the third step, we make a hole in the middle of the pie chart to make it look like a donut.
data |> ggplot(aes(x = 2, y = percentage, fill = category)) + geom_bar(stat = "identity", width = 1, color = "white") + coord_polar(theta = "y") + xlim(0.5, 2.5) # Set limits to create a hole in the center
And finally, we can remove any thematic elements, just to keep only the Donut plot.
Making a Donut plot: Step 4
data |> ggplot(aes(x = 2, y = percentage, fill = category)) + geom_bar(stat = "identity", width = 1, color = "white") + coord_polar(theta = "y") + xlim(0.5, 2.5) + # Set limits to create a hole in the center theme_void()
Finally we can add some title and other customization if needed just like any other plot with ggplot2.
data |> ggplot(aes(x = 2, y = percentage, fill = category)) + geom_bar(stat = "identity", width = 1, color = "white") + coord_polar(theta = "y") + xlim(0.5, 2.5) + theme_void() + labs(title="Donut plot example") ggsave("how_to_make_donut_plot.png")