跟着高分SCI学作图: R语言森林图哪家强?

文摘   2024-09-28 08:13   德国  

跟着高分SCI学作图: R语言森林图哪家强?

R语言中的森林图(Forest Plot)主要用于可视化比较多个研究结果的效应大小和置信区间。它能够在平面直角坐标系中,以一条垂直于X轴的无效线(通常坐标X=1或0)为中心,用若干条平行于X轴的线段来表示每个研究的效应量大小及其95%可信区间,并用一个棱形(或其他图形)来表示多个研究合并的效应量及可信区间。这种图形表示方式能够直观地反映出不同研究之间的一致性和差异性,以及整体效应的大小。

1 森林图的效应指标

在森林图中,常用的效应量指标包括风险比(RR)概率比(OR)风险比率(HR)加权均值差异(WMD)等。这些指标用于描述不同研究或数据集之间的效果大小或差异。

  • 1.RR(Risk Ratio):风险比,用于比较两组人群中患病或经历某一事件的风险。
  • 2.OR(Odds Ratio):概率比,用于描述两组中某一事件发生的几率之比。
  • 3.HR(Hazard Ratio):风险比率,通常用于生存分析中,用于比较不同处理组或暴露组之间的事件(如死亡)发生风险的比率。
  • 4.WMD(Weighted Mean Difference):加权均值差异,用于比较两组之间连续变量的差异。

今天我们将要盘点用R语言中不同包绘制森林图。

  • survminer包 - 用于生存分析中的森林图绘制
    • 加载包:survminer, survival
    • 示例代码:使用Cox模型和ggforest函数
  • forestplot包 - 用于美化荟萃分析中的森林图
    • 加载包:tidyverse, forestplot, meta
    • 示例代码:基于OR和置信区间的荟萃分析森林图
  • ggplot2包 - 使用 ggplot2 进行灵活自定义的森林图绘制
    • 加载包:ggplot2
    • 示例代码:自定义置信区间和效应值的森林图
  • forestploter包 - 创建复杂森林图
    • 加载包:grid, forestploter
    • 示例代码:可自定义多个置信区间列和复杂注释的森林图接下来我们正式进入绘图部分吧!

1 使用survival包绘制基本森林图

首先,我们从最基础的survival包开始,它可以帮助我们进行生存分析。然后,我们将展示如何使用ggforest函数绘制森林图,并自定义一些常用的参数。ggforest默认生成的森林图虽然简单明了,但我们可以通过调整参数使其更加个性化和符合需求。

1.1 加载R包

library(survminer)
library(survival)

1.2 示例数据:survival 包自带的 colon 数据集

我们将使用colon数据集,该数据集提供了与肿瘤患者相关的生存信息。

head(colon)
# id study      rx sex age obstruct perfor adhere nodes status differ
# 1  1     1 Lev+5FU   1  43        0      0      0     5      1      2
# 2  1     1 Lev+5FU   1  43        0      0      0     5      1      2
# 3  2     1 Lev+5FU   1  63        0      0      0     1      0      2
# 4  2     1 Lev+5FU   1  63        0      0      0     1      0      2
# 5  3     1     Obs   0  71        0      0      1     7      1      2
# 6  3     1     Obs   0  71        0      0      1     7      1      2
# extent surg node4 time etype
# 1      3    0     1 1521     2
# 2      3    0     1  968     1
# 3      3    0     0 3087     2
# 4      3    0     0 3087     1
# 5      2    0     1  963     2
# 6      2    0     1  542     1

1.3 构建Cox回归模型

这里我们将以病人生存和时间为因变量,以如下变量为自变量,构建生存分析的Cox回归模型。

  • sex--性别
  • rx -- 治疗方式
  • adhere -- 肿瘤是否粘附附近器官
model <- coxph(Surv(time, status) ~ sex + rx + adhere,data = colon )

1.4 使用 ggforest 绘制森林图并调整各类参数

ggforest的默认设置已经能够生成基础的森林图,但我们可以进一步定制它。以下示例展示如何调整文本大小、线条粗细、显示置信区间等参数。

pdf("custom_forest_plot.pdf", height = 8, width = 10)
ggforest(model, 
         data = colon,                      # 必须指定与模型匹配的数据集
         main = "Forest Plot of Cox Model"# 设置主标题
         cpositions = c(0.02, 0.22, 0.4),   # 调整置信区间和效应量列的位置
         fontsize = 1,                      # 调整整体字体大小
         refLabel = "Reference",            # 自定义参考组标签
         noDigits = 3)                      # 设置小数位数
dev.off()
图一 ggforest函数绘制森林图

