ggplot2 p ie и пончик на одном участке с только сводными данными - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь создать что-то похожее на этот график из пакета MoonBook, как показано здесь

enter image description here

Мои данные касается участия в программах телеработы для нескольких десятков организаций, и все, что у меня есть, это общий процент, а не индивидуальные ответы.

Так что для Организации X я знаю:

Telework rate: 33%
No telework rate: 67%

Для тех, кто занимается телеработой их частоты:

Very infrequently: 19.8%
1-2 days/month: 4.8%
1-2 days/week: 7.9%
3-4 days/week: 0.4%
Every work day: 0.1%

Для тех, кто не телеработы, их причины:

Must be physically present: 11.5%
Technical limitations: 7.1%
Not authorized: 25.5%
Choose not to: 23.9%

Я бы хотел центральный p ie, чтобы показать телеработу / нет -произведение работы для данной организации и внешнего пончика, чтобы показать частоту / причину. Но я не знаю, как поступить, потому что практически каждый найденный пример начинается с индивидуальных ответов.

1 Ответ

2 голосов
/ 07 февраля 2020

Вот решение, которое может быть очень близко к тому, что вы ищете.

Я использовал некоторые данные, похожие на то, что вы показали:

df<-data.frame(Org=c("Tele",rep(c("Tele","NotTele"),each=4)),
                     CatFreq = LETTERS[1:9],
               Freq = c(19.8,4.8,7.9,0.4,0.1,11.5,7.1,25.5,22.9))

Остальная часть кода

library(tidyverse)

df %>%
  #Calculate cumulative sums
  mutate(cumsum = cumsum(Freq),
         min = cumsum-Freq) %>%
  #Calculate cumulative sums by Org
  group_by(Org) %>%
  mutate(cumsum2 = max(cumsum(Freq))) %>%
  ungroup() %>%
  #Get mid point to print labels for Org levels
  mutate(mid = ifelse(Org == "Tele", cumsum2 / 2, min(cumsum2) + (max(cumsum2)/2) ) ) %>%
  #Do the ggplot by doing two geom_rect, 1 for Org, 1 for CatFreq
  ggplot()+
  geom_rect(aes(xmin = 1,
                xmax = 2,
                ymin = min, 
                ymax = cumsum,
                fill = Org))+
  #Add labels for Org
  geom_text(aes(x = 1 + ((2 - 1)/2), 
                y = mid,
                label = paste(Org, paste0(cumsum2, "%"), sep= "\n"))) +
  geom_rect(aes(xmin = 2,
                xmax = 3,
                ymin = min, 
                ymax = cumsum,
                fill = CatFreq))+
  #Add labels for CatFreq
  geom_text(aes(x = 2 + ((3 - 2)/2), 
                y = min + ((cumsum - min)/2),
                label = paste(CatFreq, paste0(Freq, " %"), sep= "\n"))) +
  #Changing the plot to pie
  coord_polar("y", start = 0) +
  #Making it a doughnut
  xlim(c(0,4)) + 
  #Set theme void
  theme_void() +
  #Eliminate legend
  theme(legend.position = "none")

enter image description here

...