获取更多R语言知识,请关注公众号:医学和生信笔记

医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。

文章目录

  • 准备数据
  • 画图
  • 更改主题!!
  • 编辑图形
  • 有亚组的森林图

前面介绍了使用forestplot包画森林图:
这个包很强大,熟练使用可以自由调整各种细节,不过由于细节太多、自由度太高,反而不容易上手。

今天给大家介绍另外一个可以画森林图的R包:forestploter,帮助你快速画出好看的森林图。

准备数据

还是用上次用到过的数据,基本的画图理念是差不多的,都是把图的内容看成是表格的形式,用空白或者NA填充空的单元格。

数据准备比forestplot包简单一点,文字数据和画“森林”的数据,一起放在一个数据框中即可。

tabletext <- data.frame(# 文本数据study =  c("Auckland", "Block", "Doran", "Gamsu", "Morrison", "Papageorgiou", "Tauesch", "Summary"),steroid =  c("36", "1", "4", "14", "3", "1", "8", ""),placebo = c("60", "5", "11", "20", "7", "7", "10", ""),# 画“森林需要的数据”mean  = c(0.578, 0.165, 0.246, 0.700, 0.348, 0.139, 1.017, 0.531), lower = c(0.372, 0.018, 0.072, 0.333, 0.083, 0.016, 0.365, 0.386),upper = c(0.898, 1.517, 0.833, 1.474, 1.455, 1.209, 2.831, 0.731)
)# 增加一列
tabletext$`HR (95% CI)` <- ifelse(is.na(tabletext$mean), "",sprintf("%.2f (%.2f to %.2f)",tabletext$mean, tabletext$lower, tabletext$upper))# 增加一列空值用于画“森林”
tabletext$` ` <- paste(rep(" ", 8), collapse = " ")tabletext
##          study steroid placebo  mean lower upper         HR (95% CI)
## 1     Auckland      36      60 0.578 0.372 0.898 0.58 (0.37 to 0.90)
## 2        Block       1       5 0.165 0.018 1.517 0.16 (0.02 to 1.52)
## 3        Doran       4      11 0.246 0.072 0.833 0.25 (0.07 to 0.83)
## 4        Gamsu      14      20 0.700 0.333 1.474 0.70 (0.33 to 1.47)
## 5     Morrison       3       7 0.348 0.083 1.455 0.35 (0.08 to 1.46)
## 6 Papageorgiou       1       7 0.139 0.016 1.209 0.14 (0.02 to 1.21)
## 7      Tauesch       8      10 1.017 0.365 2.831 1.02 (0.36 to 2.83)
## 8      Summary                 0.531 0.386 0.731 0.53 (0.39 to 0.73)
##
## 1
## 2
## 3
## 4
## 5
## 6
## 7
## 8

数据就准备好了。

画图

# 加载R包
library(forestploter)

最基本的画图:

