呼和浩特建设工程安全管理网站/网络推广策划案
📋文章目录
- 原图
- 图片元素拆解
- ggplot绘制森林图过程
- 加载相关程序包和数据
- 填充色块
- 添加箭头与注释
- 参照线
- 附上所有代码
森林图是以统计指标和统计分析方法为基础,用数值运算结果绘制出的图型。它在平面直角坐标系中,以一条垂直的无效线(横坐标刻度为1或0)为中心,用平行于横轴的多条线段描述了每个被纳入研究的效应量和置信区间(CI),用一个棱形(或其它图形)描述了多个研究合并的效应量及置信区间。它非常简单和直观地描述了Meta分析的统计结果,是Meta分析中最常用的结果表达形式。
原图
先看看所需复现的森林图:
接下来,我们来模仿复现这张图。
图片元素拆解
我们可以看到,这张森林图由以下四类元素组成:
- 带方向的箭头: 可以用geom_curve()函数实现,通过(x=x1, y=y1, xend=x2, yend=y2)中的 (x1, y1)和(x2, y2)指定箭头的方向,当x1=x2时,箭头垂直于x轴;当y1=y2时,箭头垂直于y轴,与例图中一致。
- 箭头上的注释:可以用annotate()函数实现,通过(x=x1, y=y1, label= “apple”)在图中(x1,y1)的位置注释apple这个单词。
- 区域填充的色块:可以用geom_rect()函数实现,通过(aes(xmin= x1, ymin= y1, xmax= x2, ymax= y2), fill = “red”, color = “red”)在图中(x1, x2, y1, y2)的位置填充红色的方块,当xmin= -Inf, xmax= Inf时,将沿整个x轴进行填充。
- 虚化的参照线:可用geom_vline()实现,通过(aes(xintercept=x1), colour= “red”, linetype= “dashed”)在图中x=x1的位置填充红色的参照虚线。假如要绘制垂直于y轴y=y1的线,那么函数就是geom_hline(aes(yintercept= y1))。
所以我们使用ggplot2包便可以完成整张图像的绘制,但值得注意的是,ggplot2的基础逻辑ggplot2包的学习逻辑是图层覆盖,因此我们要按先绘制色块,再添加虚线,再添加箭头和注释的顺序进行画图。
ggplot绘制森林图过程
加载相关程序包和数据
rm(list=ls())library(ggplot2)
library(openxlsx)
library(tidyverse)data<- read.xlsx("Figure.xlsx",1)
mydata<- mutate(data, seq=c(1:nrow(data))) %>%arrange(desc(seq));mydata
mydata$Trait<- factor(mydata$Trait, levels = mydata$Trait)
数据中的Trait是y轴左边的标签,OR是图中的原点,LCI与UCL是箭头的起点与终点。
填充色块
p1<- ggplot(mydata,aes(x=OR,y=Trait, color=Type))+theme_bw()+theme(legend.position = "none")+ #去掉图注geom_point()+geom_rect(aes(xmin = -Inf, ymin = 0,xmax = Inf, ymax = 3.5),#填充0-3.5的棕色色块fill = "#E6E5E3", color = "#E6E5E3", size =1.5);p1
在y=0-3.5的区域填充棕色的色块,要注意的是,fill填充的是方块内部的颜色,color指的是方框的颜色,因此二者需要一致。
p2<- p1+ geom_rect(aes(xmin = -Inf, ymin = 3.4,xmax = Inf, ymax = 7.5),fill = "#BFD6ED", color = "#BFD6ED", size =1.5)+geom_rect(aes(xmin = -Inf, ymin = 7.5,xmax = Inf, ymax = 9.5),fill = "#C7DFB5", color = "#C7DFB5", size =1.5)+geom_rect(aes(xmin = -Inf, ymin = 9.5,xmax = Inf, ymax = 10.5),fill = "#FDE5A0", color = "#FDE5A0", size =1.5)+geom_rect(aes(xmin = -Inf, ymin = 10.5,xmax = Inf, ymax = 11.5),fill = "#FEEFCF", color = "#FEEFCF", size =1.5)+geom_rect(aes(xmin = -Inf, ymin = 11.5,xmax = Inf, ymax = 16.5),fill = "#FBE7DD", color = "#FBE7DD", size =1.5);p2
填充完色块了,就可以开始着点画箭头了。
添加箭头与注释
p3<- p2+geom_point(size=2)+#画点scale_fill_manual(values = c("#EB0D20", "#C0A42F", "#77621D","#5F8744", "#1D7CBA", "#828282"))+scale_color_manual(values = c("#EB0D20", "#C0A42F", "#77621D","#5F8744", "#1D7CBA", "#828282"))+geom_curve(aes(x = 1.051, y = 16, xend = 1.505, yend = 16),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#EB0D20", size = 0.5, angle = 0)+annotate("text",x= 1.258,y= 16.4 , label="46 SNPs",size=4);p3
箭头的起点与终点就是数据中的LCI与UCI,而注释的位置则要比点的位置略微高一些。由于无法批量将具体参数批量映射到箭头和注释上,因此我们需要手动输入相关参数。
p4<- p3+geom_curve(aes(x = 1.202, y = 15, xend = 1.692, yend = 15),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#EB0D20", size = 0.5, angle = 0)+annotate("text",x= 1.426, y= 15.4 , label="12 SNPs",size=4)+ #Chgeom_curve(aes(x = 1, y = 14, xend = 1.235, yend = 14),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#EB0D20", size = 0.5, angle = 0)+annotate("text", x= 1.112, y= 14.4 , label="3 SNPs",size=4)+ #Gageom_curve(aes(x = 1.004, y =13, xend = 1.131, yend = 13),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#EB0D20", size = 0.5, angle = 0)+annotate("text", x= 1.066, y= 13.4 , label="25 SNPs",size=4)+ #PSgeom_curve(aes(x = 0.965, y =12, xend = 1.068, yend = 12),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#EB0D20", size = 0.5, angle = 0)+annotate("text", x= 1.015, y= 12.4 , label="82 SNPs",size=4)+ #PBgeom_curve(aes(x = 0.898, y = 11, xend = 1.208, yend = 11),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#C0A42F", size = 0.5, angle = 0)+annotate("text", x= 1.042, y= 11.4 , label="4 SNPs",size=4)+ #vigeom_curve(aes(x = 0.826, y =10, xend = 1.694 , yend = 10),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#77621D", size = 0.5, angle = 0)+annotate("text", x= 1.183, y= 10.4 , label="3 SNPs",size=4)+ #Pageom_curve(aes(x = 0.952, y = 9, xend = 1.941, yend = 9),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#5F8744", size = 0.5, angle = 0)+annotate("text", x= 1.359, y= 9.4 , label="16 SNPs",size=4)+ #Gasgeom_curve(aes(xend = 0.821, y = 8, x = 1.029, yend = 8),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#5F8744", size = 0.5, angle = 0)+annotate("text", x= 0.919, y= 8.4 , label="8 SNPs",size=4)+ #Gatgeom_curve(aes(x = 0.932, y = 7, xend = 1.078, yend = 7),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#1D7CBA", size = 0.5, angle = 0)+annotate("text", x= 1.002, y= 7.4 , label="81 SNPs",size=4)+ #IBgeom_curve(aes(x = 1.000, y = 6, xend = 1.138, yend = 6),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#1D7CBA", size = 0.5, angle = 0)+annotate("text", x= 1.067, y= 6.4 , label="48 SNPs",size=4)+ #UCgeom_curve(aes(xend = 0.936, y = 5, x = 1.053, yend = 5),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#1D7CBA", size = 0.5, angle = 0)+annotate("text", x= 0.993, y= 5.4 , label="65 SNPs",size=4)+ #CDgeom_curve(aes(x = 0.638, y = 4, xend = 2.763, yend = 4),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#1D7CBA", size = 0.5, angle = 0)+annotate("text", x= 1.327, y= 4.4 , label="5 SNPs",size=4)+ #ISgeom_curve(aes(x = 0.942, y = 3, xend = 1.170 , yend = 3),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#828282", size = 0.5, angle = 0)+annotate("text", x= 1.050, y= 3.4 , label="10 SNPs",size=4)+ #Apgeom_curve(aes(xend = 0.609, y = 2, x = 1.616, yend = 2),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#828282", size = 0.5, angle = 0)+annotate("text", x= 0.992, y= 2.4 , label="8 SNPs",size=4)+ #PUgeom_curve(aes(x = 0.779, y = 1, xend = 1.459, yend = 1),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#828282", size = 0.5, angle = 0)+annotate("text", x= 1.066, y= 1.4 , label="80 SNPs",size=4);p4
参照线
p5<- p4+geom_vline(aes(xintercept=0.6), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=0.7), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=0.8), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=0.9), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1), colour="black", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.1), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.2), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.3), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.4), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.5), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.6), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.7), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.8), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.9), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.0), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.1), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.2), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.3), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.4), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.5), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.6), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.7), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.8), colour="grey50", linetype="dashed", size=0.3);p5
复现成功!
附上所有代码
rm(list=ls())library(ggplot2)
library(openxlsx)
library(tidyverse)data<- read.xlsx("Figure.xlsx",1)
mydata<- mutate(data, seq=c(1:nrow(data))) %>%arrange(desc(seq));mydata
mydata$Trait<- factor(mydata$Trait, levels = mydata$Trait)ggplot(mydata,aes(x=OR,y=Trait, color=Type))+theme_bw()+theme(legend.position = "none")+ #去掉图注geom_point()+geom_rect(aes(xmin = -Inf, ymin = 0,xmax = Inf, ymax = 3.5),#色块fill = "#E6E5E3", color = "#E6E5E3", size =1.5)+geom_rect(aes(xmin = -Inf, ymin = 3.4,xmax = Inf, ymax = 7.5),fill = "#BFD6ED", color = "#BFD6ED", size =1.5)+geom_rect(aes(xmin = -Inf, ymin = 7.5,xmax = Inf, ymax = 9.5),fill = "#C7DFB5", color = "#C7DFB5", size =1.5)+geom_rect(aes(xmin = -Inf, ymin = 9.5,xmax = Inf, ymax = 10.5),fill = "#FDE5A0", color = "#FDE5A0", size =1.5)+geom_rect(aes(xmin = -Inf, ymin = 10.5,xmax = Inf, ymax = 11.5),fill = "#FEEFCF", color = "#FEEFCF", size =1.5)+geom_rect(aes(xmin = -Inf, ymin = 11.5,xmax = Inf, ymax = 16.5),fill = "#FBE7DD", color = "#FBE7DD", size =1.5)+geom_point(size=2)+#画点scale_fill_manual(values = c("#EB0D20", "#C0A42F", "#77621D","#5F8744", "#1D7CBA", "#828282"))+scale_color_manual(values = c("#EB0D20", "#C0A42F", "#77621D","#5F8744", "#1D7CBA", "#828282"))+geom_curve(aes(x = 1.051, y = 16, xend = 1.505, yend = 16),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#EB0D20", size = 0.5, angle = 0)+annotate("text",x= 1.258,y= 16.4 , label="46 SNPs",size=4)+ #GSgeom_curve(aes(x = 1.202, y = 15, xend = 1.692, yend = 15),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#EB0D20", size = 0.5, angle = 0)+annotate("text",x= 1.426, y= 15.4 , label="12 SNPs",size=4)+ #Chgeom_curve(aes(x = 1, y = 14, xend = 1.235, yend = 14),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#EB0D20", size = 0.5, angle = 0)+annotate("text", x= 1.112, y= 14.4 , label="3 SNPs",size=4)+ #Gageom_curve(aes(x = 1.004, y =13, xend = 1.131, yend = 13),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#EB0D20", size = 0.5, angle = 0)+annotate("text", x= 1.066, y= 13.4 , label="25 SNPs",size=4)+ #PSgeom_curve(aes(x = 0.965, y =12, xend = 1.068, yend = 12),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#EB0D20", size = 0.5, angle = 0)+annotate("text", x= 1.015, y= 12.4 , label="82 SNPs",size=4)+ #PBgeom_curve(aes(x = 0.898, y = 11, xend = 1.208, yend = 11),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#C0A42F", size = 0.5, angle = 0)+annotate("text", x= 1.042, y= 11.4 , label="4 SNPs",size=4)+ #vigeom_curve(aes(x = 0.826, y =10, xend = 1.694 , yend = 10),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#77621D", size = 0.5, angle = 0)+annotate("text", x= 1.183, y= 10.4 , label="3 SNPs",size=4)+ #Pageom_curve(aes(x = 0.952, y = 9, xend = 1.941, yend = 9),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#5F8744", size = 0.5, angle = 0)+annotate("text", x= 1.359, y= 9.4 , label="16 SNPs",size=4)+ #Gasgeom_curve(aes(xend = 0.821, y = 8, x = 1.029, yend = 8),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#5F8744", size = 0.5, angle = 0)+annotate("text", x= 0.919, y= 8.4 , label="8 SNPs",size=4)+ #Gatgeom_curve(aes(x = 0.932, y = 7, xend = 1.078, yend = 7),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#1D7CBA", size = 0.5, angle = 0)+annotate("text", x= 1.002, y= 7.4 , label="81 SNPs",size=4)+ #IBgeom_curve(aes(x = 1.000, y = 6, xend = 1.138, yend = 6),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#1D7CBA", size = 0.5, angle = 0)+annotate("text", x= 1.067, y= 6.4 , label="48 SNPs",size=4)+ #UCgeom_curve(aes(xend = 0.936, y = 5, x = 1.053, yend = 5),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#1D7CBA", size = 0.5, angle = 0)+annotate("text", x= 0.993, y= 5.4 , label="65 SNPs",size=4)+ #CDgeom_curve(aes(x = 0.638, y = 4, xend = 2.763, yend = 4),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#1D7CBA", size = 0.5, angle = 0)+annotate("text", x= 1.327, y= 4.4 , label="5 SNPs",size=4)+ #ISgeom_curve(aes(x = 0.942, y = 3, xend = 1.170 , yend = 3),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#828282", size = 0.5, angle = 0)+annotate("text", x= 1.050, y= 3.4 , label="10 SNPs",size=4)+ #Apgeom_curve(aes(xend = 0.609, y = 2, x = 1.616, yend = 2),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#828282", size = 0.5, angle = 0)+annotate("text", x= 0.992, y= 2.4 , label="8 SNPs",size=4)+ #PUgeom_curve(aes(x = 0.779, y = 1, xend = 1.459, yend = 1),arrow = arrow(length = unit(0.02, "npc"), type="closed"),colour = "#828282", size = 0.5, angle = 0)+annotate("text", x= 1.066, y= 1.4 , label="80 SNPs",size=4)+ #GE#scale_x_continuous(limits = c(0.8, 2.5))+geom_vline(aes(xintercept=0.6), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=0.7), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=0.8), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=0.9), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1), colour="black", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.1), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.2), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.3), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.4), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.5), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.6), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.7), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.8), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=1.9), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.0), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.1), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.2), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.3), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.4), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.5), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.6), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.7), colour="grey50", linetype="dashed", size=0.3)+geom_vline(aes(xintercept=2.8), colour="grey50", linetype="dashed", size=0.3)