| Title: | Create a Flexible Forest Plot |
|---|---|
| Description: | Create a forest plot based on the layout of the data. Confidence intervals in multiple columns by groups can be done easily. The plot is built step by step with the pipe, adding the axis, the labels and a style, editing the plot, inserting/adding text, and much more. |
| Authors: | Alimu Dayimu [aut, cre] (ORCID: <https://orcid.org/0000-0001-9998-7463>) |
| Maintainer: | Alimu Dayimu <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 1.2.0 |
| Built: | 2026-09-30 14:07:49 UTC |
| Source: | https://github.com/adayim/forestploter |
Add border to any cells at any side.
add_border( plot, row = NULL, col = NULL, part = c("body", "header"), where = c("bottom", "left", "top", "right"), gp = gpar(lwd = 2) )add_border( plot, row = NULL, col = NULL, part = c("body", "header"), where = c("bottom", "left", "top", "right"), gp = gpar(lwd = 2) )
plot |
A forest plot object. |
row |
A numeric value or vector indicating row number to add border. This is corresponding to the data row number. Remember to account for any text inserted. A border will be drawn to all rows if this is omitted. |
col |
A numeric value or vector indicating the columns to add border. A border will be drawn to all columns if this is omitted. |
part |
The border will be added to |
where |
Where to draw the border of the cell, possible values are
|
gp |
An object of class |
A gtable object.
gpar segmentsGrob gtable_add_grob
Draw grobs in any cells.
add_grob( plot, row = NULL, col = NULL, part = c("body", "header"), order = c("top", "text", "background", "bottom"), gb_fn, ... )add_grob( plot, row = NULL, col = NULL, part = c("body", "header"), order = c("top", "text", "background", "bottom"), gb_fn, ... )
plot |
A forest plot object. |
row |
A numeric value or vector indicating row(s) to draw a grob. |
col |
A numeric value or vector indicating the columns to draw a grob. |
part |
The grob will be added to |
order |
Order in which the grobs should be plotted. Use |
gb_fn |
Grob function |
... |
Other parameters to be passed to |
A gtable object.
This function can be used to add text to a forest plot. The text can span multiple rows and columns. The height of the row will be adjusted accordingly if the text is added to only one row. The width of the text may exceed the columns provided if the text is too long.
add_text( plot, text, row = NULL, col = NULL, part = c("body", "header"), just = c("center", "left", "right"), gp = gpar(), padding = unit(1, "mm"), parse = FALSE )add_text( plot, text, row = NULL, col = NULL, part = c("body", "header"), just = c("center", "left", "right"), gp = gpar(), padding = unit(1, "mm"), parse = FALSE )
plot |
A forest plot object. |
text |
A character or expression vector, see |
row |
Row to add the text, this will be ignored if the |
col |
A numeric value or vector indicating the columns the text will be added. The text will span over the column if a vector is given. |
part |
Part to add text, |
just |
The justification of the text, |
gp |
An object of class |
padding |
Padding of the text, default is |
parse |
Logical, behaviour for parsing text as plotmath, see
|
A gtable object.
gtable gpar textGrob
gtable_add_grob
This function is used to edit the graphical parameters of text and background of the forest plot.
edit_plot( plot, row = NULL, col = NULL, part = c("body", "header"), which = c("text", "background", "ci"), gp = gpar(), ... )edit_plot( plot, row = NULL, col = NULL, part = c("body", "header"), which = c("text", "background", "ci"), gp = gpar(), ... )
plot |
A forest plot object. |
row |
A numeric value or vector indicating row number to edit in the
dataset. Will edit the whole row if left blank for the body. This will be
ignored if the |
col |
A numeric value or vector indicating column to edit in the dataset. Will edit the whole column if left blank. |
part |
Part to edit, |
which |
Which element to edit, |
gp |
Pass |
... |
Other parameters to be passed to the grobs. See
|
A gtable object.
gpar editGrob forest_theme
textGrob rectGrob
A data frame will be used for the basic layout of the forest plot.
Graphical parameters can be set using the forest_style
function.
forest draws the table and the confidence intervals. The other parts
of the plot are added with functions that take the plot as their first
argument, so they can be chained with the pipe |>:
set_xaxis Limits, tick marks and scale of the x-axis,
and vertical lines
set_labs Title, x-axis labels, footnote, arrow labels
and legend labels
scale_sizes Point sizes scaled by study weights
set_style Graphical parameters
These functions build the plot again, so they must be used before the plot
is edited with edit_plot, add_text,
insert_text, add_border or
add_grob. The plot stays a gtable at
every step, and can be combined with other plots, e.g. with
patchwork::wrap_elements.
forest( data, est, lower, upper, sizes = 0.4, ref_line = NULL, ci_column, is_summary = NULL, nudge_y = 0, fn_ci = makeci, fn_summary = make_summary, index_args = NULL, style = NULL, ... )forest( data, est, lower, upper, sizes = 0.4, ref_line = NULL, ci_column, is_summary = NULL, nudge_y = 0, fn_ci = makeci, fn_summary = make_summary, index_args = NULL, style = NULL, ... )
data |
Data to be displayed in the forest plot |
est |
Point estimation. Can be a list for multiple columns
and/or multiple groups. If the length of the list is larger than
then length of |
lower |
Lower bound of the confidence interval, same as |
upper |
Upper bound of the confidence interval, same as |
sizes |
Size of the point estimation box, can be a vector or a list.
The value is a multiple of one line of text, so |
ref_line |
X-axis coordinates of the reference line, the value of no
effect. If |
ci_column |
Column number of the data the CI will be displayed. |
is_summary |
A logical vector indicating if the value is a summary value,
which will have a diamond shape for the estimate. With multiple groups the
diamonds are stacked in the same cell and the summary rows are made taller to
fit them, so a larger |
nudge_y |
Vertical adjustment to nudge groups by, must be within 0 to 1.
Defaults to |
fn_ci |
Name of the function to draw confidence interval, default is
|
fn_summary |
Name of the function to draw summary confidence interval,
default is |
index_args |
A character vector, name of the arguments used for indexing
the row and column. This should be the name of the arguments that is working
the same way as |
style |
Style of the forest plot created with
|
... |
Other arguments passed on to the |
A forest plot object, a gtable of class
forestplot.
gtable tableGrob
forest_style set_xaxis set_labs
scale_sizes set_style make_boxplot
makeci make_summary
library(grid) # Read provided sample example data dt <- read.csv(system.file("extdata", "example_data.csv", package = "forestploter")) # Keep needed columns dt <- dt[,1:6] # indent the subgroup if there is a number in the placebo column dt$Subgroup <- ifelse(is.na(dt$Placebo), dt$Subgroup, paste0(" ", dt$Subgroup)) # NA to blank or NA will be transformed to carachter. dt$Treatment <- ifelse(is.na(dt$Treatment), "", dt$Treatment) dt$Placebo <- ifelse(is.na(dt$Placebo), "", dt$Placebo) dt$se <- (log(dt$hi) - log(dt$est))/1.96 # Add blank column for the forest plot to display CI. # Adjust the column width with space. dt$` ` <- paste(rep(" ", 20), collapse = " ") # Create confidence interval column to display dt$`HR (95% CI)` <- ifelse(is.na(dt$se), "", sprintf("%.2f (%.2f to %.2f)", dt$est, dt$low, dt$hi)) # Define a style st <- forest_style(base_size = 10, ref_line = gpar(col = "red"), footnote = gpar(col = "#636363", fontface = "italic")) # Draw the plot and add the axis and labels with a pipe p <- forest(dt[,c(1:3, 8:9)], est = dt$est, lower = dt$low, upper = dt$hi, sizes = dt$se, ci_column = 4, ref_line = 1, style = st) |> set_xaxis(xlim = c(0, 4), ticks_at = c(0.5, 1, 2, 3)) |> set_labs(arrow = c("Placebo Better", "Treatment Better"), footnote = "This is the demo data. Please feel free to change\nanything you want.") # Print plot plot(p)library(grid) # Read provided sample example data dt <- read.csv(system.file("extdata", "example_data.csv", package = "forestploter")) # Keep needed columns dt <- dt[,1:6] # indent the subgroup if there is a number in the placebo column dt$Subgroup <- ifelse(is.na(dt$Placebo), dt$Subgroup, paste0(" ", dt$Subgroup)) # NA to blank or NA will be transformed to carachter. dt$Treatment <- ifelse(is.na(dt$Treatment), "", dt$Treatment) dt$Placebo <- ifelse(is.na(dt$Placebo), "", dt$Placebo) dt$se <- (log(dt$hi) - log(dt$est))/1.96 # Add blank column for the forest plot to display CI. # Adjust the column width with space. dt$` ` <- paste(rep(" ", 20), collapse = " ") # Create confidence interval column to display dt$`HR (95% CI)` <- ifelse(is.na(dt$se), "", sprintf("%.2f (%.2f to %.2f)", dt$est, dt$low, dt$hi)) # Define a style st <- forest_style(base_size = 10, ref_line = gpar(col = "red"), footnote = gpar(col = "#636363", fontface = "italic")) # Draw the plot and add the axis and labels with a pipe p <- forest(dt[,c(1:3, 8:9)], est = dt$est, lower = dt$low, upper = dt$hi, sizes = dt$se, ci_column = 4, ref_line = 1, style = st) |> set_xaxis(xlim = c(0, 4), ticks_at = c(0.5, 1, 2, 3)) |> set_labs(arrow = c("Placebo Better", "Treatment Better"), footnote = "This is the demo data. Please feel free to change\nanything you want.") # Print plot plot(p)
Set the look of a forest plot. Each part of the plot takes a
gpar object, and only the settings given are changed,
everything else keeps its default. A style can be passed to the theme
argument of forest or applied to a plot with
set_style, so the same style can be reused for many plots.
To change some settings of a plot and keep the rest, give them to
set_style instead.
The text itself, such as the title or the legend labels, is set with
set_labs.
forest_style( base_size = 12, base_family = "", parse = NULL, ci = gpar(), ci_pch = 15, ci_t_height = NULL, summary = gpar(), ref_line = gpar(), vline = gpar(), xaxis = gpar(), xlab = gpar(), xlab_adjust = c("refline", "center"), title = gpar(), title_just = c("left", "right", "center"), footnote = gpar(), arrow = gpar(), arrow_type = c("open", "closed"), arrow_length = 0.05, arrow_label_just = c("start", "end"), legend = gpar(), legend_position = c("right", "top", "bottom", "none"), legend_ncol = 1, legend_byrow = TRUE, body = gpar(), header = gpar(), fit = c("none", "width", "both"), ... )forest_style( base_size = 12, base_family = "", parse = NULL, ci = gpar(), ci_pch = 15, ci_t_height = NULL, summary = gpar(), ref_line = gpar(), vline = gpar(), xaxis = gpar(), xlab = gpar(), xlab_adjust = c("refline", "center"), title = gpar(), title_just = c("left", "right", "center"), footnote = gpar(), arrow = gpar(), arrow_type = c("open", "closed"), arrow_length = 0.05, arrow_label_just = c("start", "end"), legend = gpar(), legend_position = c("right", "top", "bottom", "none"), legend_ncol = 1, legend_byrow = TRUE, body = gpar(), header = gpar(), fit = c("none", "width", "both"), ... )
base_size |
The size of text. |
base_family |
The font family, the font of the device by default. |
parse |
Whether text is read as plotmath expressions, see
|
ci |
Confidence intervals, |
ci_pch |
Shape of the point estimation, reused for each group if a single value is given. |
ci_t_height |
The height of the T end of the confidence intervals. No T end is drawn by default. |
summary |
Diamond shaped summary confidence intervals, |
ref_line |
Reference line, its position is set with
|
vline |
Vertical lines, their positions are set with |
xaxis |
X-axis line, tick marks and tick labels. |
xlab |
X-axis labels. |
xlab_adjust |
Align the x-axis labels to the reference line
|
title |
Title. |
title_just |
The justification of the title, |
footnote |
Footnote. |
arrow |
Arrows and their labels. |
arrow_type |
Type of the arrow head, |
arrow_length |
The length of the arrow head, a |
arrow_label_just |
Align the arrow labels to the starting point of the
arrows |
legend |
Legend text. |
legend_position |
Position of the legend, |
legend_ncol |
The number of columns of the legend, see
|
legend_byrow |
Whether the rows of the legend are filled first, see
|
body |
Text and background of the body of the table, a short form of
|
header |
Text and background of the header of the table, a short form
of |
fit |
How the plot uses the space it is drawn in, for example the size
given to |
... |
Settings passed on to the theme of the table, see
|
A forest_style object.
set_style forest set_labs
gpar tableGrob
library(grid) # Read provided sample example data dt <- read.csv(system.file("extdata", "example_data.csv", package = "forestploter")) dt <- dt[1:8, ] # NA to blank or NA will be transformed to character dt$Treatment <- ifelse(is.na(dt$Treatment), "", dt$Treatment) dt$Placebo <- ifelse(is.na(dt$Placebo), "", dt$Placebo) # Add blank columns for the forest plot to display CI. # Adjust the column width with space. dt$` ` <- paste(rep(" ", 20), collapse = " ") dt$` ` <- paste(rep(" ", 20), collapse = " ") # A style that can be reused for other plots st <- forest_style(base_size = 10, ref_line = gpar(col = "red"), vline = gpar(col = "grey60"), footnote = gpar(col = "#636363", fontface = "italic"), arrow_type = "closed", title_just = "center") # Add the axis and the text to the plot p <- forest(dt[, c(1:3, 19)], est = dt$est, lower = dt$low, upper = dt$hi, sizes = dt$est, ci_column = 4, ref_line = 1, style = st) |> set_xaxis(x_trans = "log", xlim = c(0.25, 4), ticks_at = c(0.5, 1, 2, 4), vline = c(0.5, 2)) |> set_labs(title = "Subgroup analysis", xlab = "Hazard ratio", arrow = c("Placebo Better", "Treatment Better"), footnote = "This is the demo data.") |> scale_sizes(method = "range", range = c(0.3, 0.8)) plot(p) # Change the style, let the CI column take the free width of the page and # remove the footnote p <- p |> set_style(base_size = 12, title = gpar(col = "blue"), fit = "width") |> set_labs(footnote = NULL) plot(p) # Grouped CIs in two columns, with a legend p <- forest(dt[, c(1, 19, 20)], est = list(dt$est_gp1, dt$est_gp2, dt$est_gp3, dt$est_gp4), lower = list(dt$low_gp1, dt$low_gp2, dt$low_gp3, dt$low_gp4), upper = list(dt$hi_gp1, dt$hi_gp2, dt$hi_gp3, dt$hi_gp4), ci_column = c(2, 3), ref_line = 1, nudge_y = 0.2, style = forest_style(ci = gpar(col = c("#377eb8", "#4daf4a")), legend_position = "bottom")) |> set_xaxis(x_trans = "log", xlim = list(c(0.1, 5), NA)) |> set_labs(xlab = c("CVD outcome", "COPD outcome"), legend_title = "Group", legend_labels = c("Trt 1", "Trt 2")) plot(p)library(grid) # Read provided sample example data dt <- read.csv(system.file("extdata", "example_data.csv", package = "forestploter")) dt <- dt[1:8, ] # NA to blank or NA will be transformed to character dt$Treatment <- ifelse(is.na(dt$Treatment), "", dt$Treatment) dt$Placebo <- ifelse(is.na(dt$Placebo), "", dt$Placebo) # Add blank columns for the forest plot to display CI. # Adjust the column width with space. dt$` ` <- paste(rep(" ", 20), collapse = " ") dt$` ` <- paste(rep(" ", 20), collapse = " ") # A style that can be reused for other plots st <- forest_style(base_size = 10, ref_line = gpar(col = "red"), vline = gpar(col = "grey60"), footnote = gpar(col = "#636363", fontface = "italic"), arrow_type = "closed", title_just = "center") # Add the axis and the text to the plot p <- forest(dt[, c(1:3, 19)], est = dt$est, lower = dt$low, upper = dt$hi, sizes = dt$est, ci_column = 4, ref_line = 1, style = st) |> set_xaxis(x_trans = "log", xlim = c(0.25, 4), ticks_at = c(0.5, 1, 2, 4), vline = c(0.5, 2)) |> set_labs(title = "Subgroup analysis", xlab = "Hazard ratio", arrow = c("Placebo Better", "Treatment Better"), footnote = "This is the demo data.") |> scale_sizes(method = "range", range = c(0.3, 0.8)) plot(p) # Change the style, let the CI column take the free width of the page and # remove the footnote p <- p |> set_style(base_size = 12, title = gpar(col = "blue"), fit = "width") |> set_labs(footnote = NULL) plot(p) # Grouped CIs in two columns, with a legend p <- forest(dt[, c(1, 19, 20)], est = list(dt$est_gp1, dt$est_gp2, dt$est_gp3, dt$est_gp4), lower = list(dt$low_gp1, dt$low_gp2, dt$low_gp3, dt$low_gp4), upper = list(dt$hi_gp1, dt$hi_gp2, dt$hi_gp3, dt$hi_gp4), ci_column = c(2, 3), ref_line = 1, nudge_y = 0.2, style = forest_style(ci = gpar(col = c("#377eb8", "#4daf4a")), legend_position = "bottom")) |> set_xaxis(x_trans = "log", xlim = list(c(0.1, 5), NA)) |> set_labs(xlab = c("CVD outcome", "COPD outcome"), legend_title = "Group", legend_labels = c("Trt 1", "Trt 2")) plot(p)
Default theme for the forest plot. Other parameters can also be passed and will be forwarded to the corresponding elements of the forest plot.
forest_theme is superseded by forest_style, see the
section below for how its arguments map onto the new functions.
ci_* Control the graphical parameters of confidence intervals
legend_* Control the graphical parameters of legend
xaxis_* Control the graphical parameters of x-axis
refline_* Control the graphical parameters of reference line
vertline_* Control the graphical parameters of vertical line
summary_* Control the graphical parameters of diamond shaped summary CI
footnote_* Control the graphical parameters of footnote
title_* Control the graphical parameters of title
arrow_* Control the graphical parameters of arrow
See gpar for more details.
forest_theme( base_size = 12, base_family = "", ci_pch = 15, ci_col = "black", ci_alpha = 1, ci_fill = NULL, ci_lty = 1, ci_lwd = 1, ci_Theight = NULL, legend_name = "Group", legend_position = "right", legend_value = "", legend_gp = gpar(), legend_ncol = 1, legend_byrow = TRUE, xaxis_gp = gpar(), refline_gp = gpar(), vertline_lwd = 1, vertline_lty = "dashed", vertline_col = "grey20", summary_col = "#4575b4", summary_fill = summary_col, footnote_gp = gpar(), footnote_parse = TRUE, title_just = c("left", "right", "center"), title_gp = gpar(), arrow_type = c("open", "closed"), arrow_label_just = c("start", "end"), arrow_length = 0.05, arrow_gp = gpar(), xlab_adjust = c("refline", "center"), xlab_gp = gpar(), ... )forest_theme( base_size = 12, base_family = "", ci_pch = 15, ci_col = "black", ci_alpha = 1, ci_fill = NULL, ci_lty = 1, ci_lwd = 1, ci_Theight = NULL, legend_name = "Group", legend_position = "right", legend_value = "", legend_gp = gpar(), legend_ncol = 1, legend_byrow = TRUE, xaxis_gp = gpar(), refline_gp = gpar(), vertline_lwd = 1, vertline_lty = "dashed", vertline_col = "grey20", summary_col = "#4575b4", summary_fill = summary_col, footnote_gp = gpar(), footnote_parse = TRUE, title_just = c("left", "right", "center"), title_gp = gpar(), arrow_type = c("open", "closed"), arrow_label_just = c("start", "end"), arrow_length = 0.05, arrow_gp = gpar(), xlab_adjust = c("refline", "center"), xlab_gp = gpar(), ... )
base_size |
The size of text |
base_family |
The font family |
ci_pch |
Shape of the point estimation. It will be reused if the forest plot is grouped. |
ci_col |
Color of the CI. A vector of colors should be provided for a grouped forest plot. An internal color set will be used if not provided. |
ci_alpha |
Scalar value, alpha channel for transparency of the point estimate. A small vertical line will be added to mark the location of the point estimate if this is not equal to 1. |
ci_fill |
Fill color of the point estimation. A vector of colors should
be provided for a grouped forest plot. If this is |
ci_lty |
Line type of the CI. A vector of line types should be provided for a grouped forest plot. |
ci_lwd |
Line width of the CI. A vector of line widths should be provided for a grouped forest plot. |
ci_Theight |
A unit specifying the height of the T end of the CI. If set
to |
legend_name |
Title of the legend. |
legend_position |
Position of the legend, |
legend_value |
Legend labels (expressions). A vector should be provided for a grouped forest plot. Defaults to "Group 1", "Group 2", ... if not provided. |
legend_gp |
|
legend_ncol |
integer; the number of columns, see |
legend_byrow |
logical indicating whether rows of the legend are filled first, see |
xaxis_gp |
|
refline_gp |
|
vertline_lwd |
Line width for extra vertical line. A vector can be provided for each vertical line, and the values will be recycled if not enough values are given. |
vertline_lty |
Line type for extra vertical line. Works same as |
vertline_col |
Line color for the extra vertical line. Works same as |
summary_col |
Color for borders of the summary diamond shape. |
summary_fill |
Color for filling the summary diamond shape. |
footnote_gp |
|
footnote_parse |
Parse footnote text (default). |
title_just |
The justification of the title, default is |
title_gp |
|
arrow_type |
Type of the arrow below x-axis, see |
arrow_label_just |
The justification of the arrow label relative to arrow. Control
the arrow label to align to the starting point of the arrow |
arrow_length |
The length of the arrow head, default is |
arrow_gp |
|
xlab_adjust |
Control the alignment of xlab to reference line (default) or center of the x-axis. |
xlab_gp |
|
... |
Other parameters passed to table. See |
A list.
forest_style takes one gpar for each part
of the plot, and the text of the legend is set with set_labs.
Themes created with forest_theme still work: give them to the
style argument of forest or to
set_style.
base_size, base_family, ci_pch,
xlab_adjust, title_just, arrow_type,
arrow_length, arrow_label_just, legend_position,
legend_ncol, legend_byrow: the same arguments of
forest_style.
ci_col, ci_fill, ci_lty, ci_lwd,
ci_alpha: forest_style(ci = gpar(col, fill, lty, lwd, alpha)).
ci_Theight: forest_style(ci_t_height).
summary_col, summary_fill:
forest_style(summary = gpar(col, fill)).
vertline_lwd, vertline_lty, vertline_col:
forest_style(vline = gpar(lwd, lty, col)).
refline_gp: forest_style(ref_line).
xaxis_gp, xlab_gp, title_gp,
footnote_gp, arrow_gp, legend_gp: the arguments of
forest_style without _gp, e.g.
forest_style(title = gpar(col = "red")).
footnote_parse: forest_style(parse), which also
applies to the title, x-axis labels, arrow labels and legend labels.
legend_name, legend_value: legend_title and
legend_labels of set_labs.
The fill of core and colhead, e.g.
core = list(bg_params = list(fill = "white")):
forest_style(body = gpar(fill = "white")) and
forest_style(header = gpar(fill = "white")).
Other table settings in ...: passed to ... of
forest_style in the same way.
tableGrob forest textGrob
gpar arrow segmentsGrob
linesGrob pointsGrob legendGrob
get_wh can be used to find the correct width and height of the
forestplot for saving, as the width and height are difficult to estimate
otherwise.
get_wh(plot, unit = c("in", "cm", "mm"))get_wh(plot, unit = c("in", "cm", "mm"))
plot |
A forest plot object. |
unit |
Unit for the returned width and height. One of |
This is the natural size of the plot, where every column and row fits its
content. By default a plot drawn in a larger space keeps this size and is
centred. With fit of forest_style the CI columns, and
the rows if asked for, take the space instead.
A named vector of width and height
## Not run: dt <- read.csv(system.file("extdata", "example_data.csv", package = "forestploter")) dt <- dt[1:6,1:6] dt$` ` <- paste(rep(" ", 20), collapse = " ") p <- forest(dt[,c(1:3, 7)], est = dt$est, lower = dt$low, upper = dt$hi, ci_column = 4) # get_wh example p_wh <- get_wh(p) pdf('test.pdf',width = p_wh[1], height = p_wh[2]) plot(p) dev.off() ## End(Not run)## Not run: dt <- read.csv(system.file("extdata", "example_data.csv", package = "forestploter")) dt <- dt[1:6,1:6] dt$` ` <- paste(rep(" ", 20), collapse = " ") p <- forest(dt[,c(1:3, 7)], est = dt$est, lower = dt$low, upper = dt$hi, ci_column = 4) # get_wh example p_wh <- get_wh(p) pdf('test.pdf',width = p_wh[1], height = p_wh[2]) plot(p) dev.off() ## End(Not run)
This function can be used to insert text into a forest plot. Remember to adjust for the row number if you have added text before, including the header. This is achieved by inserting new row(s) into the plot and will affect subsequent row numbers. A text vector can be inserted into multiple columns or rows.
insert_text( plot, text, row = NULL, col = NULL, part = c("body", "header"), just = c("center", "left", "right"), before = TRUE, gp = gpar(), padding = unit(1, "mm"), parse = FALSE )insert_text( plot, text, row = NULL, col = NULL, part = c("body", "header"), just = c("center", "left", "right"), before = TRUE, gp = gpar(), padding = unit(1, "mm"), parse = FALSE )
plot |
A forest plot object. |
text |
A character or expression vector, see |
row |
Row to insert the text, this will be ignored if the |
col |
A numeric value or vector indicating the columns the text will be added. The text will span over the column if a vector is given. |
part |
Part to insert text, |
just |
The justification of the text, |
before |
Indicating the text will be inserted before or after the row. |
gp |
An object of class |
padding |
Padding of the text, default is |
parse |
Logical, behaviour for parsing text as plotmath, see
|
A gtable object.
Create horizontal boxplot grob
make_boxplot( est, lower, upper, lowhinge, uphinge, hinge_height = 0.2, pch, sizes = 1, gp = gpar(), gp_box = gp, t_height = NULL, xlim = c(0, 1), nudge_y = 0 )make_boxplot( est, lower, upper, lowhinge, uphinge, hinge_height = 0.2, pch, sizes = 1, gp = gpar(), gp_box = gp, t_height = NULL, xlim = c(0, 1), nudge_y = 0 )
est |
Median value. |
lower |
Lower whisker. |
upper |
Upper whisker. |
lowhinge |
Lower hinge, a standard whisker will be drawn if this is missing. |
uphinge |
Upper hinge, a standard whisker will be drawn if this is missing. |
hinge_height |
Height of the hinge, default is 0.2. |
pch |
Numeric or character vector indicating what sort of plotting
symbol to use. See |
sizes |
Size of the point estimation box, can be a vector or a list.
The value is a multiple of one line of text, so |
gp |
Graphical parameters of |
gp_box |
Graphical parameters passed to the hinge, this will be
passed to |
t_height |
Height of the whisker end vertices. If value is |
xlim |
Limits for the x axis as a vector of length 2, i.e. c(low, high). |
nudge_y |
Horizontal adjustment to nudge groups by, must be within 0 to 1. |
A gTree object
pointsGrob gpar rectGrob
linesGrob segmentsGrob
library(grid) # Function to calculate Box plot values box_func <- function(x){ iqr <- IQR(x) q3 <- quantile(x, probs = c(0.25, 0.5, 0.75), names = FALSE) c("min" = q3[1] - 1.5*iqr, "q1" = q3[1], "med" = q3[2], "q3" = q3[3], "max" = q3[3] + 1.5*iqr) } # Prepare data val <- split(ToothGrowth$len, list(ToothGrowth$supp, ToothGrowth$dose)) val <- lapply(val, box_func) dat <- do.call(rbind, val) dat <- data.frame(Dose = row.names(dat), dat, row.names = NULL) dat$Box <- paste(rep(" ", 20), collapse = " ") # Draw single group box plot tm <- forest_theme(ci_Theight = 0.2) p <- forest(dat[,c(1, 7)], est = dat$med, lower = dat$min, upper = dat$max, # sizes = sizes, fn_ci = make_boxplot, ci_column = 2, lowhinge = dat$q1, uphinge = dat$q3, hinge_height = 0.2, index_args = c("lowhinge", "uphinge"), gp_box = gpar(fill = "black", alpha = 0.4), style = tm ) p # Multiple group # Prepare data dat_oj <- dat[c(1, 3, 5),] dat_vc <- dat[c(2, 4, 6), ] dat <- data.frame(Dose = c(0.5, 1, 2)) dat$Box <- paste(rep(" ", 20), collapse = " ") # Draw plot tm <- forest_theme(ci_Theight = 0.2, ci_pch = 3) p <- forest(dat, est = list(dat_oj$med, dat_vc$med), lower = list(dat_oj$min, dat_vc$min), upper = list(dat_oj$max, dat_vc$max), fn_ci = make_boxplot, ci_column = 2, lowhinge = list(dat_oj$q1, dat_vc$q1), uphinge = list(dat_oj$q3, dat_vc$q3), hinge_height = 0.2, index_args = c("lowhinge", "uphinge"), style = tm ) plibrary(grid) # Function to calculate Box plot values box_func <- function(x){ iqr <- IQR(x) q3 <- quantile(x, probs = c(0.25, 0.5, 0.75), names = FALSE) c("min" = q3[1] - 1.5*iqr, "q1" = q3[1], "med" = q3[2], "q3" = q3[3], "max" = q3[3] + 1.5*iqr) } # Prepare data val <- split(ToothGrowth$len, list(ToothGrowth$supp, ToothGrowth$dose)) val <- lapply(val, box_func) dat <- do.call(rbind, val) dat <- data.frame(Dose = row.names(dat), dat, row.names = NULL) dat$Box <- paste(rep(" ", 20), collapse = " ") # Draw single group box plot tm <- forest_theme(ci_Theight = 0.2) p <- forest(dat[,c(1, 7)], est = dat$med, lower = dat$min, upper = dat$max, # sizes = sizes, fn_ci = make_boxplot, ci_column = 2, lowhinge = dat$q1, uphinge = dat$q3, hinge_height = 0.2, index_args = c("lowhinge", "uphinge"), gp_box = gpar(fill = "black", alpha = 0.4), style = tm ) p # Multiple group # Prepare data dat_oj <- dat[c(1, 3, 5),] dat_vc <- dat[c(2, 4, 6), ] dat <- data.frame(Dose = c(0.5, 1, 2)) dat$Box <- paste(rep(" ", 20), collapse = " ") # Draw plot tm <- forest_theme(ci_Theight = 0.2, ci_pch = 3) p <- forest(dat, est = list(dat_oj$med, dat_vc$med), lower = list(dat_oj$min, dat_vc$min), upper = list(dat_oj$max, dat_vc$max), fn_ci = make_boxplot, ci_column = 2, lowhinge = list(dat_oj$q1, dat_vc$q1), uphinge = list(dat_oj$q3, dat_vc$q3), hinge_height = 0.2, index_args = c("lowhinge", "uphinge"), style = tm ) p
Create pooled summary diamond shape
make_summary(est, lower, upper, sizes = 1, gp, xlim, nudge_y = 0)make_summary(est, lower, upper, sizes = 1, gp, xlim, nudge_y = 0)
est |
Point estimation. Can be a list for multiple columns
and/or multiple groups. If the length of the list is larger than
then length of |
lower |
Lower bound of the confidence interval, same as |
upper |
Upper bound of the confidence interval, same as |
sizes |
Size of the point estimation box, can be a vector or a list.
The value is a multiple of one line of text, so |
gp |
Graphical parameters of |
xlim |
Limits for the x-axis as a vector of length 2, i.e.
|
nudge_y |
Vertical adjustment to nudge groups by, must be within 0 to 1.
Defaults to |
A gTree object
Create confidence interval grob
makeci( est, lower, upper, pch, sizes = 1, gp = gpar(), t_height = NULL, xlim = c(0, 1), nudge_y = 0, name = NULL )makeci( est, lower, upper, pch, sizes = 1, gp = gpar(), t_height = NULL, xlim = c(0, 1), nudge_y = 0, name = NULL )
est |
Point estimation. Can be a list for multiple columns
and/or multiple groups. If the length of the list is larger than
then length of |
lower |
Lower bound of the confidence interval, same as |
upper |
Upper bound of the confidence interval, same as |
pch |
Numeric or character vector indicating what sort of plotting
symbol to use. See |
sizes |
Size of the point estimation box, can be a vector or a list.
The value is a multiple of one line of text, so |
gp |
Graphical parameters of |
t_height |
The height of the confidence interval line end vertices.
If the value is |
xlim |
Limits for the x-axis as a vector of length 2, i.e.
|
nudge_y |
Vertical adjustment to nudge groups by, must be within 0 to 1.
Defaults to |
name |
Name of the grob. |
A gTree object
Show the settings of a style that are not the default ones.
## S3 method for class 'forest_style' print(x, ...)## S3 method for class 'forest_style' print(x, ...)
x |
A style created with |
... |
other arguments not used by this method |
Invisibly returns the style.
Print or draw forestplot.
## S3 method for class 'forestplot' print(x, autofit = FALSE, ...) ## S3 method for class 'forestplot' plot(x, autofit = FALSE, ...)## S3 method for class 'forestplot' print(x, autofit = FALSE, ...) ## S3 method for class 'forestplot' plot(x, autofit = FALSE, ...)
x |
forestplot to display |
autofit |
If true, the page is shared equally between the columns and
between the rows of the plot. This will be deprecated, use |
... |
other arguments not used by this method |
Invisibly returns the original forestplot.
Read the sizes given to forest as study weights and
turn them into point sizes. The square root of the weights is taken first,
so that the area of each point is proportional to its weight, before
mapping onto range.
scale_sizes(plot, method = c("range", "proportional"), range = c(0.2, 0.8))scale_sizes(plot, method = c("range", "proportional"), range = c(0.2, 0.8))
plot |
A forest plot object, see |
method |
|
range |
Numeric vector of length 2 giving the smallest and largest point size, as a multiple of one line of text. |
Weights are scaled jointly across all groups and CI columns so that the
areas stay comparable between them; scale by hand if per-column control is
wanted. Rows flagged by is_summary are held out of the scaling and
drawn at range[2], since a pooled total is not comparable with a
study weight. This follows meta, whose pooled rows carry no study
weight and end up the size of the largest study square, and metafor,
which sizes its summary polygon from efac rather than from the
weights.
Each call sets both the method and the range, and method = NULL
turns the scaling off, so that sizes are used as they are.
A forest plot object.
library(grid) # Read provided sample example data dt <- read.csv(system.file("extdata", "example_data.csv", package = "forestploter")) dt <- dt[1:6, ] # Add a blank column for the forest plot to display CI dt$` ` <- paste(rep(" ", 20), collapse = " ") # The weight of each study, here the inverse of the width of the CI weights <- 1/(dt$hi - dt$low) p <- forest(dt[, c("Subgroup", " ")], est = dt$est, lower = dt$low, upper = dt$hi, sizes = weights, # weights, not sizes ci_column = 2, ref_line = 1) # The area of each point is proportional to its weight plot(scale_sizes(p, method = "range", range = c(0.2, 0.8))) # `NULL` turns the scaling off, the values of `sizes` are then used as they are plot(scale_sizes(p, method = NULL))library(grid) # Read provided sample example data dt <- read.csv(system.file("extdata", "example_data.csv", package = "forestploter")) dt <- dt[1:6, ] # Add a blank column for the forest plot to display CI dt$` ` <- paste(rep(" ", 20), collapse = " ") # The weight of each study, here the inverse of the width of the CI weights <- 1/(dt$hi - dt$low) p <- forest(dt[, c("Subgroup", " ")], est = dt$est, lower = dt$low, upper = dt$hi, sizes = weights, # weights, not sizes ci_column = 2, ref_line = 1) # The area of each point is proportional to its weight plot(scale_sizes(p, method = "range", range = c(0.2, 0.8))) # `NULL` turns the scaling off, the values of `sizes` are then used as they are plot(scale_sizes(p, method = NULL))
Set the title, x-axis labels, footnote, arrow labels and legend text of a
forest plot. Their look, including the justification of the title, the
arrow type and the legend position, is set with forest_style.
set_labs(plot, title, xlab, footnote, arrow, legend_title, legend_labels)set_labs(plot, title, xlab, footnote, arrow, legend_title, legend_labels)
plot |
A forest plot object, see |
title |
The text for the title. |
xlab |
X-axis labels, put under the x-axis. A vector with one label for
each CI column gives different labels to the columns, |
footnote |
Footnote for the forest plot, aligned at the left bottom of the plot. Please adjust the line length with line breaks to avoid overlap with the arrows and/or x-axis. |
arrow |
Labels for the arrows under the x-axis, a vector of length two
(left and right). A list with one pair of labels for each CI column gives
different arrows to the columns, |
legend_title |
Title of the legend of a grouped forest plot, the default is "Group". |
legend_labels |
Legend labels, one for each group. Defaults to "Group 1", "Group 2", ... |
Arguments left out keep their current value, so the labels can be set in
several calls. NULL removes a label, or for the legend goes back to
the default text.
This builds the plot again, so it must be used before the plot is edited
with edit_plot, add_text,
insert_text, add_border or
add_grob.
A forest plot object.
library(grid) # Read provided sample example data dt <- read.csv(system.file("extdata", "example_data.csv", package = "forestploter")) dt <- dt[1:6, ] # Add a blank column for the forest plot to display CI dt$` ` <- paste(rep(" ", 20), collapse = " ") p <- forest(dt[, c("Subgroup", " ")], est = dt$est, lower = dt$low, upper = dt$hi, ci_column = 2, ref_line = 1) p <- set_labs(p, title = "Subgroup analysis", xlab = "Hazard ratio", arrow = c("Placebo Better", "Treatment Better"), footnote = "This is the demo data.") plot(p) # Labels left out are kept, `NULL` removes a label plot(set_labs(p, footnote = NULL))library(grid) # Read provided sample example data dt <- read.csv(system.file("extdata", "example_data.csv", package = "forestploter")) dt <- dt[1:6, ] # Add a blank column for the forest plot to display CI dt$` ` <- paste(rep(" ", 20), collapse = " ") p <- forest(dt[, c("Subgroup", " ")], est = dt$est, lower = dt$low, upper = dt$hi, ci_column = 2, ref_line = 1) p <- set_labs(p, title = "Subgroup analysis", xlab = "Hazard ratio", arrow = c("Placebo Better", "Treatment Better"), footnote = "This is the demo data.") plot(p) # Labels left out are kept, `NULL` removes a label plot(set_labs(p, footnote = NULL))
Change the look of a forest plot. The settings given in ... update
the current style of the plot: settings left out keep their current value,
a gpar is merged into the current one and NULL
goes back to the default. Like set_labs, this builds the plot
again, so it must be used before the plot is edited with
edit_plot and the other editing functions.
set_style(plot, style = NULL, ...)set_style(plot, style = NULL, ...)
plot |
A forest plot object, see |
style |
A style created with |
... |
Arguments of |
A forest plot object.
library(grid) # Read provided sample example data dt <- read.csv(system.file("extdata", "example_data.csv", package = "forestploter")) dt <- dt[1:6, ] # Add a blank column for the forest plot to display CI dt$` ` <- paste(rep(" ", 20), collapse = " ") p <- forest(dt[, c("Subgroup", " ")], est = dt$est, lower = dt$low, upper = dt$hi, ci_column = 2, ref_line = 1, style = forest_style(base_size = 10, ref_line = gpar(col = "red"))) # Settings left out are kept, so the reference line stays red p <- set_style(p, ci = gpar(col = "#4575b4"), title_just = "center") plot(set_labs(p, title = "Subgroup analysis")) # `NULL` goes back to the default, a style replaces the whole style plot(set_style(p, ref_line = NULL)) plot(set_style(p, forest_style(base_size = 8))) # Let the CI column take the width of the page it is drawn on plot(set_style(p, fit = "width"))library(grid) # Read provided sample example data dt <- read.csv(system.file("extdata", "example_data.csv", package = "forestploter")) dt <- dt[1:6, ] # Add a blank column for the forest plot to display CI dt$` ` <- paste(rep(" ", 20), collapse = " ") p <- forest(dt[, c("Subgroup", " ")], est = dt$est, lower = dt$low, upper = dt$hi, ci_column = 2, ref_line = 1, style = forest_style(base_size = 10, ref_line = gpar(col = "red"))) # Settings left out are kept, so the reference line stays red p <- set_style(p, ci = gpar(col = "#4575b4"), title_just = "center") plot(set_labs(p, title = "Subgroup analysis")) # `NULL` goes back to the default, a style replaces the whole style plot(set_style(p, ref_line = NULL)) plot(set_style(p, forest_style(base_size = 8))) # Let the CI column take the width of the page it is drawn on plot(set_style(p, fit = "width"))
Set the limits, tick marks and scale of the x-axis of the CI columns, and add vertical lines to them.
set_xaxis(plot, xlim, ticks_at, ticks_digits, ticks_minor, x_trans, vline)set_xaxis(plot, xlim, ticks_at, ticks_digits, ticks_minor, x_trans, vline)
plot |
A forest plot object, see |
xlim |
Limits for the x-axis as a vector of length 2, i.e.
|
ticks_at |
Tick mark positions. By default, ticks are computed
automatically: |
ticks_digits |
Number of digits for the tick labels. If an integer is
given, for example |
ticks_minor |
A numeric vector of positions to draw ticks without
labels. It can be a superset of |
x_trans |
Scale of the axis, one of |
vline |
Numeric vector, positions of vertical lines drawn in addition to
the reference line, on the original scale of the x-axis. Their look is set
with |
Arguments left out keep their current value, so the axis can be set in
several calls, and NULL goes back to the default. A single value
applies to all CI columns. To give the columns different settings, provide
a list with one element for each CI column (a vector for
ticks_digits and x_trans), where NA leaves a column at
its default.
This builds the plot again, so it must be used before the plot is edited
with edit_plot, add_text,
insert_text, add_border or
add_grob.
A forest plot object.
library(grid) # Read provided sample example data dt <- read.csv(system.file("extdata", "example_data.csv", package = "forestploter")) dt <- dt[1:6, ] # Add a blank column for the forest plot to display CI dt$` ` <- paste(rep(" ", 20), collapse = " ") p <- forest(dt[, c("Subgroup", " ")], est = dt$est, lower = dt$low, upper = dt$hi, ci_column = 2, ref_line = 1) # Limits and tick marks, with a vertical line at 2 p <- set_xaxis(p, xlim = c(0, 4), ticks_at = c(0.5, 1, 2, 3), vline = 2) plot(p) # The axis can be set in several calls, `NULL` goes back to the default p <- set_xaxis(p, ticks_digits = 1L) p <- set_xaxis(p, vline = NULL) # A log scale, where the reference line of `forest()` defaults to 1 plot(set_xaxis(p, x_trans = "log", xlim = c(0.25, 4), ticks_at = c(0.5, 1, 2, 4)))library(grid) # Read provided sample example data dt <- read.csv(system.file("extdata", "example_data.csv", package = "forestploter")) dt <- dt[1:6, ] # Add a blank column for the forest plot to display CI dt$` ` <- paste(rep(" ", 20), collapse = " ") p <- forest(dt[, c("Subgroup", " ")], est = dt$est, lower = dt$low, upper = dt$hi, ci_column = 2, ref_line = 1) # Limits and tick marks, with a vertical line at 2 p <- set_xaxis(p, xlim = c(0, 4), ticks_at = c(0.5, 1, 2, 3), vline = 2) plot(p) # The axis can be set in several calls, `NULL` goes back to the default p <- set_xaxis(p, ticks_digits = 1L) p <- set_xaxis(p, vline = NULL) # A log scale, where the reference line of `forest()` defaults to 1 plot(set_xaxis(p, x_trans = "log", xlim = c(0.25, 4), ticks_at = c(0.5, 1, 2, 4)))