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

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")

### GBD 数据绘图与可视化的工具和方法 #### 使用 GDAL 解析 GDB 文件地理数据库 GDAL 是一种强大的开源 GIS 工具包,能够解析 FileGDB 和 OpenFileGDB 驱动支持的地理数据库文件。通过加载这些驱动程序,可以读取 GDB 中存储的空间数据和其他属性信息。基本操作流程包括初始化 GDAL 库、设置驱动程序以及打开目标 GDB 文件[^1]。 ```python from osgeo import ogr # 初始化驱动 driver = ogr.GetDriverByName('OpenFileGDB') # 打开 GDB 文件 gdb_path = 'path_to_your_gdb_file.gdb' dataSource = driver.Open(gdb_path, 0) if dataSource is None: print("无法打开指定的 GDB 文件") else: layer_count = dataSource.GetLayerCount() for i in range(layer_count): layer = dataSource.GetLayerByIndex(i) feature_count = layer.GetFeatureCount() print(f'第 {i} 层次名称: {layer.GetName()}, 特征数量: {feature_count}') ``` 上述代码展示了如何利用 Python 脚本调用 GDAL 来访问 GDB 的层次结构及其特征计数。 #### EasyGBD 工具的应用 除了编程方式外,还可以借助形化界面工具来简化复杂的数据处理过程。EasyGBD 提供了一个友好的用户交互平台,允许用户轻松连接至不同的关系型数据库(如 MySQL、PostgreSQL 或 SQL Server),从而实现快速查询、管理和可视化功能[^2]。 #### 制作 Y 表 当需要在同一张上比较两个不同尺度变量时,可以选择创建 Y 表。这种方法特别适合展示来自 GBD 数据库中的多维度指标变化趋势。例如,可以用左侧纵坐标表示发病率率值,右侧则对应死亡人数或其他关联参数[^3]。 以下是使用 Matplotlib 实现的一个简单例子: ```python import matplotlib.pyplot as plt fig, ax1 = plt.subplots() # 设置第一个 y 数据 ax1.set_xlabel('年份') ax1.set_ylabel('发病病例', color='tab:red') ax1.plot([2000, 2010, 2020], [100, 80, 70], color='tab:red') # 假设数据 ax1.tick_params(axis='y', labelcolor='tab:red') # 创建第二个 y 实例并与原始共享相同的 x ax2 = ax1.twinx() ax2.set_ylabel('死亡案例', color='tab:blue') ax2.plot([2000, 2010, 2020], [50, 40, 30], color='tab:blue') # 假设数据 ax2.tick_params(axis='y', labelcolor='tab:blue') plt.title('某疾病的发病率 vs 死亡率 (2000-2020)') plt.show() ``` 这段脚本演示了怎样构建具有独立刻度范围却共存同一横坐标的两套数值体系像。 #### 构建热力 为了更清晰地揭示空间或者时间序列上的模式分布特性,采用热力形式往往更为有效。特别是在公共卫生统计领域里,它可以帮助研究人员迅速识别高风险区域或时间段内的异常现象[^4]。 下面给出一段基于 Seaborn 库生成热度矩阵案的例子: ```python import seaborn as sns; sns.set_theme() import pandas as pd # 示例 DataFrame data = {'Year': ['2000','2000','2010','2010'], 'Country':['USA','China','USA','China'], 'Value':[10,20,15,25]} df = pd.DataFrame(data).pivot(index="Year", columns="Country", values="Value") sns.heatmap(df, annot=True, fmt=".1f", cmap="coolwarm") plt.title('国家间年度对比热力') plt.show() ``` 此段代码片段说明了转换表格布局以便适配热量映射需求的过程,并最终呈现出带有注解标签的颜色渐变效果画面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值