p <- forest(data = tabletext[,c(1:3,8,7)], # 选择文字部分,这里选了5列,# 其中4列是要呈现的文字信息,还有1列空值用于画“森林”lower = tabletext$lower, # 可信区间下限upper = tabletext$upper, # 可信区间上限est = tabletext$mean, # 估计值ci_column = 4 # “森林”出现在图的第几列)print(p)

自动增加了色条,增加美感。

稍加美化:

p <- forest(data = tabletext[,c(1:3,8,7)],lower = tabletext$lower,upper = tabletext$upper,est = tabletext$mean,ci_column = 4,sizes = tabletext$mean, # 控制方框的大小is_summary = c(rep(FALSE,nrow(tabletext)-1), TRUE), # 最后一列是汇总行ref_line = 1, # 把竖线放到1的位置xlim = c(0,3), # x轴范围ticks_at = c(0,1,2,3), # x轴刻度显示arrow_lab = c("this better","that better"), # x轴下面的文字footnote = "A simple example of forestploter" # 左下角脚注)print(p)

更改主题!!

这个包比较创新的地方就在于主函数forest只提供基本参数,更多的细节调整借助主题进行调整。

接下来我们就使用主题对森林图进行一些美化。

# 自定义主题,修改各种细节
tm <- forest_theme(base_size = 10, # 基础大小# 可信区间点的形状,线型、颜色、宽度ci_pch = 16,ci_col = "#4575b4", # #762a83ci_lty = 1,ci_lwd = 1.5,ci_Theight = 0.2, # 可信区间两端加短竖线# 参考线宽度、形状、颜色refline_lwd = 1,refline_lty = "dashed",refline_col = "grey20",# 汇总菱形的填充色和边框色summary_fill = "#4575b4",summary_col = "#4575b4",# 脚注大小、字体、颜色footnote_cex = 0.6,footnote_fontface = "italic",footnote_col = "blue")

设置好之后,传递给theme参数即可

p1 <- forest(data = tabletext[,c(1:3,8,7)],lower = tabletext$lower,upper = tabletext$upper,est = tabletext$mean,ci_column = 4,is_summary = c(rep(FALSE,nrow(tabletext)-1), TRUE), # 最后一列是汇总行ref_line = 1, # 把竖线放到1的位置xlim = c(0,3), # x轴范围ticks_at = c(0,1,2,3), # x轴刻度显示arrow_lab = c("this better","that better"), # x轴下面的文字footnote = "A simple example of forestploter", # 左下角脚注theme = tm)print(p1)

编辑图形

除了使用主题外,该包还支持对图形进行特定的调整,比如更改某一行的颜色,控制字体,增加空行等等,主要是通过下面4个函数实现的:

  • edit_plot :改变特定行或列的字体和字体颜色
  • add_underline:对特定的行增加边框
  • add_text:对特定的行或列增加文字
  • insert_text:在特定的行前或后增加一行并增加文字
# 改变第3行文字颜色
g <- edit_plot(p1, row = 3, gp = gpar(col = "red", fontface = "italic"))# 加粗字体
g <- edit_plot(g,row = c(2, 5),gp = gpar(fontface = "bold"))# 改变第6行的背景色
g <- edit_plot(g, row = 6, which = "background",gp = gpar(fill = "darkolivegreen1"))# 在顶部增加文字
g <- insert_text(g,text = "A short title",col = 3:4,part = "header",gp = gpar(fontface = "bold"))# 增加下划线
g <- add_underline(g, part = "header")# 插入文字
g <- insert_text(g,text = "This is a long text. Age and gender summarised above.\nBMI is next",row = 7,just = "left",gp = gpar(cex = 0.6, col = "green", fontface = "italic"))plot(g)

果然是很强啊!细节满满!而且非常方便,比forestplot包强多了!

有亚组的森林图

还是用上次推文的数据。

rm(list = ls())df <- read.csv("../000files/forestplot.csv", header = T)df$` ` <- paste(rep(" ", 26), collapse = " ")# 改个列名
colnames(df)[4:7] <- c("HR(95%CI)","mean","low","high")df
##                         Subgroup   AP   PA       HR(95%CI) mean  low high
## 1                   All patients   NR 27.2 0.75(0.61-0.93) 0.75 0.61 0.93
## 2                  Baseling ECOG                             NA   NA   NA
## 3                              0   NR 27.2 0.71(0.55-0.92) 0.71 0.55 0.92
## 4                              1   NR 26.4 0.86(0.58-1.28) 0.86 0.58 1.28
## 5                Baseling BPI-SF                             NA   NA   NA
## 6                            0~1   NR 27.2 0.71(0.54-0.94) 0.71 0.54 0.94
## 7                            2~3 25.5   NR 0.87(0.59-1.29) 0.87 0.59 1.29
## 8  Bone metastases only at entry                             NA   NA   NA
## 9                            Yes   NR 27.2 0.68(0.48-0.96) 0.68 0.48 0.96
## 10                            No   NR 27.5 0.81(0.61-1.06) 0.81 0.61 1.06
## 11                           Age                             NA   NA   NA
## 12                           <65   NR   NR  0.8(0.51-1.24) 0.80 0.51 1.24
## 13                           ≥65   NR 26.4  0.73(0.57-0.94 0.73 0.57 0.94
## 14                           ≥75   NR 23.8    0.71(0.51-1) 0.71 0.51 1.00
## 15     Baseline PSA above median                             NA   NA   NA
## 16                           Yes 26.9 23.8 0.72(0.43-0.94) 0.72 0.43 0.94
## 17                            No   NR   NR  0.77(0.38-1.09 0.77 0.38 1.09
## 18     Baseline LDH above median                             NA   NA   NA
## 19                           Yes   NR 23.6 0.69(0.53-0.91) 0.69 0.53 0.91
## 20                            No   NR 27.5 0.79(0.55-1.12) 0.79 0.55 1.12
## 21   Baseline ALK-P above median                             NA   NA   NA
## 22                           Yes   NR 23.6  0.79(0.6-1.04) 0.79 0.60 1.04
## 23                            No   NR 27.5 0.66(0.46-0.94) 0.66 0.46 0.94
## 24                        Region                             NA   NA   NA
## 25                 North America   NR 27.2 0.66(0.49-0.88) 0.66 0.49 0.88
## 26                         Other   NR   NR 0.89(0.65-1.22) 0.89 0.65 1.22

太棒了,和之前的比较一下,你喜欢哪一个呢?

现在的:

之前的:

获取代码及示例数据请关注微信公众号:医学和生信笔记,号内搜索森林图即可。

获取更多R语言知识,请关注公众号:医学和生信笔记

医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。

用更简单的方式画森林图相关推荐

  1. R语言画森林图方法4

    获取更多R语言知识,请关注公众号:医学和生信笔记 医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化.主要分享R语言做医学统计学.meta分析.网络药理学.临床预测模型.机器学习.生 ...

  2. R语言 forestplot 包画森林图

    这是一段使用forestplot包画森林图的一段程序,已测能跑,需者自取~ tips1: 首先需要安装和加载forestplot包,如果通过常规途径无法加载,请检查一下自己是否有装Rtools ins ...

  3. android滑动图形验证码,Android使用更简单的方式实现滑块拼图验证码功能

    实现滑块拼图验证码功能之前已经写过一篇了,上一篇使用的是自定义控件的方式实现这个功能,主要还是想让童鞋们知其然更知其所以然,还没看的童鞋可以先看看Android实现滑块拼图验证码功能这篇. 在项目的开 ...

  4. 【最简单的python画折线图】半封装式代码画折线图,防止写重复代码

    一.为什么要写这个代码 很多时候画散点的折线图时,总是忘记代码细节怎么写,于是就想不如花点时间写几个函数,把画图的功能封装一下,下次画图这部分代码就能与其他代码隔离开来.使用者无需过多关注内部细节,只 ...

  5. HTML绘制拓扑简图,用最简单的方式画拓扑图!!!

    前言 前段时间重构了下面这样一个页面(产品页面不方便截图): 类似于拓扑图的配置,原来是使用go.js实现的,类似的库还有antv g6.重构主要是为了提高代码质量,降低维护成本,产品上需要更强的定制 ...

  6. 三星s20 android auto,Automagic一个更简单的方式来自动化您的Android手机 | MOS86

    你有没有想过你的智能手机会在你回家的时候开始播放音乐?当你关闭社交网络的时候怎么样?Automagic是一种替代方案,通过使用易于理解的流程图执行许多相同的任务,向用户提供了一种更简单的自动化Andr ...

  7. python画简单图片-Python 画个图

    先放上最后的结果图(数据画的有点丑,随便看看就好了): 功能描述: 这个脚本主要的作用就是监视指定文件夹中(示例中在脚本所在文件夹下)指定文件这里就是csv文件中的数据做折线图:再将这一系列的图保存成 ...

  8. 简单使用visio画时序图

    1.时序图作用 时序图是强调消息时间顺序的交互图,描述了对象之间传递消息的时间顺序,用来表示用例中德行为顺序. 纵轴是时间轴,时间沿竖线向下延伸,横轴代表了协作各独立的对象. 2.时序图包含了4个元素 ...

  9. 大聪明教你学Java | EasyExcel - 用更简单的方式操作Excel

    前言 我们在开发应用系统的时候经常遇到操作或解析 Excel 的需求,我们在实现此功能的时候也都是借助 Apach POI 去操作 Excel,但是使用过这个框架的小伙伴都知道,这个框架并不是很好用, ...

最新文章

  1. 性能测试八:jmeter进阶之beanshell
  2. 11/1787, 哈工大小学妹的比赛上分经验,附战友招募
  3. 现代操作系统: 第一章 引言
  4. N叉树的深度 python实现
  5. linux下influxdb安装教程,Linux下安装使用InfluxDB
  6. mac下一些终端命令的使用
  7. 我的docker随笔32:sftp服务部署
  8. Hpdl80服务器硬件驱动,hpe proliant dl80 gen9服务器用户指南.pdf
  9. 点云特征图离散化_点云采样
  10. 关于UTF-8的处理方法心得
  11. 使用linaro工具链编译ARM64架构内核
  12. 计算机主板上的ide,计算机主板上的IDE接口通常是连接什么设备的数据接口?
  13. 为什么流量过万转化率却很低?
  14. 力扣904(滑动窗口、哈希)
  15. STM32F4 | 新建工程模板——寄存器版本 | HAL库入门 | 新建工程模板——库函数版本
  16. 孩子近视为什么不让立马配眼镜?近视还有真假之分?
  17. Task 3: Subword Models (附代码)(Stanford CS224N NLP with Deep Learning Winter 2019)
  18. 最新研究:朝九晚五可能会让你的身心受到巨大伤害!
  19. 有关DSP2812与SPI接口DA芯片的通信(AD5640,AD5682)
  20. 阿里云安装数据库mysql数据库服务器_阿里云CentOs服务器 安装与配置mysql数据库...

热门文章

  1. QGIS添加常用的数据源
  2. idea项目总是自动重启_IDEA 下 SpringBoot 自动重启
  3. 8583组包解包及银联3des签到消费java示例
  4. day 54 django-图书管理系统_出版社的管理(展示,新增,删除,编辑)
  5. 第4期-通过起点中文网爬取小说
  6. web期末大作业-前端网页--H5--海贼王动态网页源码-海贼王网页
  7. vue 通过日期筛选数据
  8. 学习笔记:物料接收到质检库存的几种不同方式
  9. 把文件放在服务器上以供用户下载
  10. 【Google Play】创建和管理内部测试版本 ( 创建内部测试版本 | 检查并发布内部测试版本 )