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

为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"))

问题原因

  1. labeltext = c(labeltext, mean, lower, upper)写法错误:将标签列和数值列的所有值拼接成单一向量,打乱了森林图的列结构,导致表头添加时长度不匹配。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:31:09