如何创建具有两个独立轴的游泳者图,其中第一个轴代表后续长度,而第二个轴代表日历时间

问题描述 投票:0回答:1

我想创建一个具有两个独立轴的游泳者图。主轴应显示代表后续持续时间的条形,在 x = 0 处对齐,而次轴应显示代表日历时间的线或点,不需要在 x = 0 处对齐。

有没有一种有效的方法可以使用 R(使用 ggplot2)或 SAS 来绘制此图?我尝试询问 ChatGPT 并在线搜索,但我发现的大多数答案仅涉及连接的轴。

以下是ChatGPT提供的示例数据。

library(dplyr)

# Example data
data <- data.frame(
  ID = 1:10,
  start_date = as.Date(c('1950-01-01', '1960-02-01', '1970-03-01', '1980-04-01', '1990-05-01',
                         '1955-06-01', '1965-07-01', '1975-08-01', '1985-09-01', '1995-10-01')),
  end_date = as.Date(c('2000-01-01', '2010-02-01', '2020-03-01', '2015-04-01', '2025-05-01',
                       '1995-06-01', '2005-07-01', '2015-08-01', '2020-09-01', '2030-10-01'))
)

# Calculate follow-up length in years
data <- data %>%
  mutate(follow_up_years = as.numeric(difftime(end_date, start_date, units = "weeks")) / 52.25)

我在互联网上搜索了它并询问 ChatGPT 可能的解决方案。

r ggplot2 plot sas survival-analysis
1个回答
0
投票

您所描述的情况是可能的,但并不容易。您必须将随访时间转换为日期(或将日期转换为随访时间),对于大多数纵向研究,这将使日期轴的尺度比随访时间轴压缩得多。

换句话说,你可以这样做:

library(tidyverse)

data %>%
  mutate(follow_up = (end_date - start_date)/365.25,
         start_date_trans = as.numeric((start_date - min(start_date))/365.25),
         end_date_trans = as.numeric((end_date - min(start_date))/365.25)) %>%
  ggplot(aes(y = factor(ID, ID))) +
  geom_col(aes(x = follow_up)) +
  geom_linerange(aes(xmin = start_date_trans, xmax = end_date_trans),
                 color = 'red4') +
  scale_x_continuous('Follow up (years)',
                     sec.axis = sec_axis(~ .x * 365.25,
                                         breaks = seq(0, 365.25 * 80, 3652.5),
                                         labels = seq(1950, 2030, 10),
                                         name = "Actual time"))

enter image description here

但是,从数据可视化的角度来看,这个图很难理解,并且会让观众感到困惑。有两个独立的地块是一个更好的主意:

data <- data %>%
  mutate(follow_up = as.numeric((end_date - start_date)/365.25),
         ID = fct_reorder(factor(ID), follow_up, .desc = TRUE))

ggplot(data, aes(follow_up, ID)) +
  geom_col(aes(x = follow_up), width = 0.5, fill = 'navy') +
  theme_minimal(16) +
  labs(x = 'Years of follow-up', y = 'Participant ID')

ggplot(data, aes(start_date, ID)) +
  geom_linerange(aes(xmin = start_date, xmax = end_date), 
                 linewidth = 8, color = 'navy') +
  theme_minimal(16) +
  labs(x = 'Date of participation', y = 'Participant ID')

跟进时间 enter image description here

参与时间线 enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.