| Title: | Kaplan-Meier Plot with 'ggplot2' | 
| Version: | 0.5.21 | 
| Date: | 2025-10-24 | 
| Description: | The function 'jskm()' creates publication quality Kaplan-Meier plot with at risk tables below. 'svyjskm()' provides plot for weighted Kaplan-Meier estimator. | 
| Depends: | R (≥ 3.4.0) | 
| License: | Apache License 2.0 | 
| Encoding: | UTF-8 | 
| Imports: | ggplot2 (≥ 3.5.0), ggpubr, survival, survey, scales, patchwork, cmprsk, stats, ggsci | 
| RoxygenNote: | 7.3.2 | 
| URL: | https://github.com/jinseob2kim/jskm, https://jinseob2kim.github.io/jskm/ | 
| BugReports: | https://github.com/jinseob2kim/jstable/issues | 
| Suggests: | testthat, knitr, rmarkdown | 
| VignetteBuilder: | knitr | 
| NeedsCompilation: | no | 
| Packaged: | 2025-10-24 09:14:10 UTC; js | 
| Author: | Jinseob Kim  | 
| Maintainer: | Jinseob Kim <jinseob2kim@gmail.com> | 
| Repository: | CRAN | 
| Date/Publication: | 2025-10-24 09:40:09 UTC | 
Adjusted Log-Rank Test
Description
Performs an adjusted log-rank test considering weights.
Usage
adjusted.LR(times, failures, variable, weights = NULL)
Arguments
times | 
 A numeric vector of survival times.  | 
failures | 
 A binary vector indicating event occurrence.  | 
variable | 
 A numeric binary variable (0 and 1) indicating group membership.  | 
weights | 
 A numeric vector of weights.  | 
Value
A list containing the test statistic and p-value.
Creates a Kaplan-Meier plot for survfit object.
Description
Creates a Kaplan-Meier plot with at risk tables below for survfit object.
Usage
jskm(
  sfit,
  table = FALSE,
  table.censor = FALSE,
  xlabs = "Time-to-event",
  ylabs = NULL,
  xlims = c(0, max(sfit$time)),
  ylims = c(0, 1),
  surv.scale = c("default", "percent"),
  ystratalabs = NULL,
  ystrataname = "Strata",
  timeby = signif(max(sfit$time)/7, 1),
  main = "",
  pval = FALSE,
  pval.size = 5,
  pval.coord = c(NULL, NULL),
  pval.testname = T,
  marks = TRUE,
  shape = 3,
  med = FALSE,
  legend = TRUE,
  legendposition = c(0.85, 0.8),
  ci = FALSE,
  subs = NULL,
  label.nrisk = "Numbers at risk",
  left.nrisk = FALSE,
  size.label.nrisk = 10,
  linecols = "Set1",
  dashed = FALSE,
  cumhaz = F,
  cluster.option = "None",
  cluster.var = NULL,
  data = NULL,
  cut.landmark = NULL,
  showpercent = F,
  status.cmprsk = NULL,
  linewidth = 0.75,
  theme = NULL,
  nejm.infigure.ratiow = 0.6,
  nejm.infigure.ratioh = 0.5,
  nejm.infigure.xlim = NULL,
  nejm.infigure.ylim = c(0, 1),
  surv.by = NULL,
  nejm.surv.by = NULL,
  hr = FALSE,
  hr.size = 5,
  hr.coord = c(NULL, NULL),
  hr.testname = F,
  ...
)
Arguments
sfit | 
 a survfit object  | 
table | 
 logical: Create a table graphic below the K-M plot, indicating at-risk numbers?  | 
table.censor | 
 logical: Add numbers of censored in table graphic  | 
xlabs | 
 x-axis label  | 
ylabs | 
 y-axis label  | 
xlims | 
 numeric: list of min and max for x-axis. Default = c(0,max(sfit$time))  | 
ylims | 
 numeric: list of min and max for y-axis. Default = c(0,1)  | 
surv.scale | 
 scale transformation of survival curves. Allowed values are "default" or "percent".  | 
ystratalabs | 
 character list. A list of names for each strata. Default = names(sfit$strata)  | 
ystrataname | 
 The legend name. Default = "Strata"  | 
timeby | 
 numeric: control the granularity along the time-axis; defaults to 7 time-points. Default = signif(max(sfit$time)/7, 1)  | 
main | 
 plot title  | 
pval | 
 logical: add the pvalue to the plot?  | 
pval.size | 
 numeric value specifying the p-value text size. Default is 5.  | 
