Search code examples
rplotr-forestplot

forestplot has unusually large blue dot in graph


Im trying to create a forestplot, but the last row has a giant blue dot, instead of the small dot the other rows have. Any idea how to fix this? these vignettes are what Ive been using to create my code so far. My only thought is that the giant dot could be part of the summary (the dot seems similar) however I am not using a summary.

tab<-structure(list(names = c("(Intercept)", "xxx", "gender", "age"
), betas = c(54.6873516187792, 2.13385086140261, 3.26945254708992, 
             -0.305426541112294), upper = c(62.1308928551509, 4.60545786804931, 
                                            7.29686190386409, -0.112092252532382), lower = c(47.2438103824075, 
                                                                                             -0.337756145244089, -0.757956809684253, -0.498760829692206)), .Names = c("names", 
                                                                                                                                                                      "betas", "upper", "lower"), row.names = c("1", "2", "3", "4"), class = "data.frame")
###################################################################
xlab<-"xxxx"
clrs <- fpColors(box="royalblue",line="darkblue")
tabletext <-list(c(NA, tab$names),append(list(expression(beta)), sprintf("%.2f", tab$betas)))

forestplot(tabletext, 
           mean=c(NA,tab$betas),
           lower=c(NA,tab$lower),
           upper=c(NA,tab$upper),
           col=clrs,
           xlab=xlab,
           vertices = TRUE)

enter image description here


Solution

  • You can set the size of the boxes to be uniform with boxsize or input a vector with the same length as mean

    tab<-structure(list(names = c("(Intercept)", "xxx", "gender", "age"),
                        betas = c(54.6873516187792, 2.13385086140261, 3.26945254708992, -0.305426541112294),
                        upper = c(62.1308928551509, 4.60545786804931, 7.29686190386409, -0.112092252532382),
                        lower = c(47.2438103824075, -0.337756145244089, -0.757956809684253, -0.498760829692206)),
                   .Names = c("names", "betas", "upper", "lower"), row.names = c("1", "2", "3", "4"), class = "data.frame")
    
    xlab<-"xxxx"
    clrs <- fpColors(box="royalblue",line="darkblue")
    tabletext <-list(c(NA, tab$names),append(list(expression(beta)), sprintf("%.2f", tab$betas)))
    
    forestplot(tabletext,
               boxsize = c(NA, .1, .1, .1, .2),
               mean=c(NA,tab$betas),
               lower=c(NA,tab$lower),
               upper=c(NA,tab$upper),
               col=clrs, xlab=xlab, vertices = TRUE)
    

    or

    forestplot(tabletext, boxsize = .1,
               mean=c(NA,tab$betas),
               lower=c(NA,tab$lower),
               upper=c(NA,tab$upper),
               col=clrs, xlab=xlab, vertices = TRUE)
    

    enter image description here

    Looking into the code for forestplot, you can see how the boxsize is calculated for you. You need to define the following values:

    ## values needed
    upper <- c(NA,tab$upper)
    lower <- c(NA,tab$lower)
    txt_gp <- fpTxtGp()
    nr <- length(upper)
    
    
    ## calculation in forestplot
    cwidth <- (upper - lower)
    cwidth[cwidth <= 0 | is.na(cwidth)] <- min(cwidth[cwidth > 0])
    textHeight <- convertUnit(grobHeight(textGrob("A", gp = do.call(gpar, txt_gp$label))), unitTo = "npc", valueOnly = TRUE)
    info <- 1/cwidth * 0.75
    info <- info/max(info, na.rm = TRUE)
    if (any(textHeight * (nr + 0.5) * 1.5 < info))
      info <- textHeight * (nr + 0.5) * 1.5 * info /
        max(info, na.rm = TRUE) + textHeight * (nr + 0.5) * 1.5/4
    
    info
    # [1]         NA 0.02402603 0.02857476 0.02594405 0.10882403
    

    So now you should get the same sizes you had before

    forestplot(tabletext,
               boxsize = info,
               mean=c(NA,tab$betas),
               lower=c(NA,tab$lower),
               upper=c(NA,tab$upper),
               col=clrs, xlab=xlab, vertices = TRUE)
    

    enter image description here