R ggplot2 несколько сюжет в цикле - PullRequest
0 голосов
/ 02 июля 2018

Привет, ребята, Я совсем новичок в R и ggplot2. Я делаю анализ набора данных об американских рейсах с 1987 по 2008 год: набор данных

Это просто для ознакомления. Моя проблема в том, что я хочу показать распределение задержек по годам, но лет 22, и я не думаю, что написать в 22 раза больше строк кода:

percDepDelays<- depDelaysByYear$`count(DepDelay)` / allFlights$`count(*)`
percArrDelays <- arrDelaysByYear$`count(ArrDelay)` / allFlights$`count(*)`
percAntDepdelays <- antDepDelaysByYear$`count(DepDelay)` / allFlights$`count(*)`
percAntArrDelays <- antArrDelaysByYear$`count(ArrDelay)` / allFlights$`count(*)`

slices <- c(percDepDelays[1], percArrDelays[1], percAntDepdelays[1], percAntArrDelays[1])
pct <- round(slices/sum(slices) * 100, 2)

percentageData <- data.frame(Year = "1987",
                             Percentage = pct,
                             TypeOfDelays = factor(c("Departure delays", "Arrival Delays", "Early Departure", "Early arrival")))
labels <- c("Departure delays", "Arrival Delays", "Early Departure", "Early arrival")

p <- ggplot(data = percentageData, aes(x="", y = Percentage, fill = TypeOfDelays)) +
  geom_bar(stat = "identity", width = 1) + 
  geom_text(aes(label = paste0(Percentage,' %')), position = position_stack(vjust = 0.5)) +
  coord_polar(theta = "y", start = 0) +
  theme_void()

Я использую приведенный выше код, чтобы показать в виде процента на круговой диаграмме количество каждой задержки для каждого года, очевидно, для каждого года изменения данных, и это причина, почему мне нужен цикл, что я ' я пробовал это:

p <- vector()
while (i < length(percDepDelays)) {

  slices <- c(percDepDelays[i], percArrDelays[i], percAntDepdelays[i], percAntArrDelays[i])
  pct <- round(slices/sum(slices) * 100)
  percentageData <- data.frame(Year = yearsLabels[i],
                             Percentage = pct,
                             TypeOfDelays = factor(c("Departure delays", "Arrival Delays", "Early Departure", "Early arrival")))
  labels <- c("Departure delays", "Arrival Delays", "Early Departure", "Early arrival")
  p[i] <- ggplot(data = percentageData, aes(x="", y = Percentage, fill = TypeOfDelays)) +
            geom_bar(stat = "identity", width = 1) +
            geom_text(aes(label = paste0(Percentage,' %')), position = position_stack(vjust = 0.5)) +
            coord_polar(theta = "y", start = 0) +
            theme_void()
  i = i + 1
}

На практике я помещаю все графики ggplot в массив, а затем я бы использовал ggarrange, чтобы собрать все вместе на одном экране. Проблема в том, что в векторе p хранится структура data.frame, используемая для построения графика (я хочу помнить, что данные меняются за каждый год, это причина, по которой мне нужен цикл), это действительно странно, потому что вне цикла ( первый код) все работает нормально, p является классом ggplot. Итак, как я могу решить эту проблему? Есть способ объединить большое количество сюжетов без написания тысяч и тысяч одинаковых строк кода?

Спасибо за помощь

1 Ответ

0 голосов
/ 02 июля 2018

Я бы порекомендовал использовать структуру списка.

p <- list()

, а затем при присвоении списку использовать второй индекс

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