科研绘图模板之森林图

学术   科学   2024-06-09 22:28   陕西  

森林图(Forest Plot)是一种常用于展示多个研究结果的汇总效果图表,特别是在荟萃分析和系统评价中。它通过图形方式总结了多项独立研究的结果,可以直观地比较和评估各个研究的效应量及其置信区间。

森林图的组成部分

  1. 研究标签(Study Labels)

  • 图的左侧通常列出每个包含在分析中的研究名称或编号。这部分列出了每个单独研究的来源或识别信息。
  • 效应量估计(Effect Size Estimates)

    • 效应量可以是相对风险(RR)、风险比(HR)、优势比(OR)等,取决于研究的类型。
    • 每个研究的效应量通常用一个点或方块表示。方块的大小通常与研究的权重成比例,权重越大,方块越大。
  • 置信区间(Confidence Intervals)

    • 每个效应量点或方块旁边会有一条水平线,表示该效应量的置信区间(通常为95%)。
    • 置信区间线越短,表明该研究的结果越精确。
  • 综合效应量(Overall Effect Size)

    • 图的底部通常会有一个钻石形的符号,表示所有研究的综合效应量及其置信区间。
    • 钻石的中心位置表示综合效应量,钻石的宽度表示综合置信区间。
  • 垂直线(Vertical Line)

    • 图的中央通常有一条垂直线,表示“无效应”的位置。例如,对于风险比(HR),垂直线通常表示 HR=1。
    • 置信区间若跨过这条垂直线,则说明该研究结果没有统计显著性。
  • 权重(Weights)

    • 一些森林图还会显示每个研究在综合分析中的权重,以百分比形式表示。

    示例

    # 加载必要的库
    library(tidyverse)
    library(GGally)
    library(patchwork)

    # 读取数据
    unicox <- read_csv("test.csv")

    # 森林图
    p1 <- ggplot(unicox, aes(HR_log, cancer, col = Type)) +
      geom_point(aes(size = -log10(p.value))) +
      geom_errorbarh(aes(xmax = upper_95_log, xmin = lower_95_log), height = 0.4) +
      scale_x_continuous(limits = c(-22), breaks = seq(-111)) +
      geom_vline(aes(xintercept = 0)) +
      xlab('HR(95%CI)') + ylab(' ') +
      theme_bw(base_size = 12) +
      theme(axis.text.y = element_blank(),
            axis.ticks.y = element_blank(),
            axis.text.x = element_text(color = "black"),
            axis.title.y = element_blank(),
            plot.margin = unit(rep(04), "cm"),
            legend.title = element_blank(),
            legend.key = element_blank(),
            legend.text = element_text(color = "black", size = 9),
            legend.spacing.x = unit(0.1'cm'),
            legend.spacing.y = unit(0.1'cm'),
            legend.key.width = unit(0.2'cm'),
            legend.key.height = unit(0.2'cm'),
            legend.background = element_blank(),
            legend.box.background = element_rect(colour = "black"),
            legend.position = c(10), legend.justification = c(10)) +
      scale_color_manual(values = c("gray""steelblue""red"))

    代码解释:

    1. 库加载

      library(tidyverse)
      library(GGally)
      library(patchwork)

      加载了 tidyverse 用于数据处理,GGally 用于增强的 ggplot2 功能,patchwork 用于组合多个图形。

    2. 读取数据

      unicox <- read_csv("test.csv")

      test.csv 文件中读取数据并存储在 unicox 数据框中。

    3. 绘制基因组生存分析图

      p1 <- ggplot(unicox, aes(HR_log, cancer, col = Type)) +
        geom_point(aes(size = -log10(p.value))) +
        geom_errorbarh(aes(xmax = upper_95_log, xmin = lower_95_log), height = 0.4) +
        scale_x_continuous(limits = c(-22), breaks = seq(-111)) +
        geom_vline(aes(xintercept = 0)) +
        xlab('HR(95%CI)') + ylab(' ') +
        theme_bw(base_size = 12) +
        theme(axis.text.y = element_blank(),
              axis.ticks.y = element_blank(),
              axis.text.x = element_text(color = "black"),
              axis.title.y = element_blank(),
              plot.margin = unit(rep(04), "cm"),
              legend.title = element_blank(),
              legend.key = element_blank(),
              legend.text = element_text(color = "black", size = 9),
              legend.spacing.x = unit(0.1'cm'),
              legend.spacing.y = unit(0.1'cm'),
              legend.key.width = unit(0.2'cm'),
              legend.key.height = unit(0.2'cm'),
              legend.background = element_blank(),
              legend.box.background = element_rect(colour = "black"),
              legend.position = c(10), legend.justification = c(10)) +
        scale_color_manual(values = c("gray""steelblue""red"))
    • scale_color_manual(values = c("gray", "steelblue", "red")) 设置 Type 的颜色映射。
    • xlab('HR(95%CI)') + ylab(' ') 设置 x 轴标签。
    • theme_bw(base_size = 12) 使用白色背景主题并设置基础字体大小。
    • theme(...) 进行各种主题调整,如隐藏 y 轴文本和刻度,设置图例位置等。
    • scale_x_continuous(limits = c(-2, 2), breaks = seq(-1, 1, 1)) 设置 x 轴的范围和刻度。
    • geom_vline(aes(xintercept = 0)) 添加一条竖直线,x 轴交于 0。
    • geom_point(aes(size = -log10(p.value))) 使用 -log10(p.value) 作为点的大小。
    • geom_errorbarh(aes(xmax = upper_95_log, xmin = lower_95_log), height = 0.4) 绘制水平方向的误差线。
    • aes(HR_log, cancer, col = Type) 设置了数据的映射,HR_log 作为 x 轴,cancer 作为 y 轴,Type 作为颜色。
    • 映射和美学
    • 绘制点和误差线
    • x 轴设置
    • 标签和主题
    • 颜色手动设置
  • 定义简化文本图函数

    text_plot <- function(data, aes_y, x_label) {
      ggplot(data, aes(group, {{aes_y}})) +
        geom_text(aes(label = {{aes_y}}), size = 3, color = "black") +
        theme(panel.grid.major = element_blank(),
              axis.text = element_blank(),
              axis.ticks = element_blank(),
              axis.title.y = element_blank(),
              plot.margin = unit(rep(04), "cm")) +
        labs(x = x_label) +
        scale_x_discrete(position = "top")
    }
    • ggplot(data, aes(group, {{aes_y}})) 设置数据映射。
    • geom_text(aes(label = {{aes_y}}), size = 3, color = "black") 添加文本标签。
    • theme(...) 调整图形主题以去掉多余的元素。
    • labs(x = x_label) 设置 x 轴标签。
    • scale_x_discrete(position = "top") 将 x 轴标签放置在顶部。
    • data:输入数据框。
    • aes_y:要显示的变量。
    • x_label:x 轴标签。
    • 参数
    • 图形设置
  • 构建子图

    p2 <- unicox %>% 
      select(cancer) %>% 
      distinct() %>% 
      mutate(group = "A") %>% 
      text_plot(cancer, "Gene")

    p3 <- unicox %>% 
      select(HR_log, lower_95_log, upper_95_log) %>% 
      mutate(across(where(is.numeric), round, 2),
             `HR(95%Cl)` = paste(HR_log, "[", lower_95_log, " to ", upper_95_log, "]", sep = "")) %>% 
      select(`HR(95%Cl)`) %>% 
      mutate(group = "HR(95%Cl)") %>% 
      text_plot(`HR(95%Cl)`, "HR(95%Cl)")

    p4 <- unicox %>% 
      select(p.value) %>% 
      mutate(across(where(is.numeric), round, 2),
             p.value = as.character(p.value),
             group = "A") %>% 
      text_plot(p.value, "p.value")
    • p2:创建一个显示 cancer 的子图。
    • p3:创建一个显示 HR(95%Cl) 的子图,将 HR_loglower_95_logupper_95_log 四舍五入并合并成一个字符串。
    • p4:创建一个显示 p.value 的子图,并将 p.value 转换为字符。
  • 合并图形

    (p2 + p3 + p4 + p1) + plot_layout(widths = c(.12.28.15.8))
    • 使用 patchwork 包的功能,将子图 p2p3p4 和主图 p1 合并成一个整体,并设置每个图形的宽度比例。

    生信分析服务器共享产品

    • 试用版:48线程、512GB内存、200GB硬盘,397元/半年,25元/人
    • 主推版:88线程、512GB内存、400GB硬盘,597元/年,50元/人
    • 高端版:256线程、2TB内存、800GB硬盘,797元/年,150元/人
    • 硬盘扩容:每增加100GB硬盘,额外收费100元/年

    END

    欢迎关注






    往期回顾

    沉浸式翻译网页插件:一种全新的网页体验!

    探索Chatpaper:科研人员的智能文献助手

    ggtree:一款强大的R语言绘制生物进化树工具

    科研绘图模板之多组差异箱线图

    科研绘图模板之箱线分面图

    科研绘图模板之小提琴分面图

    探索Circos图:视觉化基因相关性的强大工具

    数据流动的艺术:桑葚图全解析


    点点“分享”,给我充点儿电吧~

    Bioinfor 生信云
    分享生信小工具,以及各种测序分析专题,期待有志之士的加入!