ggsurvplot modifizieren

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

ruppy
Beiträge: 41
Registriert: Mo Nov 04, 2019 10:05 pm

ggsurvplot modifizieren

Beitrag von ruppy »

Hallo,

ich möchte einen ggsurvplot modifizieren hinsichtlich dessen Schriftart sowie der Schriftgröße der Legende.

Die Funktion "ggsurvplot" ist in dem Paket "survminer" enthalten.
Mit dem Paket lassen sich etwas schönere Kaplan-Meier-Kurven erstellen (Stichwort: Drawing Survival Curves using 'ggplot2')

Die Daten für den ggsurvplot entnehme ich als Stichprobe dem Datensatz "lung", der wiederrum in dem Paket "survival" enthalten ist.

Hier mal ein bisschen Code:

Code: Alles auswählen

library(survival)
library(survminer)
library(tidyverse)

# Für Reproduzierbarkeit der Ergebnisse

set.seed(309546)

# Aus Datensatz "lung" wird Stichprobe mit n= 25 gezogen
# Nur die Variablen "time", "status" und "sex" sind von Interesse

exp <- sample_n(lung, size = 25, replace = F) %>%
  select(time, status, sex)

# Survival Object erstellen

exp$survival <- Surv(exp$time, exp$status == 2)

# Kaplan-Meier-Schätzer je Geschlecht
exp_fit_sex <- survfit(survival ~ sex, data = exp)

# Plot

ggsurvplot(exp_fit_sex,
           data = exp,
           censor.shape = "I",
           xlab = "Tage",
           ylab = "Überlebenswahrscheinlichkeit",
           surv.scale ="percent",
           legend.title = "rechts zensierte Beobachtungen",
           legend.lab = c("Männer", "Frauen"),
           legend = "bottom")
Wie ihr dem Bild entnehmen könnt ist die Schriftgröße der Legende recht klein.
Auch ist die Legende inhaltlich nicht ganz optimal, da nur die rechtszensierten Beobachtungen ausgewiesen werden, aber nicht die Kurven selbst, was aber zu vernachlässigen ist.

Meine Fragen sind:
- Wie kann ich die Schriftart ändern, bspw. zu Arial?
- Wie kann ich die Schriftgröße der Legende anpassen?

BTW: Falls jemand genauere Hintergründe zu dem Datensatz "lung" kennen sollte:
- Gehe ich richtig in der Annahme, dass die "Startzeitpunkte" für die Patienten unterschiedlich sind?
- Die Zensierungen ausschließlich rechtszensiert sind?

PS: sehe gerade, dass in dem Code "rechts zensierte Beobachtungen", statt "rechtszensierte Beobachtungen" steht. Tut aber nichts zur Sache.

Wäre super, wenn mir jemand weiterhelfen könnte.

BG ruppy
Dateianhänge
KM mit zwei Gruppen.png
KM mit zwei Gruppen.png (6.26 KiB) 886 mal betrachtet
ruppy
Beiträge: 41
Registriert: Mo Nov 04, 2019 10:05 pm

Re: ggsurvplot modifizieren

Beitrag von ruppy »

Hat niemand eine Idee?
bigben
Beiträge: 2777
Registriert: Mi Okt 12, 2016 9:09 am

Re: ggsurvplot modifizieren

Beitrag von bigben »

Hallo ruppy,

ich bin sicher kein ggplot2-Profi. Die Suchergebnisse sehen ganz einfach aus:

https://www.datanovia.com/en/blog/ggplo ... gend-title
https://www.datanovia.com/en/blog/ggplo ... r-and-face

Hilft das?

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
ruppy
Beiträge: 41
Registriert: Mo Nov 04, 2019 10:05 pm

Re: ggsurvplot modifizieren

Beitrag von ruppy »

Hi bigben,

danke für die Links.
Sehen gut aus.

Dort wird

Code: Alles auswählen

+ theme()
genutzt. Meine mich zu erinnern genau das probiert zu haben.

Ich werde es mal weiter probieren und berichten, ob und wie ich es hinbekommen habe.

Vielen Dank nochmal bigben

BG ruppy
ruppy
Beiträge: 41
Registriert: Mo Nov 04, 2019 10:05 pm

Re: ggsurvplot modifizieren

Beitrag von ruppy »

Nachdem ich auch auf SO nach Hilfe gesucht habe, habe ich jetzt zumindest eine einigermaßen zufriedenstellende Lösung.

Ich habe dem Code für den Plot lediglich

Code: Alles auswählen

 ggtheme = theme_pubr()
hinzugefügt. Dadurch ist die Schriftgröße der Legende akzeptabel.

Auf die Anpassung der Schriftart verzichte ich erstmal.

ABER: eine andere Frage hätte ich trotzdem.

Hier erstmal Code, um sie nachzuvollziehen:

Code: Alles auswählen

suppressPackageStartupMessages(library(survival))
suppressPackageStartupMessages(library(survminer))
suppressPackageStartupMessages(library(tidyverse))

# Weiteres Beispiel nun mit 2 Überlebensverteilungen
# Für Reproduzierbarkeit der Ergebnisse

set.seed(22)

# Aus Datensatz "lung" wird erneut Stichprobe gezogen
# Nun mit n= 25
# Zusätzlich ist die Variable "sex" von Interesse

exp_1 <- sample_n(lung, size = 25, replace = F) %>%
  select(time, status, sex)

# Survival Object erstellen

