Forest Plot Clip最小值不能正确解释?如何纠正它?

问题描述

我最近正在构建一个自治函数,以对任何类型的数据框制作森林图,但是我无法理解“剪辑部分”,它表示它传递了箭头设计的最小值和最大值两个值,但是每当我通过它时,最小值似乎都无法正确显示,这是示例:

multivariate_forest_plot <- function(df,factor_col,value_col){
  library(forestplot)
  library(dplyr)
  library(lattice)
  
  df <- df %>% 
    group_by(eval(parse(text=factor_col))) %>% 
    summarise(total = sum(eval(parse(text=value_col)),na.rm=TRUE),average = round(mean(eval(parse(text=value_col)),0),minimum = min(eval(parse(text=value_col)),maximum = max(eval(parse(text=value_col)),variance = var(eval(parse(text=value_col)),stddev = sd(eval(parse(text=value_col)),count = n()
    )
  
  df <- data.frame(df)
  colnames(df)[1] <- factor_col
  print(head(df))
  
  #1) Calculate Mean,Lower and Upper from the value columns
  mean_value <- df$average
  lower_value <- df$minimum
  upper_value <- df$maximum
  
  writeLines("mean value")
  print(mean_value)
  writeLines("lower value")
  print(lower_value)
  writeLines("upper value")
  print(upper_value)
  
  value_most_minimum <- min(lower_value,na.rm=TRUE)
  value_most_maximum <- max(upper_value,na.rm=TRUE)
  
  value_df <- data.frame(mean=mean_value,min=lower_value,max=upper_value)
  value_df <- rbind(NA,value_df) #for header
  value_df <- rbind(value_df,NA) #for space before grand summary
  average_average <- mean(value_df$mean,na.rm=TRUE)
  average_min <- mean(value_df$min,na.rm=TRUE)
  average_max <- mean(value_df$max,na.rm=TRUE)
  grand_value <- data.frame(mean=average_average,min=average_min,max=average_max)
  value_df <- rbind(value_df,grand_value)
  
  factor_table <- c()
  avg_value_table <- c()
  min_value_table <- c()
  max_value_table <- c()
  
  #2) Make Table Structure
  table_length <- nrow(df) + 3
  for(tab in 1:table_length){
    if(tab==1){
      #Header Colname
      factor_table <- c(factor_table,as.character(factor_col))
      avg_value_table <- c(avg_value_table,paste0(as.character(value_col),"(mean)"))
      min_value_table <- c(min_value_table,"(min)"))
      max_value_table <- c(max_value_table,"(max)"))
    }
    else if(tab > 1 && tab <= (table_length-2)){
      #Main Body
      factor_table <- c(factor_table,as.character(df[tab-1,1]))
      avg_value_table <- c(avg_value_table,as.character(value_df$mean[tab]))
      min_value_table <- c(min_value_table,as.character(value_df$min[tab]))
      max_value_table <- c(max_value_table,as.character(value_df$max[tab]))
    }
    else if(tab > (table_length-2)){
      #Grand Summary
      if(tab == (table_length-1)){
        factor_table <- c(factor_table,NA)
        avg_value_table <- c(avg_value_table,NA)
        min_value_table <- c(min_value_table,NA)
        max_value_table <- c(max_value_table,NA)
      }
      else if(tab == (table_length)){
        factor_table <- c(factor_table,"Summary Grand Average")
        avg_value_table <- c(avg_value_table,as.character(value_df$mean[tab]))
        min_value_table <- c(min_value_table,as.character(value_df$min[tab]))
        max_value_table <- c(max_value_table,as.character(value_df$max[tab]))
      }
    }
  }
  tabletext <- cbind(factor_table,avg_value_table,min_value_table,max_value_table)
  
  writeLines("")
  writeLines("====================Value DF Provided=============================")
  writeLines("")
  print(value_df)
  
  writeLines("")
  writeLines("====================Table Text Provided=============================")
  writeLines("")
  print(tabletext)
  
  trellis.device(device = "windows",height = 600,width = 1200,color = TRUE)
  
  print(paste0("most maximum value = ",value_most_maximum))
  print(paste0("most minimum value = ",value_most_minimum))
  
  forestplot(tabletext,value_df,new_page = TRUE,is.summary=c(TRUE,rep(FALSE,nrow(df)),TRUE,TRUE),clip=c(value_most_minimum,value_most_maximum),xlog=TRUE,col=fpColors(Box="royalblue",line="darkblue",summary="royalblue",hrz_lines = "#444444"),vertices = TRUE)
}

在此示例中,我选择CO2数据集来解释森林图,如下所示:

factor_merge <- function(df,factor_col1,factor_col2,sep="-",merge_name="merged_factor"){
  factor_vector <- paste0(as.character(df[[factor_col1]]),sep,as.character(df[[factor_col2]]))
  df[[merge_name]] <- as.factor(factor_vector)
  return(df)
}

CO2_merged_factor <- factor_merge(CO2,"Type","Treatment",merge_name = "Type_Treatment")
CO2_merged_factor <- factor_merge(CO2_merged_factor,"Type_Treatment","conc",merge_name = "Type_Treatment_conc")

最后,我用这个来解释森林图:

multivariate_forest_plot(CO2_merged_factor,"Type_Treatment_conc","uptake")

结果如下所示:

enter image description here

此示例的剪辑最小值必须为7.7,最大值应为45.5,但是箭头显示的7.7值是从中点(中心)开始而不是从头开始,有人知道如何处理吗?谢谢您的反馈

我会通过以下基本参考资料来做到这一点:https://cran.r-project.org/web/packages/forestplot/vignettes/forestplot.html

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)