用更简单的方式画森林图

获取更多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)

unnamed-chunk-3-139618484

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

稍加美化:

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)

unnamed-chunk-4-139618484

更改主题!!

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

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

# 自定义主题,修改各种细节
tm <- forest_theme(base_size = 10, # 基础大小
                   
                   # 可信区间点的形状,线型、颜色、宽度
                   ci_pch = 16,
                   ci_col = "#4575b4", # #762a83
                   ci_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)

image-20220404131134788

编辑图形

除了使用主题外,该包还支持对图形进行特定的调整,比如更改某一行的颜色,控制字体,增加空行等等,主要是通过下面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)

image-20220404131244931

果然是很强啊!细节满满!而且非常方便,比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

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

现在的:

forestploter_now

之前的:

请添加图片描述

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

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

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

基于`svycoxph`的森林是一种用于展示生存分析中Cox比例风险模型结果的形方法。在R语言中,可以通过结合`survey`和`survival`包来实现。这里提供一个基本的步骤指南来生成森林: 1. 首先确保已经安装了`survey`和`survival`包,如果未安装,可以使用`install.packages("survey")`和`install.packages("survival")`来进行安装。 2. 使用`svycoxph`函数拟合Cox比例风险模型。这通常涉及到设置一个生存对象和一个公式,其中包含了感兴趣的协变量和可能的分层因素。 3. 从拟合好的模型中提取所需的系数和统计量。 4. 使用`forestplot`包或者`ggplot2`包来绘制森林。`forestplot`包提供了专门用于生成森林的函数,而`ggplot2`则提供了大的灵活性来定制形。 以下是一个简化的示例代码,展示如何使用`forestplot`包来创建森林: ```R library(survey) library(survival) library(forestplot) # 假设已经通过svycoxph拟合了模型svy_cox_model # svy_cox_model <- svycoxph(...) # 提取模型结果 model_results <- summary(svy_cox_model) # 定义森林需要的表格内容 table_text <- cbind(coef=round(model_results$coefficients, 2), lower=round(model_results$conf.int[,1], 2), upper=round(model_results$conf.int[,2], 2), pval=round(model_results$sctest, 2)) # 使用forestplot函数绘制森林 forestplot(labeltext=table_text, hrzl_lines=list("2"=gpar(lwd=1, columns=1:3, col="grey")), xticks=seq(-3, 3, by=0.5), xlab="Hazard Ratio", is.summary = c(TRUE, rep(FALSE, nrow(table_text)-1)), boxsize = 0.1, # 可以根据需要调整 lineheight = unit(2, "mm")) ``` 请注意,上述代码仅为示例,实际应用时需要根据具体数据和模型细节进行调整。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值