exp_1$survival <- Surv(exp_1$time, exp_1$status == 2)

# Kaplan-Meier-Schätzer je Geschlecht

exp_1_fit <- survfit(survival ~ sex, data = exp_1, conf.type = "log-log")

# Plot

ggsurvplot(exp_1_fit,
           data = exp_1,
           censor.shape = "I",
           xlab = "Tage",
           ylab = "Überlebenswahrscheinlichkeit",
           conf.int = T,
           surv.scale ="percent",
           legend.title = "zensierte Beobachtungen",
           legend.lab = c("Männer", "Frauen"),
           legend = "bottom",
           ggtheme = theme_pubr())

Wie ihr sehen könnt werden dem Plot Konfidenzintervalle hinzugefügt.
Sind die Konfidenzintervalle vom selben Typ wie ich sie in dem Aufruf:

Code: Alles auswählen

exp_1_fit <- survfit(survival ~ sex, data = exp_1, conf.type = "log-log")
spezifiziert habe?

Weiß das jemand?
Meine Vermutung ist ja und dass das dann auch bei anderen Methoden so von R gehandhabt wird.
Aber nunja wissen ist besser als glauben. Daher die Frage.

PS: Habe die selbe Frage auf SO gepostet. Hoffe das ist kein Weltuntergang.
Wenn ich da eine Lösung erhalte, werde ich euch natürlich davon wissen lassen.

BG ruppy
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: ggsurvplot modifizieren

Beitrag von jogo »

Hallo ruppy,
ruppy hat geschrieben: Fr Feb 07, 2020 12:20 pm PS: Habe die selbe Frage auf SO gepostet. Hoffe das ist kein Weltuntergang.
Wenn ich da eine Lösung erhalte, werde ich euch natürlich davon wissen lassen.
nein, das ist nicht weiter wild. Aber besser ist es dann noch, den Link zu nennen:
https://stackoverflow.com/questions/601 ... -intervals
So kann jetzt auch jeder Hilfswillige hier im Forum sehen, wie weit die Diskussion auf SO gediehen ist.

Leider kann ich inhaltlich nichts zur Beantwortung Deiner Frage beitragen - die Grafikwühlerei gehört nicht zu meinen Stärken.

Gruß, Jörg
ruppy
Beiträge: 41
Registriert: Mo Nov 04, 2019 10:05 pm

Re: ggsurvplot modifizieren

Beitrag von ruppy »

Hi Jörg,

danke für deine Rückmeldung.

Hast Recht, den Link hätte ich posten können.

Werde ich nächstes Mal gleich machen ;)

BG ruppy
bigben
Beiträge: 2777
Registriert: Mi Okt 12, 2016 9:09 am

Re: ggsurvplot modifizieren

Beitrag von bigben »

Hallo ruppy,

ich bin nicht mal sicher, ob ich die Frage richtig verstehe, von welchem "Typ" Konfidenzintervalle sind. Weil ich es jetzt aber bei Dir schon wiederholt gesehen habe, darf ich vielleicht eine Anmerkung off topic machen.

Wenn Du jemals in Deinem Code

Code: Alles auswählen

T <- 1
geschrieben hast oder vielleicht jemals schreiben wirst oder

Code: Alles auswählen

F <- df(.5, 20, 20)
irgendwann in Deinem Code vorkommen könnte, dann ist es klüger, T und F nicht als Abkürzungen für TRUE und FALSE zu verwenden. Letzteres funktioniert dann nämlich nicht mehr und es kann zu schwer auffindbaren Fehlern kommen.

Code: Alles auswählen

> F == FALSE
[1] TRUE
> F <- df(.5, 20, 20)
> F == FALSE
[1] FALSE
Nur so als Tipp in Ermangelung einer brauchbaren Antwort auf Deine Frage.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
ruppy
Beiträge: 41
Registriert: Mo Nov 04, 2019 10:05 pm

Re: ggsurvplot modifizieren

Beitrag von ruppy »

Hi bigben,

witzig, dass du das schreibst.
Bin seit einer Weile hier stiller Mitleser und ahnte schon, dass du mich darauf hinweisen wirst :D
Beim nächsten Post werde ich attach() benutzen :D

Spaß beiseite, kenne die Gefahr und achte darauf.

Zu der Frage bzgl. den Konfidenzintervallen.

Das Argument

Code: Alles auswählen

conf.type
der Funktion

Code: Alles auswählen

survfit
kann spezifiziert werden mit

Code: Alles auswählen

c("none", "plain","log", "log-log")
Wenn ich es richtig verstehe werden die Konfidenzintervalle je nachdem welches Argument man nimmt unterschiedlich berechnet (bei "none", werden eben keine berechnet aber ansonsten eben schon).

Die Literatur, die ich heranziehe empfiehlt den Typ "log-log".

Meine Frage ist nun einfach, ob der Plot auch eben diese nutzt und nicht doch eine andere der obigen Möglichkeiten.

Ich nehme an, dass die selben genutzt werden, da ich dem Plot ja ein Objekt zuweise, dass eben diese log-log-Konfidenzintervalle aufweist. Bin mir aber nicht sicher.

Daher die Frage.

BG ruppy
bigben
Beiträge: 2777
Registriert: Mi Okt 12, 2016 9:09 am

Re: ggsurvplot modifizieren

Beitrag von bigben »

Danke für die Erläuterung und ja, manche Dinge schreibt man im Forum immer wieder ;-) Das macht sie nicht falsch ;-)
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten