为forestplot图表添加表头时出现报错,寻求技术解决方案
解决forestplot添加表头时的"Label length is not equal to values2 != 1"报错
问题重现
添加表头时触发报错:
Error in pr_convert_insert_estimates(mean = mean, lower = lower, upper = upper, :
Label length is not equal to values2 != 1
移除fp_add_header后森林图可正常生成,原代码如下:
pacman::p_load(forestplot, tidyverse, dplyr) labeltext <- c('Altered level of consciousness','Central neuropathy','Fever','Headache','Hypotension','Nausea vomiting','Pallor','Visual changes','Weakness','Altered level of consciousness','Central neuropathy','Fever', 'Headache','Hypotension','Nausea vomiting','Pallor','Visual changes','Weakness') mean <- c(0.52,0.88,1.01,0.97,0.55 ,0.99,0.64,0.49,NA,NA,0.04 ,0.1,0.09,0.04,0.04,0.04 ,0.04,NA) lower <-c(0.39,0.7,0.72,0.59,0.45,0.69,0.44,0.32,NA,NA,0.02,0.04,0.03,0.02,0.01,0.01,0.01,NA) upper <-c(0.68,1.11,1.43,1.6,0.68,1.42,0.95,0.73,NA,NA,0.11,0.23,0.31,0.09,0.15,0.16,0.17,NA) df <- data.frame(labeltext, mean, lower, upper) df %>% forestplot(title = "Model estimates", labeltext = c(labeltext, mean, lower, upper), clip = c(0,3), lty.ci=c(3), lwd.ci = 1, ci.vertices = TRUE, ci.vertices.height = 0.05, boxsize = .25, ticks = gpar(fontfamily = "", cex = 5), xlab = "mean (95% CI)", grid = structure(c(1), gp=gpar(lty=2, lwd=1))) %>% fp_add_lines() %>% fp_set_style(box = "royalblue", line = "darkblue", align = "lrrr", hrz_lines = "#999999") %>% fp_add_header(labeltext = c("", "study variables"), mean = c("", "Odds Ratio"), lower = c("", "95% LCI"), upper = c("", "95% UCI"))
问题原因
labeltext = c(labeltext, mean, lower, upper)写法错误:将标签列和数值列的所有值拼接成单一向量,打乱了森林图的列结构,导致表头添加时长度不匹配。fp_add_header参数结构错误:表头层级未与列的数量、类型对应,空值使用导致列长度不匹配。
解决方案
修改forestplot的labeltext参数,直接使用数据框的标签列,同时调整fp_add_header的表头结构,确保每列表头层级正确。修改后的代码如下:
pacman::p_load(forestplot, tidyverse, dplyr) labeltext <- c('Altered level of consciousness','Central neuropathy','Fever','Headache','Hypotension','Nausea vomiting','Pallor','Visual changes','Weakness', 'Altered level of consciousness','Central neuropathy','Fever','Headache','Hypotension','Nausea vomiting','Pallor','Visual changes','Weakness') mean <- c(0.52,0.88,1.01,0.97,0.55 ,0.99,0.64,0.49,NA,NA,0.04 ,0.1,0.09,0.04,0.04,0.04 ,0.04,NA) lower <-c(0.39,0.7,0.72,0.59,0.45,0.69,0.44,0.32,NA,NA,0.02,0.04,0.03,0.02,0.01,0.01,0.01,NA) upper <-c(0.68,1.11,1.43,1.6,0.68,1.42,0.95,0.73,NA,NA,0.11,0.23,0.31,0.09,0.15,0.16,0.17,NA) df <- data.frame(labeltext, mean, lower, upper) df %>% forestplot(title = "Model estimates", # 直接使用数据框的labeltext列作为标签,数值列自动关联mean/lower/upper labeltext = labeltext, clip = c(0,3), lty.ci = 3, lwd.ci = 1, ci.vertices = TRUE, ci.vertices.height = 0.05, boxsize = .25, ticks = gpar(fontfamily = "", cex = 0.5), # 修正cex值,原5过大导致显示异常 xlab = "Odds Ratio (95% CI)", grid = structure(c(1), gp = gpar(lty=2, lwd=1))) %>% fp_add_lines() %>% fp_set_style(box = "royalblue", line = "darkblue", align = "lrrr", hrz_lines = "#999999") %>% # 调整表头结构:第一列表头为"Study Variables",数值列分两行表头 fp_add_header(labeltext = "Study Variables", mean = c("Odds Ratio", "OR"), lower = c("95% CI", "LCI"), upper = c("", "UCI"))
关键修改说明
- 修正
labeltext参数:不再拼接所有列,直接使用数据框的labeltext列作为森林图的第一列标签,forestplot会自动关联mean/lower/upper列作为数值列。 - 调整表头层级:数值列的表头分为两行,第一行统一显示"Odds Ratio (95% CI)",第二行分别标注OR、LCI、UCI,避免长度不匹配。
- 修正
ticks的cex值:原代码中cex=5会导致刻度文字过大无法显示,改为0.5更合理。
内容的提问来源于stack exchange,提问作者Prajwal Mani Pradhan
相关产品推荐
相关产品推荐

