Figura

Guided analysis

Cox proportional-hazards regression

Map time, status and covariates, and get the Table 3 a manuscript needs: unadjusted hazard ratios beside adjusted ones from the joint model, a forest plot of the adjusted estimates, and a proportional-hazards check reported without blocking the fit.

Adjust for what else is going on

Kaplan–Meier shows whether survival curves differ. Cox regression answers the next question: by how much, after accounting for the other things that differ between patients? Each covariate gets a hazard ratio — the relative event rate per unit (for a number) or versus a reference level (for a category).

Unadjusted hazard ratios come from one model per covariate. Adjusted hazard ratios come from a single joint model, so each is the effect of that variable holding the others fixed — the difference between the two columns is the confounding the adjustment removed.

Is Cox appropriate?

Use it when each row is one independent participant with a follow-up time, an event or censoring status, and the baseline covariates you want to adjust for. The model assumes proportional hazards: the hazard ratio for each covariate is roughly constant over follow-up.

This tool checks that assumption with scaled Schoenfeld residuals and warns when it looks violated, but it does not fit stratified, time-varying, or competing-risks models. If curves cross or the check flags a covariate, seek statistical review before interpreting the hazard ratios.

How to read the result

  • HR < 1: lower event rate (protective). HR > 1: higher.
  • A numeric covariate's HR is per one unit — scale the variable first if one unit is too small to be meaningful.
  • A category's HR is versus its reference level, shown as "1 (reference)".
  • A 95% CI that crosses 1 means the effect is not statistically resolved.

With fewer than about 10 events per model term, adjusted estimates become unstable — the tool warns you when that happens.

Example output

CharacteristicUnadjusted HR (95% CI)Adjusted HR (95% CI)
arm (reference: Standard care)
New treatment0.78 (0.57–1.06, p=0.115)0.58 (0.41–0.80, p=0.001)
age (per 1 unit)1.05 (1.03–1.06, p<0.001)1.06 (1.04–1.08, p<0.001)
stage (reference: I)
II1.58 (1.08–2.32, p=0.018)1.46 (1.00–2.14, p=0.052)
III2.08 (1.41–3.06, p<0.001)2.44 (1.65–3.60, p<0.001)
stage: III stage: II age (per 1 unit) arm: New treatment 0.5 1.0 3.0 Adjusted hazard ratio (log scale)
Synthetic demonstration data: the table Figura renders for the example dataset.

The text Figura produced for this example, ready to paste into a methods section:

Characteristic	Unadjusted HR (95% CI, p)	Adjusted HR (95% CI, p)
arm (reference: Standard care)		
New treatment	0.78 (0.57–1.06, p=0.115)	0.58 (0.41–0.80, p=0.001)
age (per 1 unit)	1.05 (1.03–1.06, p<0.001)	1.06 (1.04–1.08, p<0.001)
stage (reference: I)		
II	1.58 (1.08–2.32, p=0.018)	1.46 (1.00–2.14, p=0.052)
III	2.08 (1.41–3.06, p<0.001)	2.44 (1.65–3.60, p<0.001)

Multivariable Cox proportional-hazards regression (n = 220, 157 events) adjusted for arm, age, stage. Unadjusted hazard ratios are from single-covariate models; adjusted hazard ratios are from the joint model. The proportional-hazards assumption was assessed with scaled Schoenfeld residuals (global p=0.509).

Analyses were performed with Figura (Saha, 2026; https://figurastats.org), which runs R with the survival and ggplot2 packages in the browser.

Sample data

Download sample.csv — 220 rows, columns arm, age, stage, followup_months, status. A frozen synthetic dataset generated by a script in the repository's data-raw/ folder; nothing in it is a real patient.

How to cite

Journals ask for a software statement. The methods text Figura generates already ends with one; this is the same attribution in reference form.

Saha S. Figura: clinical manuscript figures and statistics in the browser. 2026. https://figurastats.org
@misc{figura2026,
  author = {Saha, Sandeep},
  title  = {Figura: clinical manuscript figures and statistics in the browser},
  year   = {2026},
  url    = {https://figurastats.org},
  note   = {Accessed <date>}
}