如何用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对象,再调整布局矩阵将其加入到右侧:
- 基于已有的
table_base创建P值列的图表对象 - 修改布局矩阵,为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)
关键修改说明
- X轴优化:在
scale_x_continuous中指定了breaks和labels,让刻度显示0.1、0.5、1等原始HR值,同时保留log10的坐标轴缩放,更符合临床解读习惯 - P值列添加:新增
tab3对象调用dat$P_Value数据,修改layout_matrix增加第4列,将P值列放在最右侧 - 调整了HR的显示格式为
%0.2f,保留两位小数更精准
内容的提问来源于stack exchange,提问作者jjjjj1234
相关产品推荐
相关产品推荐

