lifelines.plotting.add_at_risk_counts(*fitters, **kwargs)

Add counts showing how many individuals were at risk at each time point in survival/hazard plots.

Parameters:fitters – One or several fitters, for example KaplanMeierFitter, NelsonAalenFitter, etc…
Returns:The axes which was used.
Return type:ax


# First train some fitters and plot them
fig = plt.figure()
ax = plt.subplot(111)

f1 = KaplanMeierFitter()

f2 = KaplanMeierFitter()

# There are equivalent
add_at_risk_counts(f1, f2)
add_at_risk_counts(f1, f2, ax=ax, fig=fig)

# This overrides the labels
add_at_risk_counts(f1, f2, labels=['fitter one', 'fitter two'])

# This hides the labels
add_at_risk_counts(f1, f2, labels=None)
lifelines.plotting.plot_lifetimes(durations, event_observed=None, entry=None, left_truncated=False, sort_by_duration=True, event_observed_color='#A60628', event_censored_color='#348ABD', ax=None, **kwargs)

Returns a lifetime plot, see examples:

  • durations ((n,) numpy array or pd.Series) – duration subject was observed for.
  • event_observed ((n,) numpy array or pd.Series) – array of booleans: True if event observed, else False.
  • entry ((n,) numpy array or pd.Series) – offsetting the births away from t=0. This could be from left-truncation, or delayed entry into study.
  • left_truncated (boolean) – if entry is provided, and the data is left-truncated, this will display additional information in the plot to reflect this.
  • sort_by_duration (boolean) – sort by the duration vector
  • event_observed_color (str) – default: “#A60628”
  • event_censored_color (str) – default: “#348ABD”

Return type:



from lifelines.datasets import load_waltons
from lifelines.plotting import plot_lifetimes
T, E = load_waltons()["T"], load_waltons()["E"]
ax = plot_lifetimes(T.loc[:50], event_observed=E.loc[:50])
lifelines.plotting.qq_plot(model, ax=None, **plot_kwargs)

Produces a quantile-quantile plot of the empirical CDF against the fitted parametric CDF. Large deviances away from the line y=x can invalidate a model (though we expect some natural deviance in the tails).

  • model (obj) – A fitted lifelines univariate parametric model, like WeibullFitter
  • plot_kwargs – kwargs for the plot.

The axes which was used.

Return type:



from lifelines import *
from lifelines.plotting import qq_plot
from lifelines.datasets import load_rossi
df = load_rossi()
wf = WeibullFitter().fit(df['week'], df['arrest'])
lifelines.plotting.cdf_plot(model, timeline=None, ax=None, **plot_kwargs)
lifelines.plotting.rmst_plot(model, model2=None, t=inf, ax=None, text_position=None, **plot_kwargs)

This functions plots the survival function of the model plus it’s area-under-the-curve (AUC) up until the point t. The AUC is known as the restricted mean survival time (RMST).

To compare the difference between two models’ survival curves, you can supply an additional model in model2.

  • model (lifelines.UnivariateFitter)
  • model2 (lifelines.UnivariateFitter, optional) – used to compute the delta RMST of two models
  • t (float) – the upper bound of the expectation
  • ax (axis)
  • text_position (tuple) – move the text position of the RMST.


from lifelines.utils import restricted_mean_survival_time
from lifelines.datasets import load_waltons
from lifelines.plotting import rmst_plot

df = load_waltons()
ix = df['group'] == 'miR-137'
T, E = df['T'], df['E']
time_limit = 50

kmf_exp = KaplanMeierFitter().fit(T[ix], E[ix], label='exp')
kmf_con = KaplanMeierFitter().fit(T[~ix], E[~ix], label='control')

ax = plt.subplot(311)
rmst_plot(kmf_exp, t=time_limit, ax=ax)

ax = plt.subplot(312)
rmst_plot(kmf_con, t=time_limit, ax=ax)

ax = plt.subplot(313)
rmst_plot(kmf_exp, model2=kmf_con, t=time_limit, ax=ax)
lifelines.plotting.loglogs_plot(cls, loc=None, iloc=None, show_censors=False, censor_styles=None, ax=None, **kwargs)

Specifies a plot of the log(-log(SV)) versus log(time) where SV is the estimated survival function.