Создание кольцевых диаграмм с ggplot2 и группировка переменных - PullRequest
1 голос
/ 13 апреля 2019

извинения, если на этот вопрос уже дан ответ, но я пробовал код из многих постов, но безрезультатно. Я пытаюсь сделать кольцевую диаграмму в ggplot 2, которая является новой для меня. Похоже, что он работает по большей части, но не группирует страны, так что вместо этого каждая строка получает свой кусок в круговой диаграмме, вместо того, чтобы собрать все строки в Соединенном Королевстве (извините, если это не совсем удобно).

Вот код с некоторыми примерами данных (на самом деле у меня 14 стран и 1200 строк):

  country <- c("Australia", "Australia", "China", "UK", "UK", "UK", "Australia", "New Zealand", "Hong Kong", "India", "India", "Korea", "Malaysia", "UK")
  GAV <- c(32626614, 611751827, 1070038943.77, 1070038990, 611751347, 567751827, 444751827, 611751444, 999751827, 111751827, 222751827, 331751827, 611751844, 611777827)

panel_donut <- data.frame(country, GAV)

удалить строки с помощью NA GAV

panel_donut <- panel_donut[!is.na(panel_donut$GAV),]

рассчитать процент

panel_donut$percentage <-  panel_donut$GAV / sum(panel_donut$GAV)* 100

panel_donut <-  panel_donut[rev(order(panel_donut$percentage)), ]

panel_donut$ymax <-  cumsum(panel_donut$percentage)

panel_donut$ymin <-  c(0, head(panel_donut$ymax, n = -1))

panel_donut

изменить цветовые уровни

panel_donut <-  panel_donut[order(panel_donut$country), ]

построение графика

library(ggplot2)
library(ggrepel)

donut <-  ggplot(panel_donut, aes(fill = country, ymax = ymax, ymin = ymin, xmax = 100, xmin = 80)) +

  geom_rect(colour = "black") +

  coord_polar(theta = "y") + 

  xlim(c(0, 100)) +

  theme(legend.title = element_text(colour = "black", size = 16, face = "bold"), 
    legend.text = element_text(colour = "black", size = 15), 
    panel.grid = element_blank(),
    axis.text = element_blank(),
    axis.title = element_blank(),
    axis.ticks = element_blank())

donut

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

Заранее спасибо за любую помощь!

1 Ответ

2 голосов
/ 13 апреля 2019

да, ваш основной информационный фрейм содержит несколько записей ваших стран. Вы должны обобщить их. попробуйте этот подход:

library(ggplot2)
library(ggrepel)
library(dplyr)

panel_donut %>% 
  group_by(country) %>% 
  summarise(percentage = sum(percentage)) %>% 
  mutate(ymax = cumsum(percentage), 
         ymin = c(0, head(ymax, n = -1))) %>% 
  ggplot(aes(fill = country, ymax = ymax, ymin = ymin, xmax = 100, xmin = 80)) +
  geom_rect(colour = "black") +
  coord_polar(theta = "y") +
  xlim(c(0, 100)) +
  scale_fill_brewer(palette = "Set1") +
  theme(legend.title = element_text(colour = "black", size = 16, face = "bold"), 
        legend.text = element_text(colour = "black", size = 15), 
        panel.grid = element_blank(),
        axis.text = element_blank(),
        axis.title = element_blank(),
        axis.ticks = element_blank())

вывод:

enter image description here

хотя я предлагаю более простой подход с теми же библиотеками:

data.frame(country, GAV) %>% 
  filter(!is.na(GAV)) %>% 
  mutate(percentage = GAV / sum(GAV) * 100) %>% 
  group_by(country) %>% 
  summarise(percentage = sum(percentage)) %>% 
  mutate(ymax = cumsum(percentage), 
         ymin = c(0, head(ymax, n = -1))) %>% 
  ggplot(aes(fill = country, ymax = ymax, ymin = ymin, xmax = 100, xmin = 80)) +
  geom_rect(colour = "black") +
  coord_polar(theta = "y") +
  xlim(c(0, 100)) +
  scale_fill_brewer(palette = "Set1", guide = "none") +
  theme(legend.title = element_text(colour = "black", size = 16, face = "bold"), 
        legend.text = element_text(colour = "black", size = 15), 
        panel.grid = element_blank(),
        axis.text = element_blank(),
        axis.title = element_blank(),
        axis.ticks = element_blank()) +
  geom_label_repel(aes(label = paste(country, "\n", round(percentage, 1),"%"), 
                       x = 100, 
                       y = (ymin + ymax)/2),
                   inherit.aes = F, 
                   show.legend = F, size = 3) +
  annotate("text", x = 0, y = 0, size = 15, label = "Donut Chart")

выход:

enter image description here

...