pval.coord | 
 numeric vector, of length 2, specifying the x and y coordinates of the p-value. Default values are NULL  | 
pval.testname | 
 logical: add '(Log-rank)' text to p-value. Default = F  | 
marks | 
 logical: should censoring marks be added?  | 
shape | 
 what shape should the censoring marks be, default is a vertical line  | 
med | 
 should a median line be added to the plot? Default = F  | 
legend | 
 logical. should a legend be added to the plot?  | 
legendposition | 
 numeric. x, y position of the legend if plotted. Default=c(0.85,0.8)  | 
ci | 
 logical. Should confidence intervals be plotted. Default = FALSE  | 
subs | 
 = NULL,  | 
label.nrisk | 
 Numbers at risk label. Default = "Numbers at risk"  | 
left.nrisk | 
 Should risk label be at top left? Default = "False"  | 
size.label.nrisk | 
 Font size of label.nrisk. Default = 10  | 
linecols | 
 Character or Character vector. Colour imported from ggsci. Default ="Set1", "black" for black with dashed line, character vector for the customization of line colors.  | 
dashed | 
 logical. Should a variety of linetypes be used to identify lines. Default = FALSE  | 
cumhaz | 
 Show cumulative incidence function, Default: F  | 
cluster.option | 
 Cluster option for p value, Option: "None", "cluster", "frailty", Default: "None"  | 
cluster.var | 
 Cluster variable  | 
data | 
 select specific data - for reactive input, Default = NULL  | 
cut.landmark | 
 cut-off for landmark analysis, Default = NULL  | 
showpercent | 
 Shows the percentages on the right side.  | 
status.cmprsk | 
 Status value when competing risk analysis, Default = 2nd level of status variable  | 
linewidth | 
 Line witdh, Default = 0.75  | 
theme | 
 Theme of the plot, Default = NULL, "nejm" for NEJMOA style, "jama" for JAMA style  | 
nejm.infigure.ratiow | 
 Ratio of infigure width to total width, Default = 0.6  | 
nejm.infigure.ratioh | 
 Ratio of infigure height to total height, Default = 0.5  | 
nejm.infigure.xlim | 
 x-axis limit of infigure, Default = NULL  | 
nejm.infigure.ylim | 
 y-axis limit of infigure, Default = c(0,1)  | 
surv.by | 
 breaks unit in y-axis, default = NULL(ggplot default)  | 
nejm.surv.by | 
 breaks unit in y-axis in nejm figure, default = NULL(ggplot default)  | 
hr | 
 logical: add the hazard ratio to the plot?  | 
hr.size | 
 numeric value specifying the HR text size. Default is 5.  | 
hr.coord | 
 numeric vector, of length 2, specifying the x and y coordinates of the p-value. Default values are NULL  | 
hr.testname | 
 logical: add '(Log-rank)' text to p-value. Default = F  | 
... | 
 PARAM_DESCRIPTION  | 
Details
DETAILS
Value
Plot
Author(s)
Jinseob Kim, but heavily modified version of a script created by Michael Way. https://github.com/michaelway/ggkm/ I have packaged this function, added functions to namespace and included a range of new parameters.
Examples
library(survival)
data(colon)
fit <- survfit(Surv(time, status) ~ rx, data = colon)
jskm(fit, timeby = 500)
Creates a Weighted Kaplan-Meier plot - svykm.object in survey package
Description
Creates a Weighted Kaplan-Meier plot - svykm.object in survey package
Usage
svyjskm(
  sfit,
  theme = NULL,
  xlabs = "Time-to-event",
  ylabs = "Survival probability",
  xlims = NULL,
  ylims = c(0, 1),
  ystratalabs = NULL,
  ystrataname = NULL,
  surv.scale = c("default", "percent"),
  timeby = NULL,
  main = "",
  pval = FALSE,
  pval.size = 4,
  pval.coord = c(NULL, NULL),
  pval.testname = F,
  marks = FALSE,
  hr = FALSE,
  hr.size = 2,
  hr.coord = c(NULL, NULL),
  med = FALSE,
  legend = TRUE,
  legendposition = c(0.85, 0.8),
  ci = NULL,
  linecols = "Set1",
  dashed = FALSE,
  cumhaz = F,
  design = NULL,
  subs = NULL,
  table = F,
  table.censor = F,
  label.nrisk = "Numbers at risk",
  left.nrisk = FALSE,
  size.label.nrisk = 10,
  cut.landmark = NULL,
  showpercent = F,
  linewidth = 0.75,
  nejm.infigure.ratiow = 0.6,
  nejm.infigure.ratioh = 0.5,
  nejm.infigure.xlim = NULL,
  nejm.infigure.ylim = c(0, 1),
  surv.by = NULL,
  nejm.surv.by = NULL,
  ...
)
Arguments
sfit | 
 a svykm object  | 
