Как вызвать специфические c идентификаторы или переменные в ggplot2? - PullRequest
0 голосов
/ 19 апреля 2020

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

Или в формате txt:

id  area    element item    year    value   source1 source2 diff    relative
46  Australia   Yield   Barley  2000    20080   2.02    1.67    0.35    17.32673267
46  Australia   Yield   Barley  2010    18268   1.9 1.75    0.15    7.894736842
46  Australia   Yield   Barley  2018    23044   2.46    1.86    0.6 24.3902439
113 Australia   Yield   Maize   2000    58727   5.95    6.88    -0.93   -15.6302521
113 Australia   Yield   Maize   2010    67515   6.97    7.54    -0.57   -8.177905308
113 Australia   Yield   Maize   2018    82594   8   8.54    -0.54   -6.75
238 Australia   Yield   Potatoes    2000    314873  33.74   7.33    26.4    78.27504446
238 Australia   Yield   Potatoes    2010    383895  38.73   7.81    30.92   79.83475342
238 Australia   Yield   Potatoes    2018    426258  42.39   8.56    33.82   79.80655815
2224    Australia   Yield   Rapeseed    2000    12177   1.23    1.11    0.12    9.756097561
2224    Australia   Yield   Rapeseed    2010    11261   1.12    1.23    -0.11   -9.821428571
2224    Australia   Yield   Rapeseed    2018    12280   1.39    1.36    0.03    2.158273381
5557    Australia   Yield   Soybeans    2000    18714   1.87    2.08    -0.21   -11.22994652
5557    Australia   Yield   Soybeans    2010    19042   1.84    2.24    -0.4    -21.73913043
5557    Australia   Yield   Soybeans    2018    17027   1.81    2.43    -0.62   -34.25414365
757 Australia   Yield   SugC    2000    0   0   27.45   -27.45  #DIV/0!
757 Australia   Yield   SugC    2010    0   0   28.76   -28.76  #DIV/0!
757 Australia   Yield   SugC    2018    0   0   30.27   -30.27  #DIV/0!
8890    Australia   Yield   Sunflower seed  2000    10494   1.08    1.02    0.06    5.555555556
8890    Australia   Yield   Sunflower seed  2010    15414   1.25    1.13    0.12    9.6
8890    Australia   Yield   Sunflower seed  2018    18235   1.32    1.26    0.06    4.545454545
33335   Australia   Yield   Wheat   2000    18398   1.9 1.51    0.4 20.52631579
33335   Australia   Yield   Wheat   2010    15987   1.75    1.73    0.02    1.142857143
33335   Australia   Yield   Wheat   2018    19444   2.19    1.99    0.2 9.132420091
48  Brazil  Yield   Barley  2000    19437   2.12    1.88    0.25    11.32075472
48  Brazil  Yield   Barley  2010    33115   3.12    2.08    1.04    33.33333333
48  Brazil  Yield   Barley  2018    32591   3.31    2.33    0.98    29.60725076
115 Brazil  Yield   Maize   2000    27182   2.97    2.64    0.33    11.11111111
115 Brazil  Yield   Maize   2010    43667   4.1 3.76    0.34    8.292682927
115 Brazil  Yield   Maize   2018    51044   5   5.13    -0.13   -2.6
240 Brazil  Yield   Potatoes    2000    171813  17.38   3.59    13.79   79.34407365
240 Brazil  Yield   Potatoes    2010    258859  25.66   3.92    21.74   84.72330475
240 Brazil  Yield   Potatoes    2018    311760  30.59   4.32    26.27   85.87773782
2226    Brazil  Yield   Rapeseed    2000    17083   1.59    1.86    -0.26   -16.98113208
2226    Brazil  Yield   Rapeseed    2010    15217   1.37    2.22    -0.84   -62.04379562
2226    Brazil  Yield   Rapeseed    2018    12500   1.3 2.66    -1.36   -104.6153846
5559    Brazil  Yield   Soybeans    2000    24033   2.5 2.28    0.22    8.8
5559    Brazil  Yield   Soybeans    2010    29475   2.9 2.58    0.32    11.03448276
5559    Brazil  Yield   Soybeans    2018    33903   3.22    2.95    0.28    8.385093168
1478    Brazil  Yield   SugC    2000    0   0   15.01   -15.01  #DIV/0!
1478    Brazil  Yield   SugC    2010    0   0   16.43   -16.43  #DIV/0!
1478    Brazil  Yield   SugC    2018    0   0   18.2    -18.2   #DIV/0!
8892    Brazil  Yield   Sunflower seed  2000    16724   1.53    1.55    -0.01   -1.307189542
8892    Brazil  Yield   Sunflower seed  2010    11322   1.21    1.77    -0.57   -46.28099174
8892    Brazil  Yield   Sunflower seed  2018    16064   1.55    2.05    -0.5    -32.25806452
33337   Brazil  Yield   Wheat   2000    15156   1.81    1.43    0.38    20.99447514
33337   Brazil  Yield   Wheat   2010    28288   2.52    1.94    0.59    23.01587302
33337   Brazil  Yield   Wheat   2018    26238   2.69    2.56    0.13    
...and so on

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

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

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

