| 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)