森林图在论文中很常见,多用于表示多因素分析中的变量与结果变量的比值效应,可以用图示的方法比较直观的绘制出来。既往我们在文章《R语言快速绘制多因素回归分析森林图(1)》已经介绍了怎么绘制森林图,但是绘图比较简单,不够美观,不能绘制相对复杂的森林图。今天我们来介绍一下forestploter包,它等于是在forestplot包的基础上进一步强化功能,制作方法也相对简单一点,而且加强了对图形的精细控制,而且可以绘制单组和多组森林图。

我们先导入R包和数据

library(grid)
library(forestploter)
dt<-read.csv("E:/r/test/forest2.csv",sep=',',header=TRUE)


这是一个森林图数据(公众号回复:森林图数据2,可以获得数据)这个数据,嫌麻烦的可以在这里下载:https://download.csdn.net/download/dege857/86945654?spm=1001.2014.3001.5501
前几个变量我解释一下Subgroup:分组,就是的组别和亚组,Treatment:治疗组例数,Placebo:使用安慰剂,也就是对照组的例数。Est:效应值,可以是OR或者HR,low:效应值的最低值,可以认为是可信区间的下限,hi:效应值的最高值,可以认为是可信区间的上限。
我们先来画一个最基础的森林图,后面的几个数据暂时不需要,我们先精简一下数据

dt <- dt[,1:6]
View(dt)


数据变成了一个精简的数据(上图),我们先把数据格式整理一下,先让它缩进一格

dt$Subgroup <- ifelse(is.na(dt$Placebo), dt$Subgroup,paste0("   ", dt$Subgroup))


接下来我们把治疗组和对照组NA(有缺失)的地方变成一个空格

dt$Treatment <- ifelse(is.na(dt$Treatment), "", dt$Treatment)
dt$Placebo <- ifelse(is.na(dt$Placebo), "", dt$Placebo)


生成一个变量se,它在绘图的时候表示正方形的大小

dt$se <- (log(dt$hi) - log(dt$est))/1.96

生成一个绘图区间,等下用来绘图

dt$` ` <- paste(rep(" ", 20), collapse = " ")

生成HR和可信区间

dt$`HR (95% CI)` <- ifelse(is.na(dt$se), "",sprintf("%.2f (%.2f to %.2f)",dt$est, dt$low, dt$hi))#sprintF返回字符和可变量组合

最后得到绘图数据

整理好数据我们就可以绘图了

p <- forest(dt[,c(1:3, 8:9)],est = dt$est,       #效应值lower = dt$low,     #可信区间下限upper = dt$hi,      #可信区间上限sizes = dt$se,     #黑框的大小ci_column = 4,   #在那一列画森林图,要选空的那一列ref_line = 1,arrow_lab = c("Placebo Better", "Treatment Better"),xlim = c(0, 4),ticks_at = c(0.5, 1, 2, 3),footnote = "This is the demo data. Please feel free to change\nanything you want.")
p


有些人可能想问,有些森林图是有P值的,这个没有P值怎么办,我们可以给它加上去

dt$p <- paste(rep("<0.05", 22))

重新绘图

p <- forest(dt[,c(1:3, 8:10)],est = dt$est,       #效应值lower = dt$low,     #可信区间下限upper = dt$hi,      #可信区间上限sizes = dt$se,     #黑框的大小ci_column = 4,   #在那一列画森林图,要选空的那一列ref_line = 1,arrow_lab = c("Placebo Better", "Treatment Better"),xlim = c(0, 4),ticks_at = c(0.5, 1, 2, 3),footnote = "This is the demo data. Please feel free to change\nanything you want.")
p

这样P值就出来了

生成图形后我们还可以对图形进行细节调整,我们把第一行总病例数放到最后改成汇总,然后把它的名字改成Overall,

dt_tmp <- rbind(dt[-1, ], dt[1, ])
dt_tmp[nrow(dt_tmp), 1] <- "Overall"


forest_theme函数可以对森林图图片的细节进行调整,我们可以在forest_theme函数上设定预定的森林图样式模块,到时直接绘图就好了

tm <- forest_theme(base_size = 10,  #文本的大小# Confidence interval point shape, line type/color/widthci_pch = 15,   #可信区间点的形状ci_col = "#762a83",    #CI的颜色ci_fill = "blue",     #ci颜色填充ci_alpha = 0.8,        #ci透明度ci_lty = 1,            #CI的线型ci_lwd = 1.5,          #CI的线宽ci_Theight = 0.2, # Set an T end at the end of CI  ci的高度,默认是NULL# Reference line width/type/color   参考线默认的参数,中间的竖的虚线refline_lwd = 1,       #中间的竖的虚线refline_lty = "dashed",refline_col = "grey20",# Vertical line width/type/color  垂直线宽/类型/颜色   可以添加一条额外的垂直线,如果没有就不显示vertline_lwd = 1,              #可以添加一条额外的垂直线,如果没有就不显示vertline_lty = "dashed",vertline_col = "grey20",# Change summary color for filling and borders   更改填充和边框的摘要颜色summary_fill = "yellow",       #汇总部分大菱形的颜色summary_col = "#4575b4",# Footnote font size/face/color  脚注字体大小/字体/颜色footnote_cex = 0.6,footnote_fontface = "italic",footnote_col = "red")

设定好模块后直接绘图就可以了

pt <- forest(dt_tmp[,c(1:3, 8:9)],est = dt_tmp$est,lower = dt_tmp$low, upper = dt_tmp$hi,sizes = dt_tmp$se,is_summary = c(rep(FALSE, nrow(dt_tmp)-1), TRUE),ci_column = 4,ref_line = 1,arrow_lab = c("Placebo Better", "Treatment Better"),xlim = c(0, 4),ticks_at = c(0.5, 1, 2, 3),footnote = "This is the demo data. Please feel free to change\nanything you want.",theme = tm)plot(pt)


我们还可以对图片细节进行修改,比如我们想把第三行变成红色

g <- edit_plot(p, row = 3, gp = gpar(col = "red", fontface = "italic"))
g


更改3,6,10,11行方块及长条的颜色为绿色

g <- edit_plot(g,row = c(3, 6, 11, 13),col = 4,which = "ci",gp = gpar(col = "green"))
g


把2, 5, 10, 13, 17, 20行的文本变成粗体

g <- edit_plot(g,row = c(2, 5, 10, 13, 17, 20),gp = gpar(fontface = "bold"))
g


把第五行的背景改成绿色

g <- edit_plot(g, row = 5, which = "background",gp = gpar(fill = "darkolivegreen1"))
g


在顶部插入文本

g <- insert_text(g,text = "Treatment group",col = 2:3,part = "header",gp = gpar(fontface = "bold"))
g


在标题下方加一条下划线

g <- add_underline(g, part = "header")
g


在第十行位置插入文本

g <- insert_text(g,text = "This is a long text. Age and gender summarised above.\nBMI is next",row = 10,just = "left",gp = gpar(cex = 0.6, col = "green", fontface = "italic"))g


下面来介绍一下怎么绘制多组的森林图,绘制对组森林图就要涉及多组的数据,我们把数据重新导入一下

dt<-read.csv("E:/r/test/forest2.csv",sep=',',header=TRUE)

设置一下缩进,这样好看一点,这步和前面是一样的

dt$Subgroup <- ifelse(is.na(dt$Placebo), dt$Subgroup,paste0("   ", dt$Subgroup))#######如果变量没有缺失,就缩进一格,也就是前进一格

因为是双组变量,所以要设置2个n,这步和前面基本一样

dt$n1 <- ifelse(is.na(dt$Treatment), "", dt$Treatment)###将缺失的部分变为空格
dt$n2 <- ifelse(is.na(dt$Placebo), "", dt$Placebo)

因为是要画两个森林图,所以要增加两个空地方来画图

dt$`CVD outcome` <- paste(rep(" ", 20), collapse = " ")
dt$`COPD outcome` <- paste(rep(" ", 20), collapse = " ")

设置一些森林图的基本参数,这步和前面是一样的

tm <- forest_theme(base_size = 10,refline_lty = "solid",   #参考线类型ci_pch = c(15, 18),ci_col = c("#377eb8", "#4daf4a"),footnote_col = "blue",legend_name = "Group",   #设置标题名字legend_value = c("Trt 1", "Trt 2"),   #设置分组名字vertline_lty = c("dashed", "dotted"),vertline_col = c("#d6604d", "#bababa"))

最后绘图,这里我要说一下,ci_column = c(3, 5)是指在第3和5列绘图,est_gp1和est_gp2为一组,est_gp3和est_gp4为一组,其他的依次类推

p <- forest(dt[,c(1, 19, 21, 20, 22)],est = list(dt$est_gp1,dt$est_gp2,dt$est_gp3,dt$est_gp4),lower = list(dt$low_gp1,dt$low_gp2,dt$low_gp3,dt$low_gp4), upper = list(dt$hi_gp1,dt$hi_gp2,dt$hi_gp3,dt$hi_gp4),ci_column = c(3, 5),ref_line = 1,vert_line = c(0.5, 2),nudge_y = 0.2,theme = tm)p


最后双组森林图也绘制好了,也可以像单组一样调整。这应该是我写得最详细的1次了,整整搞了15页。

R语言使用forestploter包绘制单组及双组森林图(2)(附有超详细备注)相关推荐

  1. R语言使用forestploter包绘制单组及双组森林图

    R语言使用forestploter包绘制单组及双组森林图 您可以使用 forestplot 包绘制单组和双组森林图.该包提供了一个简单的方法来绘制证据汇总图,并可以在一个图中显示多种证据来源的结果. ...

  2. 三线表是什么?R语言使用table1包绘制(生成)三线表、构建不分层的三线表

    三线表是什么?R语言使用table1包绘制(生成)三线表.构建不分层的三线表 目录

  3. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义函数在三线表中添加p值

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.编写自定义函数在三线表中添加p值 目录

  4. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、设置transpose参数转置三线表、变量作为列,子组(strata)作为行

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.设置transpose参数转置三线表.变量作为列,子组(strata)作为行 目录

  5. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、自定义overall的标签名称

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.自定义overall的标签名称 目录

  6. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、为指定变量添加单位信息、自定义overall的标签名称

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.为指定变量添加单位信息.自定义overall的标签名称 目录

  7. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义三线表结构(将因子变量细粒度化重新构建三线图)、为不同的变量显示不同的统计信息

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.编写自定义三线表结构(将因子变量细粒度化重新构建三线图).为不同的变量显示不同的统计信息 目录

  8. 三线表是什么?R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、通过topclass参数自定义三线表表格的显示形式(显示为类似斑马线、并将所有列居中,包括包含行标签的第一列)

    三线表是什么?R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.通过topclass参数自定义三线表表格的显示形式(显示为类似斑马线.并将所有列居中,包括包含行标签的第一列) 目录

  9. 三线表是什么?R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义三线表结构(将因子变量细粒度化重新构建三线图)、编写自定义函数在三线表中添加p值

    三线表是什么?R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.编写自定义三线表结构(将因子变量细粒度化重新构建三线图).编写自定义函数在三线表中添加p值 目录

最新文章

  1. 【转】前端精选文摘:BFC 神奇背后的原理
  2. live555 源码分析: SETUP 的处理
  3. 【Java文件操作】一个将文件转化为十六进制字节数组的工具(可以以8086汇编查看内存的格式输出,很优雅)
  4. linux nohup /dev/null,nohup结合/dev/null
  5. python-利用生成器函数生成斐波那契数列
  6. Codeforces 932D - Tree
  7. linux rsync 目录同步,linux下使用rsync同步目录
  8. Python标准库 urllib
  9. 64、剑指offer--滑动窗口最大值
  10. GeoTiff及GDAL切图(java)
  11. MySQL报错113_连接 MySQL 报错'NoneType' object has no attribute '__getitem__'
  12. 传智播客 C/C++学习笔记 字符串替换
  13. 计算机上机操作表格试题,2013职称计算机考试Excel表格操作试题(1)
  14. 计算机地球一小时word处理,地球一小时策划书word版
  15. MATLAB突然打不开,窗口闪一下就退了,一种亲试解决方法:
  16. python非法的标识符_Python标识符
  17. 让Linux内核不再卡死在DHCP请求上
  18. 实时系统vxWorks - 动态库、静态库建立及调用
  19. Commands that may modify the data set are disabled, because this instance is configured to report er
  20. SMI-S 统一SAN管理

热门文章

  1. 编译器光标变成黑块变粗 影响插入 修改 的解决方法
  2. 给自己的Fonts教程
  3. 转、分享:PMP学习资料、考试资料推荐:第四版-2008版-吴永达
  4. 对华泰股份的一些看法
  5. coding回退克隆到某个历史版本
  6. mysql 浮动ip_MySQL配置HeartBeat实现心跳监控和浮动IP
  7. Hexo自建博客之接入评论系统
  8. 在DOS环境下添加背景音乐、改变背景颜色、冻结屏幕和调用系统时间
  9. 求助:RAC安装GI时报错
  10. 一名程序猿的习惯养成记录手帐(二)