= ---
title: "Code_Figure3.Rmd"
output: html_document
date: "2023-08-07"
---
#1.安装并加载R包
```{r}
#install.packages("tidyverse")
#install.packages("ggplot2")
#install.packages("scales")
library(tidyverse)
library(ggplot2)
library(scales)
```
#2.加载数据
```{r}
Global_2019_AgeandSex <- read.csv('./data/Global_2019_AgeandSex.csv')
```
#3.数据清洗(3.1字符串;3.2筛选行与列;3.3确定用于作图的变量内部的顺序)
```{R}
##3.1 字符串(如1-4 year)预处理
Global_2019_AgeandSex$age_name <- str_split(Global_2019_AgeandSex$age_name, ' ', simplify = T)[,1]
##3.2 筛选行与列 (20age_groups * 2sex * 2metric = 80)
Global_2019_AgeandSex_Prevalance <- Global_2019_AgeandSex %>%
select("location_name","year","sex_name","age_name","measure_name","metric_name","val","upper","lower") %>%
filter(location_name == "Global",
year == "2019",
age_name %in% c("1-4","5-9","10-14","15-19","20-24","25-29","30-34","35-39","40-44","45-49","50-54","55-59","60-64","65-69","70-74","75-79","80-84","85-89","90-94","95+"),
sex_name %in% c("Male","Female"),
measure_name == 'Prevalence',
metric_name %in% c('Number', 'Rate')) %>%
mutate(val = if_else(metric_name == 'Number', val/1000000,val/(1000*10/3)), #条件表达式if_else
upper = if_else(metric_name == 'Number', upper/1000000,upper/(1000*10/3)),
lower = if_else(metric_name == 'Number', lower/1000000,lower/(1000*10/3)))
##3.3 确定作图相关的变量(年龄、性别)内部信息的顺序(如 男性、女性 vs 女性、男性)
Global_2019_AgeandSex_Prevalance$age_name <- factor(Global_2019_AgeandSex_Prevalance$age_name, levels = c('1-4','5-9','10-14','15-19','20-24','25-29','30-34','35-39','40-44','45-49','50-54','55-59','60-64','65-69','70-74','75-79','80-84','85-89','90-94','95+'))
Global_2019_AgeandSex_Prevalance$sex_name <- factor(Global_2019_AgeandSex_Prevalance$sex_name, levels = c('Male', 'Female'))
```
#4.画图(bar + errorbar + line*3 + 坐标轴[xlab, scale_y_continous] +图例 + 主题)
```{r}
plot <- ggplot() +
# 添加左边纵坐标轴和柱状图
geom_col(data = subset(Global_2019_AgeandSex_Prevalance, metric_name == "Number"), aes(x = age_name, y = val, fill = sex_name), width = 0.6,position = position_dodge(width = 0.6)) +
# 添加柱状图的误差线
geom_errorbar(data = subset(Global_2019_AgeandSex_Prevalance, metric_name == "Number"), aes(x = age_name, ymin = lower, ymax = upper, group = sex_name),width = 0.3,position = position_dodge(width = 0.6)) +
# 添加折线图(3组,val, lower, upper)
geom_line(data = subset(Global_2019_AgeandSex_Prevalance, metric_name == "Rate"), aes(x = age_name, y = val, group = sex_name, color = sex_name),linetype = "dashed",size = 1) +
geom_line(data = subset(Global_2019_AgeandSex_Prevalance, metric_name == "Rate"), aes(x = age_name, y = upper, group = sex_name, color = sex_name), linetype = "dashed") +
geom_line(data = subset(Global_2019_AgeandSex_Prevalance, metric_name == "Rate"), aes(x = age_name, y = lower, group = sex_name, color = sex_name),linetype = "dashed") +
# 手动设置图例,针对左边的纵坐标轴,scale_fill_manual里面的fill对应柱状图,所以图例名称设置为Number
scale_fill_manual(name = "Number", values = c("Male" = "#6B58A6", "Female" = "#FCAF17"), guide = "legend") +
# 手动设置图例,针对右边的纵坐标轴,scale_color_manual里面的color对应线图,所以图例名称设置为Rate
scale_color_manual(name = "Rate", values = c("Male" = "#D30F8C", "Female" = "#0871B9"), guide = "legend") +
# 设置主题(背景网格、图例[位置、标题、大小]、坐标轴)
theme_bw() +
theme(panel.grid.minor = element_blank(),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
legend.position = 'top',
legend.title = element_blank(),
legend.key.size = unit(0.3, "cm"),
axis.text = element_text(size = 6),
axis.text.x = element_text(angle = 30, vjust = 1, hjust = 1),
axis.text.y.left = element_text(margin = margin(r = 0)),
axis.text.y.right = element_text(margin = margin(r = 0)),
axis.title = element_text(size = 8),
axis.ticks = element_blank()) +
# 设置两个纵坐标轴(主 + 辅助),主纵坐标轴(左边)辅助纵坐标轴(右边)的name、数值关系、范围
scale_y_continuous(
name = "Total prevalent cases (millions)",
sec.axis = sec_axis(~ .*10/3, name = "Prevalence per 100,000 \n population (000s)"),
breaks = seq(0, 18, by = 3),
limits = c(0, 18),expand = c(0,0)) +
xlab('Age group (years)')
```
#5.文件保存
```{R}
ggsave(plot, file = './output/Prevalence_age_and_sex_2019.pdf',units = 'cm', height = 6, width = 10)
```