Skip to content

Instantly share code, notes, and snippets.

@peterfoley
Last active August 23, 2017 23:36
Show Gist options
  • Save peterfoley/999374baac9241bc51383a1f32b8d13d to your computer and use it in GitHub Desktop.
Save peterfoley/999374baac9241bc51383a1f32b8d13d to your computer and use it in GitHub Desktop.
optimal pie chart
library(tidyverse)
## Loading tidyverse: ggplot2
## Loading tidyverse: tibble
## Loading tidyverse: tidyr
## Loading tidyverse: readr
## Loading tidyverse: purrr
## Loading tidyverse: dplyr
## Warning: package 'purrr' was built under R version 3.4.1
## Warning: package 'dplyr' was built under R version 3.4.1
## Conflicts with tidy packages ----------------------------------------------
## filter(): dplyr, stats
## lag():    dplyr, stats
library(ggplot2)
library(extrafont)
## Registering fonts with R
loadfonts(quiet = T)

dat <- frame_data(
~label, ~size, ~lstart, ~lend, ~lrad, ~tang, ~trad,
"Indie- 7%", 10, .5, .6, .2, .6, .25,
"Pop- 5%", 5, .6, 1, .2, 1.5, .4, 
"Hip Hop- 15%", 30, .7, .75, .2, .7, .4,  
"Rap- 15%", 10, .3, .7, .2, .8, .3,
"Rock-25%", 50, .55, .6, .2, .6, .3, 
"Dub Step- 5%", 8, .6, .9, .2, 1, .3, 
"Country- 20%", 30, .5, .5, .2, .5, .3, 
"80's & 90's\nHits- 15%", 20, .4, .7, .2, .65, .4,  
"Today's Hits- 20%", 25, .6, .55, .2, .55, .25
) %>%
  mutate(labelpos = cumsum(size)-size/2,
         lstart = cumsum(size)-size+size*lstart,
         lend = cumsum(size)-size+size*lend,
         tang = cumsum(size)-size+size*tang)

piecolor = colorspace::RGB(130/255, 150/255, 90/255) %>% colorspace::hex()

lrmar = 200
tbmar = 0
ggplot(data=dat, aes(x=factor(1), group=factor(label, levels=rev(label)), y=size, label=label)) + 
  geom_bar(stat='identity', fill=piecolor, color="black", size=0, width = 1) + 
  geom_segment(aes(x=.5,xend=1.5,y=cumsum(size),yend=cumsum(size)), size=1) + 
  geom_segment(aes(x=1.5, xend=1.5+lrad, y=lstart, yend=lend), color="darkred", size=1) + 
  geom_text(aes(x=1.5+trad, y=tang, label=label)) + 
  coord_polar(theta="y") + 
  scale_y_continuous(breaks = c(), labels=c(), name='', minor_breaks = NULL) + 
  scale_x_discrete(name='',breaks=c(),labels=c()) +
  theme(panel.background = element_blank(),
        plot.title = element_text(hjust = .5, size=48, 
                                  family = "Myriad Pro Cond", margin = margin(100,0,-20,0))) + 
  ggtitle("YOUR FAVORITE GENRE")

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment