3

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

rawr
  • 20,481
  • 4
  • 44
  • 78
Rilcon42
  • 9,584
  • 18
  • 83
  • 167

1 Answers1

1

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

rawr
  • 20,481
  • 4
  • 44
  • 78