gforge / forestplot

Advanced forest plots in R using grid graphics
42 stars 15 forks source link

Misplaced grid lines with xlog=TRUE #14

Closed magda-cepeda closed 7 years ago

magda-cepeda commented 7 years ago

Dear all,

Please, I need some help about using the xlog=TRUE option.

It is requested to provide the mean, lower, upper, zero, grid and clip already as exponentials, but I find the package is drawing the grid lines at the exponential of the numbers I am already providing as exponentials. As a consequence, the grid lines are in the wrong place.

  structure(list(
    mean  = c(NA, NA, NA, 0.27, 0.47, 0.33, 0.69, 0.86, 0.37, 0.08, 0.44, 0.54, 0.41, NA), 
    lower = c(NA, NA, NA, 0.13, 0.12, 0.19, 0.12, 0.54, 0.17, 0.03, 0.16, 0.06, 0.29, NA),
    upper = c(NA, NA, NA, 0.58, 1.81, 0.60, 3.97, 1.36, 0.81, 0.21, 1.25, 4.50, 0.58, NA)),
    .Names = c("mean", "lower", "upper"), 
    row.names = c(NA, -27L), 
    class = "data.frame")

tabletext<-cbind(
  c("", "AB class", "", "     Aminoglycosides", "     B-lactams", "     Cephalosporins", "     Fenicoles", "     Fluoroquinolones", "     Multiresistance", "     Sulphamides", "     Tetracyclines", "     Tri/Sulpha", "     Subtotal", ""),  
  c("", "OR", "", "0.27", "0.47", "0.33", "0.69", "0.86", "0.37", "0.08", "0.44", "0.54", "0.41", ""),
  c("", "n", "", "4", "3", "2", "3", "4", "2", "3", "4", "3", "5", ""))

xticks <- c(0.1, 0.25, 0.5, 1, 1.5, 2, 3)

forestplot(tabletext,
           graph.pos = 3,
           txt_gp = fpTxtGp(label = gpar(fontsize=10)),
           hrzl_lines = list("3" = gpar(lty=1)),
           zero = 1,
           line.margin = .05,
           mean = cbind(metaan[,"mean"]),
           lower = cbind(metaan[,"lower"]),
           upper = cbind(metaan[,"upper"]),
           is.summary=c(FALSE, TRUE, rep(FALSE, 9)),
           col=fpColors(box=c("blue"), summary=c("blue")),
           grid = structure(0.41, 
                            gp = gpar(lty = 2, col = "#CCCCFF")),
           clip=c(0.1, 3),
           xlog=T,
           xticks=xticks,
           xlab="Odds ratio")

When provided the log to get the grid lines at the correct place (e.g. -0.38, or log(0.41)), I get the error message that I should provide all parameters already as exponential.

forestplot(tabletext,
           graph.pos = 3,
           txt_gp = fpTxtGp(label = gpar(fontsize=10)),
           hrzl_lines = list("3" = gpar(lty=1)),
           zero = 1,
           line.margin = .05,
           mean = cbind(metaan[,"mean"]),
           lower = cbind(metaan[,"lower"]),
           upper = cbind(metaan[,"upper"]),
           is.summary=c(FALSE, TRUE, rep(FALSE, 9)),
           col=fpColors(box=c("blue"), summary=c("blue")),
           grid = structure(-0.39, 
                            gp = gpar(lty = 2, col = "#CCCCFF")),
           clip=c(0.1, 3),
           xlog=T,
           xticks=xticks,
           xlab="Odds ratio")

Error in forestplot.default(tabletext, graph.pos = 3, txt_gp = fpTxtGp(label = gpar(fontsize = 10)),  : 
  All argument values (mean, lower, upper, zero, grid and clip) should be provided as exponentials when using the log scale. This is an intentional break with the original forestplot function in order to simplify other arguments such as ticks, clips, and more.

I have tried including the grid numbers as lists, but I always encounter the same error message either if I provide the numbers as exponentials (grid misplaced) or as log (error message).

I am wondering what I am doing wrong and if there is any other way to get the grid lines in the correct place.

Thanks in advance,

Magda.

gforge commented 7 years ago

What's wrong with the image that you get? I get from your code:

rplot

All values must be in exponential format, log simply changes how the x-axis is displayed. Please add an image to show the error (just drag and drop)

magda-cepeda commented 7 years ago

Thanks for your reply! This is rare, because I get the grid line in the opposite side. This is the figure I get: rplot

gforge commented 7 years ago

What version are you using and what is the exact code for that plot?

magda-cepeda commented 7 years ago

The package version is 1.7 The exact code I use is below:

install.packages("forestplot")
library(forestplot)

metaan <- 
structure(list(
  mean  = c(NA, NA, NA, 0.27, 0.47, 0.33, 0.69, 0.86, 0.37, 0.08, 0.44, 0.54, 0.41, NA), 
  lower = c(NA, NA, NA, 0.13, 0.12, 0.19, 0.12, 0.54, 0.17, 0.03, 0.16, 0.06, 0.29, NA),
  upper = c(NA, NA, NA, 0.58, 1.81, 0.60, 3.97, 1.36, 0.81, 0.21, 1.25, 4.50, 0.58, NA)),
  .Names = c("mean", "lower", "upper"), 
  row.names = c(NA, -27L), 
  class = "data.frame")

tabletext<-cbind(
  c("", "AB class", "", "     Aminoglycosides", "     B-lactams", "     Cephalosporins", "     Fenicoles", "     Fluoroquinolones", "     Multiresistance", "     Sulphamides", "     Tetracyclines", "     Tri/Sulpha", "     Subtotal", ""),  
  c("", "OR", "", "0.27", "0.47", "0.33", "0.69", "0.86", "0.37", "0.08", "0.44", "0.54", "0.41", ""),
  c("", "n", "", "4", "3", "2", "3", "4", "2", "3", "4", "3", "5", ""))

xticks <- c(0.1, 0.25, 0.5, 1, 1.5, 2, 3)

forestplot(tabletext,
           graph.pos = 3,
           txt_gp = fpTxtGp(label = gpar(fontsize=10)),
           hrzl_lines = list("3" = gpar(lty=1)),
           zero = 1,
           line.margin = .05,
           mean = cbind(metaan[,"mean"]),
           lower = cbind(metaan[,"lower"]),
           upper = cbind(metaan[,"upper"]),
           is.summary=c(FALSE, TRUE, rep(FALSE, 9)),
           col=fpColors(box=c("blue"), summary=c("blue")),
           grid = structure(0.41, 
                            gp = gpar(lty = 2, col = "#CCCCFF")),
           clip=c(0.1, 3),
           xlog=T,
           xticks=xticks,
           xlab="Odds ratio")
magda-cepeda commented 7 years ago

Ok, apparently the problem is indeed a package version, because I got the correct figure using the GitHub version of the package. The grid remains in the wrong side when using the version that is installed with the install.packages("forestplot") command, but after updating to the GitHub version, I got the correct figure.

gforge commented 7 years ago

Awesome, I should push the latest version to CRAN - the CRAN checks required got so complicated and I've been busy with other stuff so I haven't bothered with this for a while...