R语言编程

20240201_Forestploter包:森林图绘制指南

Song Wei Song Wei 2024年2月8日 00:48
603
20240201_Forestploter包:森林图绘制指南

森林图是一种在医学统计和各种科学研究中常用的图表,特别是在元分析中展示不同研究结果的效应量及其信心区间。通过一系列的点估计和横向线段,森林图能够直观地展示出各项研究的结果大小和不确定性,同时也可以用来展示结果之间的异质性。森林图的应用非常广泛,不仅限于医学领域。在任何需要对多个研究结果进行汇总和比较的情况下,森林图都是一个极好的选择。它可以帮助研究人员、政策制定者和实践者理解研究之间的一致性,检测研究结果的异质性,从而做出更加信息化的决策。


在森林图中,每项研究通常用一条横线表示,其长度反映了该研究结果的信心区间,而线段中央的点则代表了效应量的估计值。所有研究的结果被并排展示,使得读者可以轻松比较不同研究间的一致性与差异性。此外,森林图还常常包含一个表示所有研究综合效应量估计的综合线,为读者提供一个关于整体趋势的快速视觉概括。最后感谢婞芷让我意外地获得了一次深入学习和掌握新画图技巧的机会, 嘿嘿。


测试数据:


绘图代码:
library(forestploter)
library(grid)
data <- read.csv("测试数据-7.csv", fileEncoding = "GB18030", na.strings = c("", "NA"))
data$lowerCI_na <- ifelse(data$lowerCI == "-", "na", data$lowerCI)
data$upperCI_na <- ifelse(data$upperCI == "-", "na", as.numeric(data$upperCI) )


data$lowerCI <- ifelse(data$lowerCI == "-", -120, data$lowerCI)
data$upperCI <- ifelse(data$upperCI == "-", 120, as.numeric(data$upperCI) )



# 这段代码的作用是对 data 数据框中的 Subgroups 列进行处理,将其中每个元素(字符串)在特定的宽度处自动换行,并且在换行后的各行之间插入缩进。
data$Subgroups = sapply(data$Subgroups, function(x) paste(strwrap(x, width = 30), collapse = "\n    "))
data$Subgroups


# 这段代码的作用是检查"data$Placebo"列中的每个元素是否为缺失值,如果是缺失值,则不做任何更改,如果不是缺失值,则在"data$Subgroups"列的值前面添加四个空格。这是为了对数据进行格式化或显示的目的。
data$Subgroups <- ifelse(is.na(data$Placebo), 
                         data$Subgroups,
                         paste0("    ", data$Subgroups))

# 这行代码用于处理数据框 data 中 Vaccine 列的缺失值(NA)。如果 Vaccine 列中的某个值是 NA(即缺失值),则将其替换为空字符串("");如果不是缺失值,则保留原来的值。这样的处理通常用于确保数据的一致性,特别是在后续操作中避免由于缺失值引起的错误。
data$Vaccine <- ifelse(is.na(data$Vaccine), "", data$Vaccine)
data$Placebo <- ifelse(is.na(data$Placebo), "", data$Placebo)
# 用于计算标准误差
#data$se <- (log(data$upperCI) - log(data$OR))/1.96
data$se <- log10(data$OR)/1.96


# 这段代码的作用是在 data 数据框中添加一个新的空白列,用于在森林图(forest plot)中显示置信区间(CI)。这行代码创建了一个新列,其中每个单元格都是由40个连续空格组成的字符串。这个空白列在森林图中的作用是为了调整列宽或者为了在图表中留出特定的空间,以便更好地展示置信区间或其他图形元素。在可视化中添加这样的空白列是一种常见的技巧,用于改善图表的布局和可读性。
data$` ` <- paste(rep(" ", 40), collapse = " ")






# 这段代码的作用是在 data 数据框中创建一个新的列,名为 HR (95% CI),用于显示每行数据的风险比(Hazard Ratio, HR)及其95%置信区间(Confidence Interval, CI)
data$lowerCI_na <- ifelse(data$lowerCI_na == "-", NA, as.numeric(data$lowerCI_na))
data$upperCI_na <- ifelse(data$upperCI_na == "-", NA, as.numeric(data$upperCI_na))
data$`HR (95% CI)` <- ifelse(is.na(data$lowerCI), "",
                             ifelse(is.na(data$OR), "",
                                    sprintf("%.2f (%.2f to %.2f)",
                                            as.numeric(data$OR), as.numeric(data$lowerCI_na), as.numeric(data$upperCI_na))
                             )
)


# 用于自定义森林图的外观和样式。具体来说,它设置了多个图形元素的属性,以改善森林图的可读性和美观度。
tm <- forest_theme(base_size = 10,
                   #refline_col = "red",
                   refline_col = "NA",
                   arrow_type = "closed",
                   footnote_col = "blue")
tm <- forest_theme(base_size = 10,
                   # Confidence interval point shape, line type/color/width
                   ci_pch = 18,
                   #ci_col = "#762a83",
                   ci_col = "black",
                   ci_lty = 1,
                   ci_lwd = 1.5,
                   ci_Theight = 0.2, # Set an T end at the end of CI
                   # Reference line width/type/color
                   refline_lwd = 1,
                   refline_lty = "dashed",
                   #refline_col = "grey20",
                   refline_col = "NA",
                   # Vertical line width/type/color
                   vertline_lwd = 1,
                   vertline_lty = "dashed",
                   vertline_col = "grey20",
                   # Change summary color for filling and borders
                   summary_fill = "#4575b4",
                   summary_col = "#4575b4",
                   # Footnote font size/face/color
                   footnote_cex = 0.6,
                   footnote_fontface = "italic",
                   footnote_col = "blue")


p5 <- forest(data[,c(1,3,4,13,14)],
             est = data$OR,
             lower = data$lowerCI, 
             #lower = as.numeric( data$lowerCI), 
             upper = data$upperCI,
             sizes = data$se,
             ci_column = 4,
             #ref_line = 1,
             #arrow_lab = c("Placebo Better", "Treatment Better"),
             xlim = c(0, 100.1),
             ticks_at = c(0, 25, 50,75, 100.1),
             #footnote = "This is the demo data. Please feel free to change\nanything you want.",
             theme = tm)

plot(p5)



library(ggplot2)
ggsave(filename = "new_rplot_result.pdf", plot = p5,
       dpi = 300,
       width = 11, height = 7, units = "in")

绘图结果:

标签: rstudio
Weather
北京 天气
0℃

网站浏览