森林图(Forest Plot)是一种常用于展示多个研究结果的汇总效果图表,特别是在荟萃分析和系统评价中。它通过图形方式总结了多项独立研究的结果,可以直观地比较和评估各个研究的效应量及其置信区间。
森林图的组成部分
研究标签(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(-2, 2), breaks = seq(-1, 1, 1)) +
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(0, 4), "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(1, 0), legend.justification = c(1, 0)) +
scale_color_manual(values = c("gray", "steelblue", "red"))
代码解释:
库加载:
library(tidyverse)
library(GGally)
library(patchwork)加载了
tidyverse
用于数据处理,GGally
用于增强的ggplot2
功能,patchwork
用于组合多个图形。读取数据:
unicox <- read_csv("test.csv")
从
test.csv
文件中读取数据并存储在unicox
数据框中。绘制基因组生存分析图:
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(-2, 2), breaks = seq(-1, 1, 1)) +
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(0, 4), "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(1, 0), legend.justification = c(1, 0)) +
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(0, 4), "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_log
、lower_95_log
和upper_95_log
四舍五入并合并成一个字符串。p4:创建一个显示 p.value
的子图,并将p.value
转换为字符。
合并图形:
(p2 + p3 + p4 + p1) + plot_layout(widths = c(.12, .28, .15, .8))
使用 patchwork
包的功能,将子图p2
、p3
、p4
和主图p1
合并成一个整体,并设置每个图形的宽度比例。
生信分析服务器共享产品
试用版:48线程、512GB内存、200GB硬盘,397元/半年,25元/人 主推版:88线程、512GB内存、400GB硬盘,597元/年,50元/人 高端版:256线程、2TB内存、800GB硬盘,797元/年,150元/人 硬盘扩容:每增加100GB硬盘,额外收费100元/年
欢迎关注
往期回顾
点点“分享”,给我充点儿电吧~