之前在复现一篇2021年5月4日发表于Glob Heart(影响因子:3.423)的GBD文章Global Burden of Aortic Aneurysm and Attributable Risk Factors from 1990 to 2017时遇到了一张十分有意思的图,想了很久都没有复现出来,最近看了Y叔的一篇推文后有了灵感,就迫不及待地想与大家分享啦。话不多说,让我们开始吧!
文献中的原图
从图中可以看出,这张图主要涉及到分组条形图,双向条形图,分面等操作。
数据下载
数据通过GBD数据库(http://ghdx.healthdata.org/gbd-results-tool)下载。数据库界面如下图所示:
根据文中提示下载得到以下数据。
图A数据
图B数据
数据加载和处理
#载入包
library(ggplot2)
#载入数据
get1 <- read.csv('A.csv')
get2 <- read.csv('B.csv')
get1[which(get1$sex=='Female'),c('val')] <- get1[which(get1$sex=='Female'),c('val')]*-1
get1$location <- factor(get1$location,levels =c("Western Sub-Saharan Africa","Western Europe",
"Tropical Latin America","Southern Sub-Saharan Africa",
"Southern Latin America","Southeast Asia","Oceania",
"North Africa and Middle East","High-income North America",
"South Asia","High-income Asia Pacific","Eastern Sub-Saharan Africa",
"Eastern Europe","East Asia","Central Sub-Saharan Africa",
"Central Latin America","Central Asia","Central Europe","Caribbean",
"Australasia","Andean Latin America","Global"))
get1$year <- as.factor(get1$year)
#这两句代码很重要,大家都知道,在ggplot2中画图时需要指定data的,没有这个我们可不能自制图例
df1<-data.frame(rei=c('High systolic blood pressure'),label=c("1990-Male","1990-Female"))
df2<-data.frame(rei=c('High systolic blood pressure'),label=c("2019-Male","2019-Female"))
这里的数据处理很细节哦~要将女性的数据转成负值,还要将location进行因子排序排序,不然就不是我们想要的顺序了。另外,还要将year因子化,不然就是连续性变量啦。
ggplot2画图
aaa <- ggplot(get1)+
geom_bar(aes(x=location,y=val,group=year,
fill=sex,alpha=year),stat = 'identity',
width = 0.5,position = position_dodge(width = 0.5))+
scale_alpha_discrete(range = c(1,0.5))+#设置前一个透明度为1,后一个为0.5
labs( y = 'Percent(%)') +
coord_flip()+#翻转坐标轴
scale_fill_manual(values = c("#CC0000","#006633"))+
#修改坐标轴刻度和标签
scale_y_continuous(breaks = seq(-0.8, 0.8, 0.2), labels = as.character(abs(seq(-80, 80, 20))), limits = c(-0.8, 0.8)) +
#现在的版本需要这样设置移除图例啦
guides(fill="none",alpha="none")+
facet_wrap(~rei)+
#自制图例
geom_point(data = df1,x=c(22,21),y=c(-0.8),shape=15,color=c("#CC0000","#006633"),alpha=0.5,size=5)+
geom_point(data = df1,x=c(20,19),y=c(-0.8),shape=15,color=c("#CC0000","#006633"),alpha=1,size=5)+
geom_text(data = df1,x=c(21,22),y=c(-0.6,-0.58),aes(label=label))+
geom_text(data = df2,x=c(19,20),y=c(-0.6,-0.58),aes(label=label))+
theme_bw()
aaa
这段代码最出色的地方莫过于通过画点图和加文本注释来自制图例了,在这里再次感谢Y叔给予的灵感哈哈。
细心的小伙伴或许能发现,这里的xy轴坐标还是翻转前的坐标,并且有没有发现,图中y轴是没有坐标的,原来一个小格就是一个坐标。我在这两个坑里面待了很久呢!
会画A图,B图不就信手拈来吗!最后用patchwork包一拼接,是不是跟原图差不多了。当然,把图画坐标轴外面的操作原谅我真的不行,R语言学习之路还很漫长!
末尾
最后,再给大家讲一下我踩过的坑吧,感受一遍才不会再次去踩。
美学长度不相同,因为示例数据有四个,但我们只指定了两个,结果就导致R语言不知道为哪两个填充颜色。另外,在分面图里要注意,要先指定一个面才能单独在这个面里添加注释。
好了,今天的分享就到这里,是不是感觉收获满满呢?
[参考资料]
[1] 《R语言数据可视化实战》
[2] ggplot2包(Version3.3.5)
[3] patchwork包(Version1.1.1)