I have developed a forest plot using the following sample data and code:
###### Load data and packages Tabletext <- read.csv("~/Desktop/Test/Tabletext.csv", stringsAsFactors = F, na.strings = c("N/A", "", "NA")) # Import clean version of tabletext Table <- read.csv("~/Desktop/Test/Test_Tabletext.csv", stringsAsFactors = F, na.strings = c("N/A", "", "NA")) # Import old tabletext for forestplot design pacman::p_load(pacman, party, rio, tidyverse) library(scales) structure(list(X = c("Variable", NA, "Continuous", "Cell A", " ", " ", " ", NA, "Cell B", NA, NA, NA, NA, "Cell C", NA, NA, NA, NA, "Cell D", NA, NA, NA, NA), X.1 = c("Type", NA, NA, "Type1", "Type2", "Type3", "Type4", "Unknown", "Type1", "Type2", "Type3", "Type4", "Unknown", "Type1", "Type2", "Type3", "Type4", "Unknown", "Type1", "Type2", "Type3", "Type4", "Unknown"), X.2 = c("OR (95%CI)", NA, NA, "2.60e+230 (0.00e+00 -Inf)", "NA ", "1.23e+04 (0.00e+00 -1.75e+11)", "3.59e+01 (3.10e-01 -4.13e+03)", "1.21e+01 (4.00e-02 -3.83e+03)", "6.39e+12 (4.03e-18 -1.75e+43)", "NA ", "2.75e+00 (0.00e+00 -2.09e+03)", "1.08e+01 (1.00e-01 -1.19e+03)", "5.06e+04 (1.00e-02 -2.54e+11)", "Inf (0.00e+00 -Inf)", "NA ", "5.00e+02 (0.00e+00 -5.40e+09)", "1.31e+01 (1.80e-01 -9.74e+02)", "4.90e-01 (0.00e+00 -4.62e+02)", "3.44e+01 (6.00e-02 -1.82e+04)", "NA ", "2.74e+01 (0.00e+00 -1.90e+05)", "1.23e+01 (1.40e-01 -1.04e+03)", "3.83e+09 (3.51e-05 -2.96e+23)" ), X.3 = c("p-value", NA, NA, "1", " NA", "0.23", "0.14", "0.4", "0.4", " NA", "0.88", "0.32", "0.17", "1", " NA", "0.39", "0.24", "0.84", "0.27", " NA", "0.5", "0.27", "0.18"), X.4 = c("FDR", NA, NA, "1", " NA", "0.67", "0.32", "0.53", "0.81", " NA", "0.88", "0.32", "0.36", "1", " NA", "0.67", "0.32", "0.84", "0.81", " NA", "0.67", "0.32", "0.36")), row.names = c(NA, -23L ), class = "data.frame") structure(list(Variable = c(NA, "Continuous", "Cell A", " ", " ", " ", NA, "Cell B", NA, NA, NA, NA, "Cell C", NA, NA, NA, NA, "Cell D", NA, NA, NA, NA), Type = c(NA, NA, "Type1", "Type2", "Type3", "Type4", "Unknown", "Type1", "Type2", "Type3", "Type4", "Unknown", "Type1", "Type2", "Type3", "Type4", "Unknown", "Type1", "Type2", "Type3", "Type4", "Unknown"), OR = c(NA, NA, 2.6e+230, NA, 12300, 35.9, 12.1, 6.39e+12, NA, 2.75, 10.8, 50600, Inf, NA, 500, 13.1, 0.494, 34.4, NA, 27.4, 12.3, 3.83e+08), Lower.95.CI = c(NA, NA, 0, NA, 0.00178, 0.311, 0.0385, 4.03e-18, NA, 0.00146, 0.0975, 0.0101, 0, NA, 0.00015, 0.177, 0.000529, 0.0647, NA, 0.00265, 0.145, 3.51e-05), Upper.95.CI = c(NA, NA, Inf, NA, 1.75e+11, 4130, 3830, 1.75e+43, NA, 2090, 1190, 2.54e+11, Inf, NA, 5.4e+09, 974, 462, 18200, NA, 190000, 1040, 2.96e+23), p.value = c(NA, NA, 0.998861302, NA, 0.234223384, 0.139379426, 0.395286095, 0.403434934, NA, 0.87711484, 0.321803077, 0.168744949, 0.998407711, NA, 0.392944826, 0.241531723, 0.839916941, 0.26922861, NA, 0.500190621, 0.268220999, 0.181966888), FDR = c(NA, NA, 0.998861302, NA, 0.666920828, 0.321803077, 0.527048126, 0.806869868, NA, 0.87711484, 0.321803077, 0.363933776, 0.998861302, NA, 0.666920828, 0.321803077, 0.839916941, 0.806869868, NA, 0.666920828, 0.321803077, 0.363933776)), row.names = c(NA, -22L), class = "data.frame") > # Formatting numbers to 2 decimal places: Table$OR <- as.numeric(scientific(Table$OR, digits = 3)) Table$Lower.95.CI <- as.numeric(scientific(Table$Lower.95.CI, digits = 3)) Table$Upper.95.CI <- as.numeric(scientific(Table$Upper.95.CI, digits = 3)) Forest_lines <- Table[,c(3:5)] # Separating out OR, 95% Upper and lower interval columns. # Building this data frame row by row to for the aforementioned 3 variables in such a way to match row items in 'Tabletext'. This will allow for design of forest lines in the forest plot: Forest_lines <- rbind(c(NA,NA,NA), c(NA,NA,NA), Forest_lines[c(3:23),]) fn <- local({ i = 0 no_lines <- sum(!is.na(Forest_lines$OR)) b_clrs = colorRampPalette(colors=c("orange", "purple", "green", "grey"))(no_lines) function(..., clr.marker){ i <<- i + 1 fpDrawNormalCI(..., clr.marker = b_clrs[i]) } }) ###Graphing the forest plot: library(forestplot) png("~/Desktop/Test.png", width = 1200, height = 800) forestplot(Tabletext, Forest_lines, fn.ci_norm = fn, new_page = T, is.summary=c(T, F, T, rep(FALSE, 23)), clip=c(0.01,50), xlog=T, graph.pos = 3, boxsize = 0.3, xticks = c(0.01, 0.1, 0.5, 1, 2, 10, 90), xlab = " Decreased value Increased value", txt_gp = fpTxtGp(label = gpar(fontfamily = "", cex=.95), ticks = gpar(cex=1.1), xlab = gpar(cex = 1.1)), title = "Test") dev.off()
However, I think there is an issue with the colour function in my code. Essentially, I would like all Type 1 boxes to appear as orange, all Type 2 boxes to appear as purple and so on. Any suggestions on how I can modify my code in order to assign a single colour to each box corresponding to to individual "Types"?