Forest Plot

A forest plot displays effect sizes and confidence intervals from multiple studies in a meta-analysis. Each row shows a study label on the Y-axis, a horizontal CI whisker, and a filled square at the point estimate on the X-axis. A vertical dashed reference line marks the null effect.

Import path: kuva::plot::ForestPlot


Basic usage

Add one row per study with .with_row(label, estimate, ci_lower, ci_upper). Rows are rendered top-to-bottom in the order they are added.

#![allow(unused)]
fn main() {
use kuva::plot::ForestPlot;
use kuva::backend::svg::SvgBackend;
use kuva::render::render::render_multiple;
use kuva::render::layout::Layout;
use kuva::render::plots::Plot;

let forest = ForestPlot::new()
    .with_row("Smith 2019",    0.50,  0.10, 0.90)
    .with_row("Johnson 2020", -0.30, -0.80, 0.20)
    .with_row("Williams 2020", 0.20, -0.10, 0.50)
    .with_row("Overall",       0.28,  0.10, 0.46)
    .with_null_value(0.0);

let plots = vec![Plot::Forest(forest)];
let layout = Layout::auto_from_plots(&plots)
    .with_title("Meta-Analysis: Treatment Effect")
    .with_x_label("Effect Size (95% CI)");

let scene = render_multiple(plots, layout);
let svg = SvgBackend.render_scene(&scene);
std::fs::write("forest.svg", svg).unwrap();
}
Basic forest plot

Weighted markers

Use .with_weighted_row(label, estimate, ci_lower, ci_upper, weight) to scale marker radius by study weight. Radius scales as base_size * sqrt(weight / max_weight).

#![allow(unused)]
fn main() {
use kuva::plot::ForestPlot;
let forest = ForestPlot::new()
    .with_weighted_row("Smith 2019", 0.50, 0.10, 0.90, 5.2)
    .with_weighted_row("Johnson 2020", -0.30, -0.80, 0.20, 3.8)
    .with_marker_size(6.0);
}
Weighted forest plot

Builder reference

MethodDefaultDescription
.with_row(label, est, lo, hi)Add a study row
.with_weighted_row(label, est, lo, hi, w)Add a weighted study row
.with_color(css)"steelblue"Point and whisker color
.with_marker_size(px)6.0Base marker half-width
.with_whisker_width(px)1.5CI line stroke width
.with_null_value(f64)0.0Null-effect reference value
.with_show_null_line(bool)trueToggle the dashed null line
.with_cap_size(px)0.0Whisker end-cap half-height (0 = no caps)
.with_legend(label)Legend label

CLI

kuva forest data.tsv \
    --label-col study --estimate-col estimate \
    --ci-lower-col lower --ci-upper-col upper

kuva forest data.tsv \
    --label-col study --estimate-col estimate \
    --ci-lower-col lower --ci-upper-col upper \
    --weight-col weight --marker-size 6