user36196
user36196

Reputation: 69

R forestplot() function with different coloured text labels

Is there a way in a forestplot (using the R forestplot() function) to have text labels in different colours on the left hand side of the plot?

i.e. I'd like the plot to look like: enter image description here

with different coloured left hand labels. I could plot two forest plots and paste them together, but I'd prefer a solution which would allow all elements to line up correctly on a single plot (there are 9 labels that need to be one colour in one group and ~20 that need to be another in the other group)

If there is, how would I proceed with the forestplot() function and the library to obtain this?

Edit to add a reproducible code snippet:

EDIT: to provide a minimum code example

library(forestplot)
library(tidyr)

cohort <- data.frame(Age = c(43, 39, 34, 55, 70, 59, 44, 83, 76, 44, 
                             75, 60, 62, 50, 44, 40, 41, 42, 37, 35, 55, 46), 
                     Group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                                         1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), levels = c("1","2"), class = "factor"))

age.lm <- lm(Age ~ Group, data = cohort)

age.data <- summary(age.lm)$coefficients[2,]

age.data <- rbind(c(0,0,0,1,"Group 1", "n=15"),
                  c(age.data[1], age.data[1]-age.data[2]*1.95, 
                  age.data[1]+age.data[2]*1.95, age.data[4], "Group 2", "n=7"))

colnames(age.data) <- c("mean","lower","upper","p-val","labeltext","numbers")

age.data <- data.frame(age.data)


age.data$mean <- as.numeric(age.data$mean)
age.data$lower <- as.numeric(age.data$lower)
age.data$upper <- as.numeric(age.data$upper)


age.plot <- forestplot(age.data,
           labeltext = c(labeltext,numbers),
           boxsize = 0.1,
           xlog = FALSE,
           clip=c(-20,20),
           xticks=c(-20,-10,0,10,20),
           txt_gp = fpTxtGp(ticks=gpar(cex=1)),
           align=c("l","c","l"))
           

This snippet generates a monochrome plot, but I want the labels on the left hand side to be different colours.

EDIT: It initially looks like fpColors() might provide this functionality, but it colours all the text elements in the row with the specified colour, and not just the text label on the left hand side.

Upvotes: 2

Views: 397

Answers (2)

Ningshan Li
Ningshan Li

Reputation: 21

Here is a workaround to color only the "Group" column while keeping the "Sample size (n)" column in black. You can ensure the color for "Sample size (n)" remains black by specifying it in the txt_gp argument using fpTxtGp.

mylabel <- list(
  gpar(),  # for group
  gpar(col = 'black')  # for sample size n
)

age.plot <- forestplot(age.data,
                       labeltext = c(labeltext, numbers),
                       boxsize = 0.1,
                       xlog = FALSE,
                       clip=c(-20,20),
                       xticks=c(-20,-10,0,10,20),
                       align=c("l","c","l"),
                       col = fpColors(text=c('red','blue')),
                       txt_gp = fpTxtGp(label=mylabel, ticks=gpar(cex=1)))

enter image description here

Upvotes: 0

Waldi
Waldi

Reputation: 41260

You could use the col argument to modify text with fpColors():

forestplot(age.data,
           labeltext = c(labeltext,numbers),
           boxsize = 0.1,
           xlog = FALSE,
           clip = c(-20,20),
           xticks = c(-20,-10,0,10,20),
           txt_gp = fpTxtGp(ticks=gpar(cex=1)),
           align = c("l","c","l"),
           col = fpColors(text=c('red','blue'))
           )

enter image description here

Upvotes: 2

Related Questions