ggplot(df, aes(x=year, y=diff, group=area, fill=area)) +
    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 Ответ

0 голосов
/ 20 апреля 2020

Здесь возможное решение вашего вопроса - создать переменную, которая будет группировать посевы два на два, и вы можете использовать ее в функции facet_wrap.

Давайте рассмотрим этот поддельный пример, который создаст 6 регионов с 6 различные культуры с одним значением в год в течение 12 лет.

df <- data.frame(Region = rep(paste("Region",1:6, sep = "_"), each = 12*6),
                 Crop = rep(paste("Crop",1:6, sep ="_"), 12*6),
                 Year = rep(paste("Year",1:12, sep ="_"), each = 6),
                 Value = runif(432,min = -1, max = 1))

Теперь, используя dplyr, мы можем рассчитать среднее значение для каждой культуры по региону за 12 лет и добавить группу панелей:

library(dplyr)

df %>% group_by(Region,Crop) %>%
  summarise(Mean = mean(Value)) %>%
  mutate(Panel = rep(paste("Panel",1:3), each = 2)) 

# A tibble: 36 x 4
# Groups:   Region [6]
   Region   Crop       Mean Panel  
   <fct>    <fct>     <dbl> <chr>  
 1 Region_1 Crop_1  0.0323  Panel 1
 2 Region_1 Crop_2  0.200   Panel 1
 3 Region_1 Crop_3  0.00647 Panel 2
 4 Region_1 Crop_4 -0.243   Panel 2
 5 Region_1 Crop_5 -0.433   Panel 3
 6 Region_1 Crop_6 -0.128   Panel 3
 7 Region_2 Crop_1  0.0655  Panel 1
 8 Region_2 Crop_2 -0.174   Panel 1
 9 Region_2 Crop_3  0.316   Panel 2
10 Region_2 Crop_4 -0.131   Panel 2
# … with 26 more rows

Теперь, если вы добавите эту последовательность труб в ggplot, вы можете разделить свой урожай два на два.

df %>% group_by(Region,Crop) %>%
  summarise(Mean = mean(Value)) %>%
  #mutate(Group_Crop = as.numeric(factor(Crop))) %>%
  mutate(Panel = rep(paste("Panel",1:3), each = 2)) %>%
  ggplot(aes(x = Region, y = Mean, fill = Crop))+
  geom_col()+
  facet_wrap(~Panel, nrow = 1)+
  theme(legend.position = "top", axis.text.x = element_text(angle = 90, size=12), plot.title = element_text(hjust = 0.5))+
  geom_hline( yintercept=0, linetype="dashed")+
  labs(title="Average growth rate of yield tonne/ha in selected regions")

enter image description here

Это то, что вы ищете?

...