基于GBD数据绘图之——双Y轴图

本文详细介绍了如何使用R语言中的ggplot2库,基于GBD2019数据库中的中国结直肠癌数据,绘制发病数和发病率的双Y轴图,展示了数据整理和图形制作过程。
摘要由CSDN通过智能技术生成

GBD简介

GBD数据库由美国华盛顿大学健康测量和评价研究中心 ( Institute for Health Metrics and Evaluation ,IHME )的全球疾病负担( GBD )项目研究组牵头建立,提供了自 1990 年以来全球 204 个国家和地区的 369种疾病、伤害和健康危险因素的流行病学数据 ,并定期对数据库进行更新发布。近期对疾病负担研究颇感兴趣,在日常监测数据中也会经常用到,查阅了一系列paper,发现一张精美的图片,能将分析数据完美、直观的展示。本期文章就GBD数据进行双Y轴图的绘制。

GBD官网界面

注册下载数据

数据展示

双Y轴图绘制

       本次展示以GBD2019数据库中中国2019年结直肠癌分性别、年龄组发病数据为基础,绘制发病数和发病率的双Y轴图。具体代码如下:

分步详细代码

载入软件包
rm(list = ls())
setwd("f://gbd绘图")

##载入所需软件包##
library(ggplot2)
library(RColorBrewer)
library(ggpubr)  
library(readxl)
library(reshape2)
library(dplyr)
library(tidyr)
数据整理

注:此处采取了两种方式对数据进行转换,也是对之前写的一篇长宽数据转换的文章进行了复习。

##读取数据##
data1<-read.csv("IHME-GBD_2019_DATA-281b0303-1.csv")##GBD2019中获取中国结直肠癌发病数据##

##数据整理##
##————————————————方式一(应用tidyr包中unite/spread/gatherh函数)##
za<-select(data1,6,8,12:16)%>%gather(class,value,names(data1)[14:16])%>%unite(met_name,metric_name,class,sep="_")%>%spread(met_name,value = value)

##————————————————方式二(应用reshape2中melt和dcast函数)##
za<-select(data1,6,8,12:16)%>%melt(id=c("sex_name","age_name","year","metric_name"),variable.name="class",value.name="value")%>%dcast(sex_name+age_name+year~metric_name+class)
绘图前变量因子化
##绘图前分类变量因子化##
h=c("Both","Male","Female")#自定义顺序#
za$sex_name<-factor(za$sex_name,level=h)
za<-za[order(za$sex_name),]##按照上边定义的顺序排序##
m=c("0-14 years","15-49 years","50-69 years","70+ years")
za$age_name<-factor(za$age_name,level=m)
za<-za[order(za$age_name),]##按照上边定义的顺序排序##
coeff=max(za$Number_upper)/max(za$Rate_upper)%>%round()#coeff=第一个Y轴最大值除以第二个Y轴最大值#
绘制双Y轴图

绘制双坐标轴图主要利用sec.axis()函数,具体用法可参考help文档。

p=ggplot(za, aes(x =age_name))+#总的控制#
  geom_errorbar(aes(ymin=Number_val, ymax=Number_upper,group=sex_name,color=sex_name),position=position_dodge(0.25), width=.15,size=0.3,alpha=0.5)+#画误差线图,dodge和width宽度最好和条形图宽度一样,size是设置误差线的宽度#
  geom_bar(aes(y=Number_val,group=sex_name,fill=sex_name), stat="identity",position = "dodge",width = 0.25,alpha=0.5)+#画条形图,width可以设置条形图宽度#
  geom_line(aes(y=Rate_val*coeff,group=sex_name,color=sex_name),size=0.8)+#画第二条Y轴的线图#
  geom_point(aes(y=Rate_val*coeff,group=sex_name,color=sex_name,shape=sex_name),size=2)+#画第二条Y轴的线图#
  geom_errorbar(aes(ymin=Rate_lower*coeff, ymax=Rate_upper*coeff,group=sex_name,color=sex_name), width=.05,size=0.4)+#画误差线图,dodge和width宽度最好和条形图宽度一样,size是设置误差线的宽度#
  scale_fill_manual(values=c("blue","red","gray" ),labels=c("Male (Deaths number)","Female (Deaths number)","Both (Deaths number)"))+#设置填充颜色和标签#
  scale_color_manual(values=c("blue","red","gray" ),labels=c("Male (Deaths number)","Female (Deaths number)","Both (Deaths number)"))+#设置线的颜色和标签#
  scale_shape_manual(values=c(2,4,8),labels=c("Male (Death rate)","Female (Death rate)","Both (Death rate)"))+#设置线的颜色和标签#
  theme_classic()+#主题#
  theme(axis.text.x=element_text(angle = 45,hjust=0.5,vjust=0.5,color="black",size=12),
        axis.text.y=element_text(color="black",size=12),
        axis.title.x = element_text(size=12),
        axis.title.y = element_text(size=12),legend.title =element_blank(),
        legend.position="top",
        legend.spacing.y = unit(0.5, "cm"),legend.text=element_text(size=8))+#设置字体颜色#
  scale_y_continuous(breaks=seq(0,200000,50000),labels=c("0","50,000","100,000","150,000","200,000"),expand=c(0,0),limits = c(0,200000),
                     sec.axis = sec_axis(~./coeff,name="Death rate (per 100,000)"))+#设置y轴刻度及标签#
  labs(y="Death number",x="Age")+#设置xy轴的标题#
  guides(fill=guide_legend(nrow=3,ncol = 1))+####设置填充和颜色图例的位置
  guides(shape=guide_legend(nrow=3,ncol=1))####设置形状图例的位置
print(p)
ggsave('双Y轴图.JPEG',plot=p, dpi=600, width=12, height=7)
输出图片

 ggplot2坐标轴更改小技巧:

guides(fill=guide_legend(nrow=3,ncol = 1))+####设置填充和颜色图例的位置(显示几行几列)
guides(shape=guide_legend(nrow=3,ncol=1))####设置形状图例的位置

删除图例(3种方式):
1】guides(shape=FALSE)+guides(color=FALSE)+guides(fill=FALSE)####分别取消形状、颜色、填充映射下的图例

2】scale_fill_discrete(guide=FALSE)+scale_shape_discrete(guide=FALSE)+scale_color_discrete(guide=FALSE)

3】theme(legend.position = "none")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值