主要调整的参数:

  • main:用于设置森林图的主标题。
  • cpositions:调整效应量和置信区间的列位置。该参数接收三个值,分别对应图中的左、中、右列,可以根据实际需要调整这些数值。
  • fontsize:设置整体字体大小。这是一个相对参数,1 代表默认大小,增大该值可以增加字体大小,减小可以缩小。
  • refLabel:可以自定义参考组的标签,默认是“1”,可以替换为“Reference”或其他标签。
  • noDigits:设置置信区间和效应量的小数位数,确保结果符合精度要求。

总结ggforest函数是一个用于快速生成基础森林图的工具,并没有太多自定义选项。如果你需要更复杂的布局或者风险表显示等功能,可能需要手动使用ggplot2或其他专门的森林图绘图函数(如forestplot包)进行绘制。
如果需要更灵活的绘图功能,可以考虑基于ggplot2手动绘制森林图,这样可以更好地控制所有的细节。

2 使用forestplot包美化森林图

相比基础的survminer,我们可以通过forestplot包来进一步美化森林图。

2.1 加载包

library(tidyverse)
library(forestplot)
library(meta)

2.2 构建数据集:

我们将基于一个新的数据集,模拟一个药物对疾病的治疗效果的荟萃分析结果,并美化森林图。

# 新的数据集
new_data <- structure(list(
  mean  = c(NA, NA, 0.45, 0.30, 0.65, 0.85, 0.70, 0.95, NA, 0.72), 
  lower = c(NA, NA, 0.25, 0.12, 0.45, 0.55, 0.50, 0.70, NA, 0.58),
  upper = c(NA, NA, 0.75, 0.60, 0.90, 1.15, 0.95, 1.25, NA, 0.88)),
  .Names = c("mean""lower""upper"), 
  row.names = c(NA, -10L), 
  class = "data.frame")

