Как создать многогранный захват данных панели в R? - PullRequest
0 голосов
/ 30 апреля 2020

Я хотел бы создать многогранный график на основе данных панели. Хотя графическое представление данных панели только с одной переменной y относительно просто, я спрашиваю, как я могу создать график в R, используя несколько переменных y, которые должны отображаться на одном графике. Проблема в том, что у меня два "у". Каждый ggplot имеет (...aes(x=year, y=something, ...), но у меня есть два «у», а именно source1 и source2, и я не могу найти решение для создания многогранного графа, который содержит обе y-переменные в одном фасете. Пожалуйста, смотрите описание панели данных ниже. Данные панели, которые я хочу отобразить в R, выглядят так:

structure(list(id = c(46L, 46L, 46L, 113L, 113L, 113L, 238L, 
238L, 238L, 2224L, 2224L, 2224L, 5557L, 5557L, 5557L, 757L, 757L, 
757L, 8890L, 8890L, 8890L, 33335L, 33335L, 33335L, 48L, 48L, 
48L, 115L, 115L, 115L, 240L, 240L, 240L, 2226L, 2226L, 2226L, 
5559L, 5559L, 5559L, 1478L), area = structure(c(1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L), .Label = c("Australia and New Zealand", "Brazil", 
"Canada", "China", "India", "United States of America"), class = "factor"), 

Я создал данные панели в R:

panel <- pdata.frame(data, index = c("id", "year"), drop.index = FALSE)

Затем я попробовал этот график в ggplot:

    geom_area() +
    scale_fill_viridis(discrete = TRUE) +
    theme(legend.position="none") +
    ggtitle("Yield") +
    theme_ipsum() +
    theme(
      legend.position="none",
      panel.spacing = unit(0.1, "lines"),
      strip.text.x = element_text(size = 8),
      plot.title = element_text(size=14)
    ) +
    facet_wrap(~item)

однако он не отображает фасеты в области, а затем внутри каждого фасета значения значений source1 и source2 для каждой культуры. Я хотел бы создать что-то вроде этого:

enter image description here

Проблема становится еще более сложной, потому что у меня много измерений: площадь, предмет, годы и эти два у-переменные: источник1 и источник2. Наиболее важным является создание фасетов, которые показывают, что source1 и source2 отображаются в виде линий или полос для сравнения. Но проблема в том, как создать фасеты, которые показывают эти две переменные y по году, площади и элементу? И все это без создания переполненного графа.

Поскольку dc27 запросил примеры графа, другим возможным примером будет:

enter image description here

где source1 и source2 должны быть 2 бара рядом, показывая значения за год, за элемент и за область. Если у вас есть какие-либо другие предложения о том, как нанести на график данные панели, вы более чем приветствуем.

1 Ответ

1 голос
/ 30 апреля 2020

Хорошо, основываясь на вашем вопросе и обсуждении, вы хотите предоставить значения для average и GLOBIOM в качестве оси y, но всегда наносились рядом для сравнения различных элементов и областей.

Здесь возможный способ - повернуть интересующие вас столбцы для y в более длинном формате, используя, например, функцию pivot_longer:

library(tidyr)
library(dplyr)
library(ggplot2)

data %>% pivot_longer(cols = c(average, GLOBIOM), names_to = "Var", values_to = "val")

# A tibble: 80 x 10
      id area                      element item    year value   diff relat        Var       val
   <int> <fct>                     <fct>   <fct>  <int> <int>  <dbl> <fct>        <chr>   <dbl>
 1    46 Australia and New Zealand Yield   Barley  2000 20080  0.35  17.32673267  average  2.02
 2    46 Australia and New Zealand Yield   Barley  2000 20080  0.35  17.32673267  GLOBIOM  1.67
 3    46 Australia and New Zealand Yield   Barley  2010 18268  0.15  7.894736842  average  1.9 
 4    46 Australia and New Zealand Yield   Barley  2010 18268  0.15  7.894736842  GLOBIOM  1.75
 5    46 Australia and New Zealand Yield   Barley  2018 23044  0.6   24.3902439   average  2.46
 6    46 Australia and New Zealand Yield   Barley  2018 23044  0.6   24.3902439   GLOBIOM  1.86
 7   113 Australia and New Zealand Yield   Maize   2000 58727 -0.93  -15.6302521  average  5.95
 8   113 Australia and New Zealand Yield   Maize   2000 58727 -0.93  -15.6302521  GLOBIOM  6.88
 9   113 Australia and New Zealand Yield   Maize   2010 67515 -0.570 -8.177905308 average  6.97
10   113 Australia and New Zealand Yield   Maize   2010 67515 -0.570 -8.177905308 GLOBIOM  7.54
# … with 70 more rows

Затем вы можете использовать "val" для ось y и "var" в качестве аргумента fill для уклоненной диаграммы. Используя facet_grid, вы можете разделить данные для различных областей и предметов.

В целом, вы можете сделать что-то вроде этого:

library(tidyr)
library(dplyr)
library(ggplot2)

data %>% pivot_longer(cols = c(average, GLOBIOM), names_to = "Var", values_to = "val") %>%
  ggplot(aes(x = element, y = val, fill = Var))+
  geom_col(position = position_dodge())+
  facet_grid(area~item, scales = "free")

enter image description here

Это отвечает на ваш вопрос?


По вашему вопросу вы упоминаете, что график отображался за год, за элемент и за область. Один из способов сделать это - сделать:

data %>% pivot_longer(cols = c(average, GLOBIOM), names_to = "Var", values_to = "val") %>%
  ggplot(aes(x = as.factor(year), y = val, fill = Var))+
  geom_col(position = position_dodge())+
  facet_grid(area~item, scales = "free")+
  theme(axis.text.x = element_text(angle = 60, hjust =1))

enter image description here

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