Объедините два графика facet_grid в один с двойной осью в R, используя ggplot2 и другие пакеты - PullRequest
1 голос
/ 19 сентября 2019

Мне нужно найти способ объединить следующие графики на основе face_grid (geom_col и geom_line) в один, где вторая ось y справа содержит значения осей из графика geom_line.

geom_line plotдля объединения в сюжет geom_col: enter image description here

Код:

geomlineplot <- ggplot(s1, aes(year, val, colour=scenario)) +   
   geom_line(size=1) + 
   facet_grid(metric + units ~scenario, 
              scales="free", 
              space="fixed" ,
              switch = "y" #,
  ) +
   scale_x_continuous(breaks=c(2010, 2030, 2050)) +
   ylab(NULL) +
   theme_bw()+
   theme(strip.background = element_blank(),
         strip.placement = "outside",
         panel.grid = element_blank(),
         axis.text.x = element_text(color="black"),
         axis.text.y = element_text(color="black"),
         panel.grid.major.x = element_line( size=.1, color="grey", linetype = 2 ),
         panel.grid.major.y = element_line( size=.1, color="grey", linetype = 2 ),
         text = element_text(size = 14))+
   scale_fill_nejm()

geomlineplot 


geomcolplot <- ggplot(d1, aes(year, val, fill=fuel)) + 
  geom_col() + 
  facet_grid(metric + units ~scenario, 
             scales="free", 
             space="fixed" ,
             switch = "y" #,
  ) +
  scale_x_continuous(breaks=c(2010, 2030, 2050)) +
  ylab(NULL) +
  theme_bw()+
  theme(strip.background = element_blank(),
        strip.placement = "outside",
        panel.grid = element_blank(),
        axis.text.x = element_text(color="black"),
        axis.text.y = element_text(color="black"),
        panel.grid.major.x = element_line( size=.1, color="grey", linetype = 2 ),
        panel.grid.major.y = element_line( size=.1, color="grey", linetype = 2 ),
        text = element_text(size = 14))+
  scale_fill_nejm()

geomcolplot

Воспроизводимый пример в следующей ссылке

Пример данных

head(s)

ind scenario metric year technology units       val
1      capex    CO2 2010     boiler    kt   2.7076010
2      capex    CO2 2020     boiler    kt   3.3035754
3      capex    CO2 2030     boiler    kt -13.7159506
4      capex    CO2 2040     boiler    kt  -0.7460066
5      capex    CO2 2050     boiler    kt  -0.8332908
6 capex_opex    CO2 2010     boiler    kt   2.7076010


head(d)
  scenario metric year technology fuel units     val
1   no_gas    CO2 2010     boiler Coal  [kt] 18.32111
2   no_gas    CO2 2020     boiler Coal  [kt] 24.73643
3   no_gas    CO2 2030     boiler Coal  [kt] 39.11132
4   no_gas    CO2 2040     boiler Coal  [kt] 36.91286
5   no_gas    CO2 2050     boiler Coal  [kt] 42.62070
6   no_gas    CO2 2010     boiler  HFO  [kt] 43.45440

Оба кадра данных имеют разные размеры (тусклые).Я считаю, что решение где-то там.

Кроме того, график geom_line не содержит значений для no_gas, как на графике geom_col, потому что результаты первого сравниваются со значениями no_gas.

Отредактировано:

Я провел некоторые манипуляции с данными и получил новый фрейм данных:

head(df_m)
  scenario metric year technology fuel units.x   value.x  value.y
1    capex    CO2 2010     boiler Coal    [kt] 11.856870 2.191325
2    capex    CO2 2010     boiler  HFO    [kt] 28.495898 2.191325
3    capex    CO2 2010     boiler  PNG    [kt] 22.314777 2.191325
4    capex    CO2 2010     boiler  LDO    [kt]  3.841344 2.191325
5    capex    CO2 2020     boiler  PNG    [kt] 38.827712 2.673661
6    capex    CO2 2020     boiler Coal    [kt] 16.006775 2.673661


ggplot(df_m, aes(year, value.x, fill=fuel)) + 
  geom_col() + 
  ## ATEMPT 1
  geom_line(aes(x=year, y=value.y*(1)), size=1, colour = "grey")+
  ## ATEMPT 2
  #geom_line(aes(x=year, y=value.y*(-1)), size=1, colour = "grey")+
  facet_grid(metric + units.x ~scenario, 
             scales="free", 
  ## ATEMPT 3
             #scales="free_y", 
             space="fixed" ,
             switch = "y" #,
  ) +
  scale_x_continuous(breaks=c(2010, 2030, 2050)) +
  scale_y_continuous(sec.axis = sec_axis(~./(1), name = "Emission savings comparison"))+
  ylab(NULL) +
  theme_bw()+
  theme(strip.background = element_blank(),
        strip.placement = "outside",
        panel.grid = element_blank(),
        axis.text.x = element_text(color="black"),
        axis.text.y = element_text(color="black"),
        panel.grid.major.x = element_line( size=.1, color="grey", linetype = 2 ),
        panel.grid.major.y = element_line( size=.1, color="grey", linetype = 2 ),
        text = element_text(size = 14),
        legend.position="bottom")+
  scale_fill_nejm()

И получил следующие графики:

enter image description here

enter image description here

Я не могу найти способ отрегулировать вспомогательную ось Y, чтобы она отличалась от основной слева.Мне нужно показать отрицательные значения следующим образом:

enter image description here

Редакция 2: Код для получения df_m:

df_m <- merge(d1, savings, by = c("scenario", "metric", "year",  "technology"), all = T)
df_m  <- mutate(df_m, value.y = ifelse(is.na(value.y), 0, value.y))
df_m <- df_m %>% select(-units.y)

#savings is quite long and comes from other dataframes

Любые предложения приветствуются.

...