Суммирование данных в процентах для параллельных гистограмм в R - PullRequest
0 голосов
/ 20 марта 2020

Ниже приведен код, с которым у меня возникли проблемы, и его вывод. Набор данных связан в нижней части поста.

  1. Я хочу сгруппировать StateCodes вместе с каждым MSN (в отличие от того, что сейчас отображается в выходных данных).
  plotdata <- EnergyData %>% 
  filter(MSN %in% c("BMTCB", "GETCB", "HYTCB", "SOTCB", "WYTCB")) %>%
  filter(Year %in% c("2009")) %>%
  select(StateCode, MSN, Data) %>%
  group_by(StateCode) %>%
  mutate(pct = Data/sum(Data),
         lbl = scales::percent(pct))
  plotdata 

Это приводит к:

Output

Я думал, что функция group_by сделает это для меня, но я хотел бы знать, если я пропускаю ключевой кусок кода?

Как только вышеуказанный блок работает правильно, я хочу создать столбчатые диаграммы бок о бок с помощью StateCode, используя проценты каждого из 5 MSN.

Вот код, который у меня пока есть.

  ggplot(EnergyData, 
       aes(x = factor(StateCode,
                      levels = c("AZ", "CA", "NM", "TX")),
           y = pct,
           fill = factor(drv, 
                         levels = c("BMTCB", "GETCB", "HYTCB", "SOTCB", "WYTCB"),
                         labels = c("BMTCB", "GETCB", "HYTCB", "SOTCB", "WYTCB")))) + 
  geom_bar(stat = "identity",
           position = "fill") +
  scale_y_continuous(breaks = seq(0, 1, .2), 
                     label = pct) +
  geom_text(aes(label = lbl), 
            size = 3, 
            position = position_stack(vjust = 0.5)) +
  scale_fill_brewer(palette = "Set2") +
  labs(y = "Percent", 
       fill = "MSN",
       x = "State",
       title = "Renewable Resources by State") +
  theme_minimal()

На данный момент я считаю, что все это связано с тем, как я создаю проценты для гистограмм.

Любая помощь будет великолепной. Спасибо!

Вот данные, которые я использовал Данные об энергии http://www.mathmodels.org/Problems/2018/MCM-C/ProblemCData.xlsx

1 Ответ

0 голосов
/ 21 марта 2020

Вот версия, использующая data.table для начальной фильтрации, и изменения в функции графика, которые, как мы надеемся, дадут вам результат, который вам нужен:

library(readxl)
library(data.table)
library(ggplot2)

download.file("http://www.mathmodels.org/Problems/2018/MCM-C/ProblemCData.xlsx", "~/ex/ProblemCData.xlsx")

# by default, factor levels will be in alphabetical order, so we do not need to specify that
EnergyData <- data.table(read_xlsx("~/ex/ProblemCData.xlsx"), key="StateCode", stringsAsFactors = TRUE)

# filter by Year and MSN list
plotdata <- EnergyData[as.character(MSN) %chin% c("BMTCB", "GETCB", "HYTCB", "SOTCB", "WYTCB") & Year == 2009]

# calculate percentages of Data by StateCode
plotdata[, pct := Data/sum(Data), by = "StateCode"]

# plot using percent format and specified number of breaks
ggplot(plotdata, 
       aes(x = StateCode,
           y = pct,
           fill = MSN)) + 
    geom_bar(stat = "identity",
             position = "fill") +
    scale_y_continuous(labels = scales::percent_format(accuracy = 1), n.breaks = 6) +
    scale_fill_brewer(palette = "Set2") +
    labs(y = "Percent", 
         fill = "MSN",
         x = "State",
         title = "Renewable Resources by State") +
    theme_minimal()

Создано в 2020-03-20 пакетом представ. (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...