查看原文
其他

用更简单的方式画森林图

阿越就是我 医学和生信笔记 2023-02-25
关注公众号,发送R语言Pyhton,获取学习资料!


前面介绍了使用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.5780.1650.2460.7000.3480.1391.0170.531), 
 lower = c(0.3720.0180.0720.3330.0830.0160.3650.386),
 upper = c(0.8981.5170.8331.4741.4551.2092.8310.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(25),
               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

之前的:

下面是画图代码。

画图就很简单了:

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存