Сюжетные линии выживания лейбла R studio с использованием ggplot
Я пытаюсь пометить строки на выходе автоплота, созданного из объекта Surfit. Я экспериментировал с
directlabels
пакет безуспешно (проблема, похоже, в том, что функции geom_* не имеют доступа к базовым данным и не могут найти переменные из набора данных при использовании вместе с объектом сурфит, а не только сами данные внутри ggplot.
Подпрограмма автоплота, которую я сейчас использую:
autoplot(survfit(Surv(time, status) ~ sex, data = lung), fun = 'event')
Это создает такой сюжет:
Что я хотел бы сделать, так это переместить легенду «слои» с правой стороны на линии (прямо над ними слева или справа, эти детали для меня не важны).
Я не хочу маркировать каждую отдельную точку, просто помечаю каждую строку локально.
1 ответ
Использование библиотек
ggplot
а также
ggrepel
, вот что вы можете сделать:
Добавление меток к каждой строке
autoplot(survfit(Surv(time, status) ~ sex, data = lung), fun = 'event', legendLabs = FALSE) +
geom_label_repel(data = . %>% group_by(strata) %>% summarise(x = mean(time), y = mean(surv)),
aes(x = x, y = y, label = strata, color = strata)) +
theme(legend.position = 'none')
Поскольку с автоплотом можно работать так же, как с объектом ggplot, вы можете добавить текстовую метку, где ggrepel пригодится. ggrepel пытается оптимизировать положение добавленного текста / меток.
Поскольку вы не хотите добавлять метку к каждой отдельной точке данных, я изменил используемые данные, используя dplyr summarise
, так что осталось две строки, по одной для каждой «страты», и два дополнительных столбца (x и y), чтобы указать положение метки на основе соответствующих средних значений.
Кроме того, поскольку я считаю, что в этом больше нет необходимости, я удалил легенду.
Текст специальной метки
Если вы хотите настроить текст метки, например, потому что теперь заголовок легенды исчез, и вы хотите добавить эту информацию, вы можете сделать это, добавив еще один столбец к используемым данным.
geom_label_repel
. Вот пример:
autoplot(survfit(Surv(time, status) ~ sex, data = lung), fun = 'event', legendLabs = FALSE) +
geom_label_repel(data = . %>% group_by(strata) %>% summarise(x = mean(time), y = mean(surv)) %>% mutate(label = paste('strata =', strata)),
aes(x = x, y = y, label = label, color = strata)) +
theme(legend.position = 'none')