theme | 
 Theme of the plot, Default = NULL, "nejm" for NEJMOA style, "jama" for JAMA style  | 
xlabs | 
 x-axis label, Default: 'Time-to-event'  | 
ylabs | 
 y-axis label.  | 
xlims | 
 numeric: list of min and max for x-axis. Default: NULL  | 
ylims | 
 numeric: list of min and max for y-axis. Default: c(0, 1)  | 
ystratalabs | 
 character list. A list of names for each strata. Default: NULL  | 
ystrataname | 
 The legend name. Default: 'Strata'  | 
surv.scale | 
 scale transformation of survival curves. Allowed values are "default" or "percent".  | 
timeby | 
 numeric: control the granularity along the time-axis; defaults to 7 time-points.  | 
main | 
 plot title, Default: ”  | 
pval | 
 logical: add the pvalue to the plot?, Default: FALSE  | 
pval.size | 
 numeric value specifying the p-value text size. Default is 4.  | 
pval.coord | 
 numeric vector, of length 2, specifying the x and y coordinates of the p-value. Default values are NULL  | 
pval.testname | 
 logical: add '(Log-rank)' text to p-value. Default = F  | 
marks | 
 logical: should censoring marks be added?  | 
hr | 
 logical: add the Hazard Ratio to the plot?, Default: FALSE  | 
hr.size | 
 numeric value specifying the Hazard Ratio text size. Default is 2.  | 
hr.coord | 
 numeric vector, of length 2, specifying the x and y coordinates of the Hazard Ratio. Default values are NULL  | 
med | 
 should a median line be added to the plot? Default = F  | 
legend | 
 logical. should a legend be added to the plot?  | 
legendposition | 
 numeric. x, y position of the legend if plotted. Default=c(0.85,0.8)  | 
ci | 
 logical. Should confidence intervals be plotted. Default = NULL  | 
linecols | 
 Character or Character vector. Colour imported from ggsci to colour lines. Default ="Set1", "black" for black with dashed line, character vector for the customization of line colors.  | 
dashed | 
 logical. Should a variety of linetypes be used to identify lines. Default: FALSE  | 
cumhaz | 
 Show cumulaive incidence function, Default: F  | 
design | 
 Data design for reactive design data , Default: NULL  | 
subs | 
 = NULL,  | 
table | 
 logical: Create a table graphic below the K-M plot, indicating at-risk numbers?  | 
table.censor | 
 logical: Add numbers of censored in table graphic  | 
label.nrisk | 
 Numbers at risk label. Default = "Numbers at risk"  | 
left.nrisk | 
 Should risk label be at top left? Default = "False"  | 
size.label.nrisk | 
 Font size of label.nrisk. Default = 10  | 
cut.landmark | 
 cut-off for landmark analysis, Default = NULL  | 
showpercent | 
 Shows the percentages on the right side.  | 
linewidth | 
 Line witdh, Default = 0.75  | 
nejm.infigure.ratiow | 
 Ratio of infigure width to total width, Default = 0.6  | 
nejm.infigure.ratioh | 
 Ratio of infigure height to total height, Default = 0.5  | 
nejm.infigure.xlim | 
 x-axis limit of infigure, Default = NULL  | 
nejm.infigure.ylim | 
 y-axis limit of infigure, Default = c(0,1)  | 
surv.by | 
 breaks unit in y-axis, default = NULL(ggplot default)  | 
nejm.surv.by | 
 breaks unit in y-axis in nejm figure, default = NULL(ggplot default)  | 
... | 
 PARAM_DESCRIPTION  | 
Details
DETAILS
Value
plot
Examples
library(survey)
data(pbc, package = "survival")
pbc$randomized <- with(pbc, !is.na(trt) & trt > 0)
biasmodel <- glm(randomized ~ age * edema, data = pbc)
pbc$randprob <- fitted(biasmodel)
dpbc <- svydesign(id = ~1, prob = ~randprob, strata = ~edema, data = subset(pbc, randomized))
s1 <- svykm(Surv(time, status > 0) ~ sex, design = dpbc)
svyjskm(s1)