You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ggplot2和gridExtra给森林图添加P值列并设置X轴为对数刻度

森林图添加P值列与设置log10格式X轴的实现方法

一、优化X轴的log10显示

你当前代码已经启用了log10转换,但默认刻度可能不够直观。可以手动指定刻度断点和标签,让X轴显示原始HR数值,同时保持log10的坐标轴缩放逻辑:

  • 在scale_x_continuous中添加breaks参数定义要显示的刻度点
  • 通过labels参数直接展示原始数值,避免显示log转换后的结果

二、添加右侧P值列

仿照现有HR和95% CI的表格列,新增一个展示P值的ggplot对象,再调整布局矩阵将其加入到右侧:

  1. 基于已有的table_base创建P值列的图表对象
  2. 修改布局矩阵,为P值列分配位置

修改后的完整代码

library(gridExtra)
library(ggplot2)

dat <- data.frame(
  Index = c(1, 2, 3, 4,5),
  label = c("All", "Her2+", "LumA", "LumB", "TNBC"),
  HR = c(0.2,0.23, 0.11, 0.22,0.2),
  LL = c(0.14, 0.08, 0.06, 0.1,0.11),
  UL = c(0.28, 0.68, 0.21, 0.5,0.35),
  CI = c("(0.14 - 0.28)", "(0.08 - 0.68)", "(0.06 - 0.21)", "(0.1 - 0.5)", "(0.11 - 0.35)"), 
  P_Value = c("<0.0001", "0.0065", "<0.0001", "<0.0001", "0.0001")
)

plot1 <- ggplot(dat, aes(y = Index, x = HR)) + 
  geom_point(shape = 18, size = 5) +  
  geom_errorbarh(aes(xmin = LL, xmax = UL), height = 0.25) +
  geom_vline(xintercept = 1, color = "red", linetype = "dashed", cex = 1, alpha = 0.5) +
  # 优化log10格式的X轴刻度
  scale_x_continuous(
    trans = 'log10',
    breaks = c(0.1, 0.5, 1, 2, 5),
    labels = c("0.1", "0.5", "1", "2", "5"),
    name = "Hazard Ratio (Log10 Scale)"
  ) +
  scale_y_continuous(name = "", breaks=1:5, labels = dat$label, trans = "reverse") +
  theme_bw() +
  theme(panel.border = element_blank(),
        panel.background = element_blank(),
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "black"),
        axis.text.y = element_text(size = 12, colour = "black"),
        axis.text.x.bottom = element_text(size = 12, colour = "black"),
        axis.title.x = element_text(size = 12, colour = "black"))

table_base <- ggplot(dat, aes(y=label)) +
  ylab(NULL) + xlab("  ") + 
  theme(plot.title = element_text(hjust = 0.5, size=12), 
        axis.text.x = element_text(color="white", hjust = -3, size = 25),
        axis.line = element_blank(),
        axis.text.y = element_blank(), 
        axis.ticks = element_blank(),
        axis.title.y = element_blank(), 
        legend.position = "none",
        panel.background = element_blank(), 
        panel.border = element_blank(), 
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), 
        plot.background = element_blank())

tab1 <- table_base + 
  geom_text(aes(y = rev(Index), x = 1, label = sprintf("%0.2f", HR)), size = 4) + 
  ggtitle("HR")

tab2 <- table_base +
  geom_text(aes(y = rev(Index), x = 1, label = CI), size = 4) + 
  ggtitle("95% CI")

# 新增P值列的图表对象
tab3 <- table_base +
  geom_text(aes(y = rev(Index), x = 1, label = P_Value), size = 4) + 
  ggtitle("P值")

# 修改布局矩阵,为P值列分配位置
lay <-  matrix(c(1,1,1,1,1,1,1,1,1,1,2,3,3,4), nrow = 1)
grid.arrange(plot1, tab1, tab2, tab3, layout_matrix = lay)

关键修改说明

  1. X轴优化:在scale_x_continuous中指定了breaks和labels,让刻度显示0.1、0.5、1等原始HR值,同时保留log10的坐标轴缩放,更符合临床解读习惯
  2. P值列添加:新增tab3对象调用dat$P_Value数据,修改layout_matrix增加第4列,将P值列放在最右侧
  3. 调整了HR的显示格式为%0.2f,保留两位小数更精准

内容的提问来源于stack exchange,提问作者jjjjj1234

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:12:54