# 表格文本
new_tabletext <- cbind(
  c("""Study""Study 1""Study 2"
    "Study 3""Study 4""Study 5""Study 6", NA, "Summary"),
  c("N""Participants""120""100"
    "85""200""150""170", NA, NA),
  c("Effect Size""(OR)""0.45""0.30"
    "0.65""0.85""0.70""0.95", NA, "0.72"))

2.3 生成森林图并调整美化参数

我们将使用forestplot函数进行绘制,并进行自定义设置,包括颜色、X轴对数刻度、置信区间限制等。

# 设置配色方案
custom_colors <- fpColors(box = "#1f77b4",  # 蓝色箱体
                          line = "#ff7f0e",  # 橙色线条
                          summary = "#2ca02c",  # 绿色汇总
                          zero = "black",  # 中线
                          hrz_lines = "#d62728")  # 水平线颜色

# 生成森林图
pdf("advanced_forest_plot.pdf", height = 8, width = 6)
forestplot(new_tabletext, 
           new_data, 
           new_page = TRUE,  # 在新页面上绘制
           is.summary = c(TRUE, TRUE, rep(FALSE, 6), TRUE),  # 指定汇总行
           clip = c(0.1, 1.5),  # 限制置信区间的范围
           xlog = TRUE,  # 使用对数刻度
           col = custom_colors,  # 应用自定义颜色
           zero = 1,  # 中心参考线的位置
           lineheight = "auto",  # 自动调整行间距
           boxsize = 0.3,  # 控制箱体大小
           lwd.xaxis = 2,  # X轴线条宽度
           lwd.ci = 2,  # 置信区间线条宽度
           ci.vertices = TRUE,  # 在置信区间末端添加“钉子”
           ci.vertices.height = 0.1,  # 钉子的高度
           hrzl_lines = list("2" = gpar(lwd = 2, col = "#d62728")),  # 添加水平线
           txt_gp = fpTxtGp(label = gpar(fontfamily = "serif", cex = 0.85),  # 标签字体设置
                            ticks = gpar(cex = 0.85),  # 坐标刻度字体大小
                            xlab = gpar(cex = 1)),  # X轴标签字体大小
           xlab = "Odds Ratio (log scale)"  # 设置X轴标题
           )
dev.off()
图二 forestplot包绘制森林图

参数讲解

  1. new_page= TRUE:每次绘制都创建一个新页面,适合生成多页报告。
  2. is.summary= c(TRUE, TRUE, rep(FALSE, 6), TRUE):指明哪些行是汇总行(例如总的效应量)。
  3. clip= c(0.1, 1.5):限制置信区间的显示范围,防止超出预设范围的点影响图形可读性。
  4. xlog= TRUE:将 X 轴设为对数刻度,通常在分析比值比 (OR) 或风险比 (HR) 时使用。
  5. zero= 1:设置中线的位置,1 通常代表效应的无效点(例如 OR = 1)。
  6. lineheight= "auto":自动调整行间距,使图表内容更清晰紧凑。
  7. boxsize= 0.3:设置箱体的大小。这个值越大,箱体越大,反映不同研究的权重。
  8. lwd.xaxis= 2 和 lwd.ci= 2:分别设置 X 轴和置信区间线条的粗细。
  9. ci.vertices= TRUE 和 ci.vertices.height= 0.1:在置信区间的两端添加“钉子”,提高视觉效果,钉子的高度可以调整。
  10. hrzl_lines= list("2" = gpar(lwd = 2, col = "#d62728")):在第 2 行下方绘制一条水平线,增强图表的分割感。
  11. txt_gp:用于控制标签、坐标刻度和 X 轴标签的字体大小和风格,这里使用了 serif 字体,并根据需求调整了不同部分的大小。
  12. xlab= "Odds Ratio (log scale)":为 X 轴添加标题,标明比值比的对数刻度。

总结: 通过调整forestplot函数中的各类参数,读者可以根据需求自定义森林图的外观。不同颜色、线条宽度、字体大小等设置,能让图表更符合视觉习惯和发表要求。这种灵活的控制可以为读者提供更好的工具用于科研展示和教学分析。

3 使用ggplot2包绘制森林图

ggplot2提供了更多自定义功能,让你可以绘制更加灵活的图表。在下面这个例子中,我们将使用了ggplot2包来绘制森林图,并对图形进行了一些基础的美化。接下来我会详细讲解代码和如何进一步调整配色和布局,让森林图看起来更有高级感。通过自定义颜色、主题和排版,森林图将变得更加专业和吸引眼球。

3.1 加载包

library(ggplot2) 

3.2 创造示例数据集

首先,加载ggplot2库并构建一个示例数据集。数据集包含五种生物标志物及其相应的效应值beta、标准误差se和置信区间。

# 创建示例数据集
df_linear <- data.frame(
  name = c("Biomarker A""Biomarker B""Biomarker C""Biomarker D""Biomarker E"),
  beta = c(0.5, -0.3, 0.8, -0.6, 0.2),
  se = c(0.1, 0.15, 0.05, 0.2, 0.1),
  trait = c("Trait 1""Trait 2""Trait 3""Trait 1""Trait 2")
)

# 计算置信区间的上下限
df_linear$lower <- df_linear$beta - 1.96 * df_linear$se
df_linear$upper <- df_linear$beta + 1.96 * df_linear$se

# 查看示例数据集
print(df_linear)

3.3 绘制基础森林图

使用ggplot2中的geom_pointrange()绘制基础森林图。这个函数可以显示效应值(beta)以及其对应的置信区间(lowerupper)。

### 绘制基础森林图
ggplot(df_linear, aes(x = reorder(name, beta), y = beta, ymin = lower, ymax = upper, color = trait)) +  
  geom_pointrange() +  
  geom_hline(yintercept = 0, linetype = "dashed") +  
  labs(x = "", y = "Effect Size", title = "Associations to metabolic traits",  
       color = "Trait",  
       xlab = "1-SD increment in cardiometabolic trait per 1-SD increment in biomarker concentration") +  
  theme_test() +  
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # 如果标签太长,可以旋转它们  

3.4如果要保存为PDF

pdf("forest_ggplot2.pdf", height = 7, width = 10)  
print(last_plot())  # 打印上一个ggplot对象到PDF  
dev.off()
图三 ggplot2绘制基础森林图

3.5 美化配色和布局

在这个示例中,我们可以通过调整配色方案和主题来提升森林图的美观度。我们可以修改不同变量的颜色,使得森林图在视觉上更有层次感和对比度。在这个例子中,我使用了一些高对比度的颜色,但你可以根据需要自行选择。

# 自定义配色方案
custom_colors <- c("Trait 1" = "#1b9e77""Trait 2" = "#d95f02""Trait 3" = "#7570b3")

ggplot(df_linear, aes(x = reorder(name, beta), y = beta, ymin = lower, ymax = upper, color = trait)) +  
  geom_pointrange(size = 1.5) +  # 调整点与线的大小
  geom_hline(yintercept = 0, linetype = "dashed", color = "black", size = 1) +  # 中心线
  scale_color_manual(values = custom_colors) +  # 应用自定义颜色
  labs(x = "", y = "Effect Size", title = "Customized Forest Plot",  
       color = "Trait",  
       xlab = "1-SD increment in cardiometabolic trait per 1-SD increment in biomarker concentration") +  
  theme_test() +  # 使用简洁主题
  theme(axis.text.x = element_text(angle = 45, hjust = 1),  # 旋转标签以避免重叠
        axis.title.y = element_text(size = 12),  # 调整Y轴标题大小
        plot.title = element_text(size = 14, face = "bold"),  # 标题加粗
        legend.position = "top")  # 将图例位置移动到顶部
图四 ggplot2绘制美化森林图

在这里,为了进一步提升森林图的视觉效果,我们对图形的布局和风格进行了如下一些调整:

  1. 点与线的大小:通过调整 geom_pointrange(size = 1.5) 中的 size 参数,使得置信区间线条更粗,数据点更明显。
  2. 主题优化:theme_minimal() 作为一个简洁的主题,非常适合现代风格的图形展示。结合自定义的字体大小和颜色设置,整体效果更加高级。
  3. 自定义图例位置:通过 legend.position = "top",我们将图例放置在图形的顶部,避免与数据点重叠。

4 使用forestploter包创建复杂森林图

我们将基于心血管疾病的模拟数据集来演示如何使用forestploter包创建一个美观且自定义的森林图,并详细讲解如何调整和美化图形。通过这一例子,读者将了解到如何灵活定制森林图的各种参数。

4.1 加载R包

library(grid)
library(forestploter)

4.2 读取数据

我们首先创建一个模拟的数据集,假设它来自一项心血管病治疗效果的荟萃分析。数据包括不同亚组(例如年龄、性别、心血管风险等)的治疗效应估计(风险比,HR)及其置信区间。

### 读取数据 
# 创建一个心血管病相关的模拟数据集
cvd_data <- data.frame(
  Subgroup = c("All Patients""Age""   <65 years""   >=65 years"
               "Gender""   Male""   Female""CV Risk""   High Risk""   Low Risk"),
  Treatment = c(800, NA, 300, 500, NA, 400, 400, NA, 500, 300),
  Placebo = c(800, NA, 350, 450, NA, 450, 350, NA, 550, 250),
  est = c(1.2, NA, 0.85, 1.4, NA, 1.1, 0.9, NA, 1.5, 0.8),
  low = c(1.0, NA, 0.60, 1.2, NA, 0.9, 0.7, NA, 1.2, 0.6),
  hi = c(1.4, NA, 1.10, 1.6, NA, 1.3, 1.1, NA, 1.8, 1.0)
)

# 计算标准误差
cvd_data$se <- (log(cvd_data$hi) - log(cvd_data$est)) / 1.96

# 添加空白列,用于显示置信区间列
cvd_data$` ` <- paste(rep(" ", 20), collapse = " ")

# 创建要显示的置信区间列
cvd_data$`HR (95% CI)` <- ifelse(is.na(cvd_data$se), "",
                                 sprintf("%.2f (%.2f to %.2f)",
                                         cvd_data$est, cvd_data$low, cvd_data$hi))

# 查看数据集
print(cvd_data)
图五 心血管病相关的模拟数据集

4.3 绘制基础森林图

接下来,我们将绘制一个基础的森林图。这个图形显示了各亚组的效应估计(HR)以及对应的置信区间。

# 绘制基础森林图
pdf("cvd_forest_plot_basic.pdf", height = 7, width = 10)
forest(cvd_data[, c(1:3, 8)],  # 显示子组、治疗、安慰剂和置信区间列
       est = cvd_data$est,
       lower = cvd_data$low
       upper = cvd_data$hi,
       sizes = cvd_data$se,  # 置信区间线的粗细
       ci_column = 4,  # 显示置信区间列的位置
       ref_line = 1,  # 参考线设置为1
       arrow_lab = c("Placebo Better""Treatment Better"),  # 箭头标签
       xlim = c(0.5, 2.0),  # X轴范围
       ticks_at = c(0.5, 1, 1.5, 2),  # X轴刻度
       footnote = "This is a simulated cardiovascular study data. \nFeel free to customize the forest plot.")
dev.off()
图六 forestploter包绘制基础森林图

4.4 通过自定义主题美化图形

我们将通过定义一个新的主题来美化森林图,调整点的形状、线条颜色、汇总列样式以及图例。

# 调整主题设置以美化森林图
theme_custom <- forest_theme(
  base_size = 12,  
  ci_pch = 18,  # 点的形状
  ci_col = "blue",  # 置信区间线的颜色
  ci_lty = 1,  # 置信区间线的类型
  ci_lwd = 2,  # 置信区间线的宽度
  ci_Theight = 0.3,  # 置信区间末端T形头的高度
  refline_gp = gpar(lwd = 1.5, lty = "dashed", col = "black"),  # 参考线样式
  vertline_lwd = 1.2,  # 垂直线宽度
  vertline_col = "grey50",  # 垂直线颜色
  summary_fill = "darkgreen",  # 汇总行的填充色
  summary_col = "darkgreen",  # 汇总行的边框颜色
  footnote_gp = gpar(cex = 0.8, fontface = "italic", col = "darkred")  # 脚注样式
)

# 绘制美化后的森林图
pdf("cvd_forest_plot_custom.pdf", height = 7, width = 10)
forest(cvd_data[, c(1:3, 8)],  # 显示子组、治疗、安慰剂和置信区间列
       est = cvd_data$est,
       lower = cvd_data$low
       upper = cvd_data$hi,
       sizes = cvd_data$se,  # 置信区间线的粗细
       ci_column = 4,  # 显示置信区间列的位置
       ref_line = 1,  # 参考线设置为1
       arrow_lab = c("Placebo Better""Treatment Better"),  # 箭头标签
       xlim = c(0.5, 2.0),  # X轴范围
       ticks_at = c(0.5, 1, 1.5, 2),  # X轴刻度
       footnote = "This is a simulated cardiovascular study data. \nFeel free to customize the forest plot.",
       theme = theme_custom  # 应用自定义主题
)
dev.off()
图七 forestploter包自定义主题美化森林图

4.5 进一步自定义森林图内容

我们还可以通过以下方式对图表进行更多自定义:

  • 改变某一行的颜色:
p <- forest(cvd_data[, c(1:3, 8)], est = cvd_data$est, lower = cvd_data$low, upper = cvd_data$hi, sizes = cvd_data$se, ci_column = 4, ref_line = 1, arrow_lab = c("Placebo Better""Treatment Better"), xlim = c(0.5, 2.0), ticks_at = c(0.5, 1, 1.5, 2), footnote = "This is a simulated cardiovascular study data.", theme = theme_custom)

# 修改第三行颜色
g <- edit_plot(p, row = 3, gp = gpar(col = "red", fontface = "italic"))

  • 调整特定行的背景颜色:
g <- edit_plot(g, row = 5, which = "background", gp = gpar(fill = "#e0f7fa"))

  • 在标题或其他部分插入下划线或添加说明:
add_underline <- function(plot,
                          row = NULL,
                          col = NULL,
                          part = c("body""header"),
                          gp = gpar(lwd = 2.0)){
  
  add_border(plot, row = row, col = col, part = part, where = "bottom", gp = gp)
  
}
g <- add_underline(g, part = "header")

  • 在特定行插入自定义文字:
g <- insert_text(g, text = "This row represents the age subgroup", row = 3, just = "left", gp = gpar(cex = 0.8, col = "blue"))
plot(g)
图八 forestploter包进一步美化森林图

总结

今天的推送详细介绍了如何使用R语言中的四个不同包来绘制森林图,每个包都有其独特的功能和优势:

  1. survminer包:非常适合生存分析,快速生成Cox模型的森林图,操作简便,适用于分析生存数据的研究者。
  2. forestplot包:专注于荟萃分析中的森林图绘制,通过简洁的代码实现精美的图表,适合展示多组研究结果的比较。
  3. ggplot2包:灵活性极高,适合自定义需求强的用户,可以根据特定数据和研究背景自定义颜色、主题、线条等,适合希望高度定制化的可视化展示。
  4. forestploter包:可以实现复杂的森林图绘制,支持多个置信区间列和丰富的注释选项,是展示复杂、多层次分析的利器。

通过这篇文章,大家不仅能掌握不同包绘制森林图的技巧,还能根据实际需求选择最合适的工具,让图形既科学准确又美观大方。希望这次的教程能帮助大家在科研中轻松绘制出专业的森林图!

本文作者:充电宝老师


现在:


长按扫码关注:科研生信充电宝


10元赞赏本文,即喜欢作者~


即可直接解锁:


《跟着高分SCI学作图: R语言森林图哪家强?》对应资源哦~


看到这里你还不心动吗?


赶紧关注、转发、点赞、分享,领取你的专属福利吧~



好啦,以上就是今天推文的全部内容啦!


版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本公众号不拥有所有权,也不承担相关法律责任。

如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:kysxcdb@163.com 进行举报,一经查实,本公众号将立刻删除涉嫌侵权内容。



科研生信充电宝
介绍科研;介绍统计;介绍生信;
 最新文章