Why would you ever want to use a pie chart…?

Sample Data

types <- c("Footwear","Apparel","Equipment","Miscellaneous")
factor_types <- factor(types, levels=types)

sales <- data.frame(type = factor_types,
                    num_sales = c(7947,3237,387,48)) %>%
  mutate(percent_sales = scales::percent(num_sales/sum(num_sales)))

Color Palette

base_color <- "#41598b"
saturation_diff <- 1/(length(types)-1) 
# evenly space out the palette based on the number of categories
# the color will be hard to tell apart if there are too many categories!!

# this function is adapted from Josh O'Brien's answer on #
# https://stackoverflow.com/questions/26314701/r-reducing-colour-saturation-of-a-colour-palette

desaturate_by <- function(colors, by) {
    X <- diag(c(1, by, 1)) %*% rgb2hsv(col2rgb(colors))
    hsv(X[1,], X[2,], X[3,])
}

palette <- sapply(seq(1,0,-saturation_diff),
              function(x){desaturate_by(base_color,x)})

Plot

plotDONUT <- as.double(TRUE)  # set to FALSE for a pie chart
width <- 0.5  # width of the donut (relative to the radius), does not affect the pie chart
text_dist <- plotDONUT + width/2 + 0.3 # distance of the labels from the center of the donut; the last term is the distance from the edge

ggplot(data = sales,
       aes(x=plotDONUT, y=num_sales, fill=type, xmax=plotDONUT+width, xmin=0))+
  geom_bar(stat="identity", width=width) +
  scale_fill_manual(values=palette, breaks=factor_types)+
  # the stacked bar chart starts from the top, hence the rev():
  geom_text(aes(x= text_dist,
                y=cumsum(rev(num_sales))-rev(num_sales)/2,
                label=rev(percent_sales)),
            size=5,
            nudge_y=c(0,0.03,0,0)*sum(sales$num_sales)) +
            # adjust the nudge_y to avoid overlaps;
            # do not use position_jitter(), as it will cause gaps in the chart
            # a less painstaking solution is to use ggrepel::geom_text_repel()
  coord_polar(theta="y", start=0) +
  labs(fill="", title="Breakdown of the Revenue") +
  theme_void()

