## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, dpi = 300, comment = "#>" ) ## ----final-plot, out.width = '95%', echo = FALSE------------------------------ knitr::include_graphics("img/metaplot.png") ## ----meta-forest, out.width="95%", fig.width = 10.6, fig.height = 3.6--------- library(grid) library(forestploter) # Read meta-analysis example data dt <- read.csv(system.file("extdata", "metadata.csv", package = "forestploter")) str(dt) # Prepare a blank column for the CI dt$cicol <- paste(rep(" ", 20), collapse = " ") # Select some columns for plotting; this will serve as the skeleton of the forest plot dt_fig <- dt[, c(1:7, 17, 8:13)] colnames(dt_fig) <- c("Study or Subgroup", "Events", "Total", "Events", "Total", "Weight", "", "", LETTERS[1:6]) dt_fig$Weight <- sprintf("%0.1f%%", dt_fig$Weight) dt_fig$Weight[dt_fig$Weight == "NA%"] <- "" # Convert NA to a blank string dt_fig[is.na(dt_fig)] <- "" # Set background to white and summary diamond to black tm <- forest_theme(core = list(bg_params = list(fill = c("white"))), summary_col = "black", arrow_label_just = "end", arrow_type = "closed") p <- forest(dt_fig, est = dt$est, lower = dt$lb, upper = dt$ub, sizes = sqrt(dt$weights / 100), is_summary = c(rep(FALSE, nrow(dt) - 1), TRUE), ci_column = 8, ref_line = 1, x_trans = "log", arrow_lab = c("Favours caffeine", "Favours decaf"), xlim = c(0.05, 100), ticks_at = c(0.1, 1, 10, 100), theme = tm) p ## ----edit-metaplot, out.width="95%", fig.width = 10.6, fig.height = 3.6------- # Change font face g <- edit_plot(p, row = 9, gp = gpar(fontface = "bold")) # Change color g <- edit_plot(g, col = 8, row = 9, which = "ci", gp = gpar(col = "blue", fill = "blue")) # Change the background of the total row g <- edit_plot(g, col = 1:7, row = 9, which = "background", gp = gpar(fill = "#f6eff7")) # Align text to center g <- edit_plot(g, col = 9:14, which = "text", hjust = unit(0.5, "npc"), x = unit(0.5, "npc")) g ## ----text-metaplot, out.width="95%", fig.width = 10.6, fig.height = 3.6------- # Add or insert some text to the header on top of CI columns g <- add_text(g, text = "IV, Random, 95% CI", part = "header", col = 7:8, gp = gpar(fontface = "bold")) g <- insert_text(g, text = "Odds ratio", part = "header", col = 7:8, gp = gpar(fontface = "bold")) # Group outcomes g <- add_text(g, text = "Caffeine", part = "header", row = 1, col = 2:3, gp = gpar(fontface = "bold")) g <- add_text(g, text = "Decaf", part = "header", row = 1, col = 4:5, gp = gpar(fontface = "bold")) # Add text on the top of the risk of bias data g <- add_text(g, text = "Risk of Bias", part = "header", row = 1, col = 9:14, gp = gpar(fontface = "bold")) # Insert event count g <- insert_text(g, text = c("Total events:"), row = 9, col = 1, before = FALSE, just = "left") # Note: The row counts need to add one to account for # `insert_text` in the previous step g <- add_text(g, text = "58", col = 2, row = 10, just = "left") g <- add_text(g, text = "46", col = 4, row = 10, just = "left") g ## ----border-metaplot, out.width="95%", fig.width = 10.6, fig.height = 3.6----- # Add or insert some text to the header g <- add_border(g, part = "header", row = 1, col = 9:14, gp = gpar(lwd = .5)) g <- add_border(g, part = "header", row = 2, gp = gpar(lwd = 1)) g ## ----grob-metaplot, out.width="95%", fig.width = 10.6, fig.height = 3.6------- g <- add_grob(g, row = 1:c(nrow(dt_fig) - 1), col = 9:14, order = "background", gb_fn = roundrectGrob, r = unit(0.05, "snpc"), gp = gpar(lty = "dotted", col = "#bdbdbd")) # Draw a circle grob; you can also draw a `pointsGrob` cols <- c("#eeee00", "#00cc00", "#cc0000") symb <- c("?", "+", "-") for(i in seq_along(symb)){ pos <- which(dt_fig == symb[i], arr.ind = TRUE) for(j in 1:nrow(pos)){ g <- add_grob(g, row = pos[j, 1], col = pos[j, 2], order = "background", gb_fn = circleGrob, r = 0.4, gp = gpar(fill = cols[i])) } } g ## ----txtgrob-metaplot, out.width="95%", fig.width = 10.6, fig.height = 3.6---- txt <- bquote(atop(paste("Heterogeneity: ", tau^2, " = 0.22; ", chi^2, " = 9.39, df = 6 (P = 0.15) ", I^2, " = 36%"), "Total for overall effect: Z = 1.15 (P = 0.25)")) add_text(g, text = txt, col = 1:6, row = 11, just = "left", parse = TRUE, gp = gpar(fontsize = 8)) ## ----gridtext-metaplot, out.width="95%", fig.width = 10.6, fig.height = 3.6---- txt <- "Heterogeneity: τ2 = 0.22; χ2 = 9.39, df = 6 (P = 0.15); I2 = 36%
**Total for overall effect:** Z = 1.15 (P = 0.25)" add_grob(g, row = 11, col = 1:6, order = "background", gb_fn = gridtext::richtext_grob, text = txt, gp = gpar(fontsize = 8), hjust = 0, vjust = 1, halign = 0, valign = 1, x = unit(0, "npc"), y = unit(1, "npc"))