[R] changing font size in Forest plot code.

David Winsemius dwinsemius at comcast.net
Sun Jan 19 23:16:24 CET 2014


On Jan 19, 2014, at 1:13 PM, Gerard Smits wrote:

> Hi All,
> 
> I have pulled the following function (fplot) from the internet, and unfortunately I do not see an author to whom I can give credit.  It used grid graphics and relies mostly on package rmeta by Thomas Lumley.  I am trying to make the font smaller in my labeltext, but don‚t see any references to font size in the code.  Digitize changes the number size on the x-axis, but don‚t see a corresponding way of making the labeling size smaller.
> 

Wouldn't it just be needed to specify grid parameters (as exemplified several other places in that code)  in the code where 'labels' are created?

...
labels[[j]][[i]] <- textGrob(labeltext[i, j], x = x, 
                just = just, gp = gpar(fontsize=8, fontface = if (is.summary[i]) "bold"
                else "plain", col = rep(col$text, length = nr)[i]))
...

Seems to succeed (once the errant and quite strange double comma character '„' is removed and replaced with a proper double quote.) If you are doing this on a word processor, then you should convert to a programming text editor.

-- 
David.

> Using R 3.0.2
> 
> Any suggestions appreciated.
> 
> Gerard Smits
> 
> fplot=function (labeltext, mean, lower, upper, align = NULL, is.summary = FALSE, 
>    clip = c(-Inf, Inf), xlab = "", zero = 1, graphwidth = unit(3,"inches"),
>    col = meta.colors(), xlog = FALSE, xticks = NULL,
>    xlow=0, xhigh, digitsize, boxsize, 
>    ...) 
> 
> {
>    require("grid")  || stop("`grid' package not found")
>    require("rmeta") || stop("`rmeta' package not found")
> 
> 
>    drawNormalCI <- function(LL, OR, UL, size) 
>    {
> 
>        size = 0.75 * size
>        clipupper <- convertX(unit(UL, "native"), "npc", valueOnly = TRUE) > 1
>        cliplower <- convertX(unit(LL, "native"), "npc", valueOnly = TRUE) < 0
>        box <- convertX(unit(OR, "native"), "npc", valueOnly = TRUE)
>        clipbox <- box < 0 || box > 1
> 
>        if (clipupper || cliplower) 
>        {
>            ends <- "both"
>            lims <- unit(c(0, 1), c("npc", "npc"))
>            if (!clipupper) {
>                ends <- "first"
>                lims <- unit(c(0, UL), c("npc", "native"))
>            }
>            if (!cliplower) {
>                ends <- "last"
>                lims <- unit(c(LL, 1), c("native", "npc"))
>            }
>            grid.lines(x = lims, y = 0.5, arrow = arrow(ends = ends, 
>                length = unit(0.05, "inches")), gp = gpar(col = col$lines))
> 
>            if (!clipbox) 
>                grid.rect(x = unit(OR, "native"), width = unit(size, 
>                  "snpc"), height = unit(size, "snpc"), gp = gpar(fill = col$box, 
>                  col = col$box))
>        }
>        else {
>            grid.lines(x = unit(c(LL, UL), "native"), y = 0.5, 
>                gp = gpar(col = col$lines))
>            grid.rect(x = unit(OR, "native"), width = unit(size, 
>                "snpc"), height = unit(size, "snpc"), gp = gpar(fill = col$box, 
>                col = col$box))
>            if ((convertX(unit(OR, "native") + unit(0.5 * size, 
>                "lines"), "native", valueOnly = TRUE) > UL) && 
>                (convertX(unit(OR, "native") - unit(0.5 * size, 
>                  "lines"), "native", valueOnly = TRUE) < LL)) 
>                grid.lines(x = unit(c(LL, UL), "native"), y = 0.5, 
>                  gp = gpar(col = col$lines))
>        }
> 
>    }
> 
>    drawSummaryCI <- function(LL, OR, UL, size) {
>        grid.polygon(x = unit(c(LL, OR, UL, OR), "native"), y = unit(0.5 + 
>            c(0, 0.5 * size, 0, -0.5 * size), "npc"), gp = gpar(fill = col$summary, 
>            col = col$summary))
>    }
> 
>    plot.new()
>    widthcolumn <- !apply(is.na(labeltext), 1, any)
>    nc <- NCOL(labeltext)
>    labels <- vector("list", nc)
>    if (is.null(align)) 
>        align <- c("l", rep("r", nc - 1))
>    else align <- rep(align, length = nc)
>    nr <- NROW(labeltext)
>    is.summary <- rep(is.summary, length = nr)
>    for (j in 1:nc) {
>        labels[[j]] <- vector("list", nr)
>        for (i in 1:nr) {
>            if (is.na(labeltext[i, j])) 
>                next
>            x <- switch(align[j], l = 0, r = 1, c = 0.5)
>            just <- switch(align[j], l = "left", r = "right", c = "center")
>            labels[[j]][[i]] <- textGrob(labeltext[i, j], x = x, 
>                just = just, gp = gpar(fontface = if (is.summary[i]) "bold"
>                else "plain", col = rep(col$text, length = nr)[i]))
>        }
>    }
>    colgap <- unit(3, "mm")
>    colwidths <- unit.c(max(unit(rep(1, sum(widthcolumn)), "grobwidth", 
>        labels[[1]][widthcolumn])), colgap)
>    if (nc > 1) {
>        for (i in 2:nc) colwidths <- unit.c(colwidths, max(unit(rep(1, 
>            sum(widthcolumn)), "grobwidth", labels[[i]][widthcolumn])), 
>            colgap)
>    }
>    colwidths <- unit.c(colwidths, graphwidth)
>    pushViewport(viewport(layout = grid.layout(nr + 1, nc * 2 + 
>        1, widths = colwidths, heights = unit(c(rep(1, nr), 0.5), 
>        "lines"))))
>    cwidth <- (upper - lower)
> 
>    #xrange <- c(max(min(lower, na.rm = TRUE), clip[1]), min(max(upper, na.rm = TRUE), clip[2]))
>    xrange <- c(xlow,xhigh)
> 
>    info <- 1/cwidth
>    info <- info/max(info[!is.summary], na.rm = TRUE)
>    info[is.summary] <- 1
> 
>    if (!is.null(boxsize))
>         info <- rep(boxsize, length = length(info))
> 
>    for (j in 1:nc) {
>        for (i in 1:nr) {
>            if (!is.null(labels[[j]][[i]])) {
>                pushViewport(viewport(layout.pos.row = i, layout.pos.col = 2 * 
>                  j - 1))
>                grid.draw(labels[[j]][[i]])
>                popViewport()
>            }
>        }
>    }
> 
>    pushViewport(viewport(layout.pos.col = 2 * nc + 1, xscale = xrange))
>    grid.lines(x = unit(zero, "native"), y = 0:1, gp = gpar(col = col$zero))
>    if (xlog) {
>        if (is.null(xticks)) {
>            ticks <- pretty(exp(xrange))
>            ticks <- ticks[ticks > 0]
>        }
>        else {
>            ticks <- xticks
>        }
>        if (length(ticks)) {
>            if (min(lower, na.rm = TRUE) < clip[1]) 
>                ticks <- c(exp(clip[1]), ticks)
>            if (max(upper, na.rm = TRUE) > clip[2]) 
>                ticks <- c(ticks, exp(clip[2]))
>            xax <- xaxisGrob(gp = gpar(cex = digitsize, col = col$axes), 
>                at = log(ticks), name = "xax")
>            xax1 <- editGrob(xax, gPath("labels"), label = format(ticks, digits = 2))
>            grid.draw(xax1)
>        }
>    }
>    else {
>        if (is.null(xticks)) {
>            grid.xaxis(gp = gpar(cex = digitsize, col = col$axes))
>        }
>        else if (length(xticks)) {
>            grid.xaxis(at = xticks, gp = gpar(cex = 0.6, col = col$axes))
>        }
>    }
> 
>    grid.text(xlab, y = unit(-2, "lines"), gp = gpar(col = col$axes))
>    popViewport()
>    for (i in 1:nr) {
>        if (is.na(mean[i])) 
>            next
>        pushViewport(viewport(layout.pos.row = i, layout.pos.col = 2 * 
>            nc + 1, xscale = xrange))
>        if (is.summary[i]) 
>            drawSummaryCI(lower[i], mean[i], upper[i], info[i])
>        else drawNormalCI(lower[i], mean[i], upper[i], info[i])
>        popViewport()
>    }
>    popViewport()
> }
> 
> 
> 
> # my code starts here:
> 
> 
> labletext<-cbind(c("",
>                   "All Available Eyes (n=194)",
>                   "", 
>                   "Month 12 Visit Timing          (p=0.8312*)",
>                   "   Before Window (n=12)",
>                   "   In Window (n=146)", 
>                   "   After Window (n=36)", 
>                   "", 
>                   "Major Protocol Deviation     (p=0.5189*)", 
>                   "   None (n=149)",
>                   "   Present (n=45)",
>                   "",
>                   "Protocol Approved Device    (p=0.5131*)", 
>                   "   Yes (n=62)",
>                   "   No (n=132)",
>                   "",
>                   "ITT Imputations", 
>                   "   Multiple Imputation (n=210)",
>                   "   LOCF (n=210)",
>                   "   Worst Case (n=210)"
>                   ),
> 
>                 c("",
>                   " 0.0309 [-0.0488  0.1106]",
>                   "","",
>                   "","","","","",
>                   "","","","","",
>                   "","","","","",
>                   "",""))
> 
> 
> m <- c(NA,  0.0309, NA, NA,  0.1591,  0.0286,  0.0153, NA, NA,  0.0529, -0.0441, NA, NA,  0.0364,  0.0455,  NA, NA,  0.0123,  -0.0667, -0.1429)
> l <- c(NA, -0.0488, NA, NA, -0.0524, -0.0548, -0.1372, NA, NA, -0.0251, -0.2106, NA, NA, -0.0529, -0.0605,  NA, NA, -0.0670,  -0.2333, -0.2576)
> u <- c(NA,  0.1106, NA, NA,  0.3706,  0.1120,  0.1678, NA, NA,  0.1309,  0.1224, NA, NA,  0.1257,  0.1515,  NA, NA,  0.0916,   0.1000, -0.0282)
> 
> 
> fplot(labletext, m, l ,u, zero=0, is.summary=c(rep(FALSE,3)), clip=c(0,8), xlog=FALSE,
>      xlow=-0.5, xhigh=+0.5, xlab=„\nVariable Tested", digitsize=0.9, graphwidth = unit(3,"inches"), 
>      boxsize=.6,
>      col=meta.colors(box="blue",line="blue", summary="red"))
> 
> grid.text("Forest Plot of xxx\nwith Point Estimate and 95% CI", x = .5, y = .9, gp=gpar(fontsize=15))
> grid.text("* Test of heterogeneity of subgroups using General Estimating Equation model.", x = .38, y = .07, gp=gpar(fontsize=10))
> 
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

David Winsemius
Alameda, CA, USA




More information about the R-help mailing list