LS0tCnRpdGxlOiAiTW9uY2hyb21lIFBpZS9Eb251dCBDaGFydCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpXaHkgd291bGQgeW91IGV2ZXIgd2FudCB0byB1c2UgYSBwaWUgY2hhcnQuLi4/CmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoY29sb3JzcGFjZSkKYGBgCgojIFNhbXBsZSBEYXRhCmBgYHtyfQp0eXBlcyA8LSBjKCJGb290d2VhciIsIkFwcGFyZWwiLCJFcXVpcG1lbnQiLCJNaXNjZWxsYW5lb3VzIikKZmFjdG9yX3R5cGVzIDwtIGZhY3Rvcih0eXBlcywgbGV2ZWxzPXR5cGVzKQoKc2FsZXMgPC0gZGF0YS5mcmFtZSh0eXBlID0gZmFjdG9yX3R5cGVzLAogICAgICAgICAgICAgICAgICAgIG51bV9zYWxlcyA9IGMoNzk0NywzMjM3LDM4Nyw0OCkpICU+JQogIG11dGF0ZShwZXJjZW50X3NhbGVzID0gc2NhbGVzOjpwZXJjZW50KG51bV9zYWxlcy9zdW0obnVtX3NhbGVzKSkpCmBgYAoKIyBDb2xvciBQYWxldHRlCmBgYHtyfQpiYXNlX2NvbG9yIDwtICIjNDE1OThiIgpzYXR1cmF0aW9uX2RpZmYgPC0gMS8obGVuZ3RoKHR5cGVzKS0xKSAKIyBldmVubHkgc3BhY2Ugb3V0IHRoZSBwYWxldHRlIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY2F0ZWdvcmllcwojIHRoZSBjb2xvciB3aWxsIGJlIGhhcmQgdG8gdGVsbCBhcGFydCBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgY2F0ZWdvcmllcyEhCgojIHRoaXMgZnVuY3Rpb24gaXMgYWRhcHRlZCBmcm9tIEpvc2ggTydCcmllbidzIGFuc3dlciBvbiAjCiMgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjYzMTQ3MDEvci1yZWR1Y2luZy1jb2xvdXItc2F0dXJhdGlvbi1vZi1hLWNvbG91ci1wYWxldHRlCgpkZXNhdHVyYXRlX2J5IDwtIGZ1bmN0aW9uKGNvbG9ycywgYnkpIHsKICAgIFggPC0gZGlhZyhjKDEsIGJ5LCAxKSkgJSolIHJnYjJoc3YoY29sMnJnYihjb2xvcnMpKQogICAgaHN2KFhbMSxdLCBYWzIsXSwgWFszLF0pCn0KCnBhbGV0dGUgPC0gc2FwcGx5KHNlcSgxLDAsLXNhdHVyYXRpb25fZGlmZiksCiAgICAgICAgICAgICAgZnVuY3Rpb24oeCl7ZGVzYXR1cmF0ZV9ieShiYXNlX2NvbG9yLHgpfSkKYGBgCgoKIyBQbG90CmBgYHtyfQpwbG90RE9OVVQgPC0gYXMuZG91YmxlKFRSVUUpICAjIHNldCB0byBGQUxTRSBmb3IgYSBwaWUgY2hhcnQKd2lkdGggPC0gMC41ICAjIHdpZHRoIG9mIHRoZSBkb251dCAocmVsYXRpdmUgdG8gdGhlIHJhZGl1cyksIGRvZXMgbm90IGFmZmVjdCB0aGUgcGllIGNoYXJ0CnRleHRfZGlzdCA8LSBwbG90RE9OVVQgKyB3aWR0aC8yICsgMC4zICMgZGlzdGFuY2Ugb2YgdGhlIGxhYmVscyBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIGRvbnV0OyB0aGUgbGFzdCB0ZXJtIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBlZGdlCgpnZ3Bsb3QoZGF0YSA9IHNhbGVzLAogICAgICAgYWVzKHg9cGxvdERPTlVULCB5PW51bV9zYWxlcywgZmlsbD10eXBlLCB4bWF4PXBsb3RET05VVCt3aWR0aCwgeG1pbj0wKSkrCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD13aWR0aCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWxldHRlLCBicmVha3M9ZmFjdG9yX3R5cGVzKSsKICAjIHRoZSBzdGFja2VkIGJhciBjaGFydCBzdGFydHMgZnJvbSB0aGUgdG9wLCBoZW5jZSB0aGUgcmV2KCk6CiAgZ2VvbV90ZXh0KGFlcyh4PSB0ZXh0X2Rpc3QsCiAgICAgICAgICAgICAgICB5PWN1bXN1bShyZXYobnVtX3NhbGVzKSktcmV2KG51bV9zYWxlcykvMiwKICAgICAgICAgICAgICAgIGxhYmVsPXJldihwZXJjZW50X3NhbGVzKSksCiAgICAgICAgICAgIHNpemU9NSwKICAgICAgICAgICAgbnVkZ2VfeT1jKDAsMC4wMywwLDApKnN1bShzYWxlcyRudW1fc2FsZXMpKSArCiAgICAgICAgICAgICMgYWRqdXN0IHRoZSBudWRnZV95IHRvIGF2b2lkIG92ZXJsYXBzOwogICAgICAgICAgICAjIGRvIG5vdCB1c2UgcG9zaXRpb25faml0dGVyKCksIGFzIGl0IHdpbGwgY2F1c2UgZ2FwcyBpbiB0aGUgY2hhcnQKICAgICAgICAgICAgIyBhIGxlc3MgcGFpbnN0YWtpbmcgc29sdXRpb24gaXMgdG8gdXNlIGdncmVwZWw6Omdlb21fdGV4dF9yZXBlbCgpCiAgY29vcmRfcG9sYXIodGhldGE9InkiLCBzdGFydD0wKSArCiAgbGFicyhmaWxsPSIiLCB0aXRsZT0iQnJlYWtkb3duIG9mIHRoZSBSZXZlbnVlIikgKwogIHRoZW1lX3ZvaWQoKQpgYGA=