4

In ggplot2, how to add a white hole in the middle of the pie chart? Please refer to below code for current plot (the left plot) . Thanks!

library(tidyverse)
pie_data <- data.frame(category=c('A','B','C','A','B','C'),
                       year=c(2020,2020,2020,2021,2021,2021),
                       sales=c(40,30,20,10,15,10))




pie_data %>% ggplot(aes(x=factor(year),y=sales,fill=category))+
  geom_col(position='fill',width=1,color='white')+
 coord_polar(theta = 'y')+
  theme_void()

enter image description here

tjebo
  • 21,977
  • 7
  • 58
  • 94
anderwyang
  • 1,801
  • 4
  • 18
  • 1
    https://stackoverflow.com/questions/13615562/ggplot-donut-chart linking because an important thread regarding donut chart, for the interested – tjebo Feb 08 '22 at 15:23

2 Answers2

7

Just widen the limits of your x axis (it's easier to do this if you don't convert the year into a factor):

pie_data %>% ggplot(aes(x = year, y = sales, fill = category))+
  geom_col(position = 'fill', width = 1, color = 'white') +
  coord_polar(theta = 'y') + 
  lims(x = c(2019, 2022)) +
  theme_void()

enter image description here

You can control the size of the white hole by changing 2019 in the above code. The earlier the year, the larger the hole:

pie_data %>% ggplot(aes(x = year, y = sales, fill = category))+
  geom_col(position = 'fill', width = 1, color = 'white') +
  coord_polar(theta = 'y') + 
  lims(x = c(2017, 2022)) +
  theme_void()

enter image description here

Allan Cameron
  • 147,086
  • 7
  • 49
  • 87
  • 1
    @anderwyang that's down to the plotting device. If you are using RStudio, in the menu bar, go to Tools -> Global Options -> General -> Graphics and select "AGG" for graphics backend – Allan Cameron Feb 08 '22 at 11:41
2

You can add an hollow bar at the center:

  pie_data %>% ggplot(aes(x=factor(year),y=sales,fill=category))+
      geom_col(position='fill',width=1,color='white')+
      coord_polar(theta = 'y')+
      geom_col(aes(x=0,y=0))+
      theme_void()

enter image description here

if you want a larger circle, use a negative x coordinate:

geom_col(aes(x=-1,y=0))

enter image description here