Мне нужно найти способ объединить следующие графики на основе face_grid (geom_col и geom_line) в один, где вторая ось y справа содержит значения осей из графика geom_line.
geom_line plotдля объединения в сюжет geom_col:
Код:
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()
И получил следующие графики:
Я не могу найти способ отрегулировать вспомогательную ось Y, чтобы она отличалась от основной слева.Мне нужно показать отрицательные значения следующим образом:
Редакция 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
Любые предложения приветствуются.