我想创建一个具有两个独立轴的游泳者图。主轴应显示代表后续持续时间的条形,在 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 可能的解决方案。
您所描述的情况是可能的,但并不容易。您必须将随访时间转换为日期(或将日期转换为随访时间),对于大多数纵向研究,这将使日期轴的尺度比随访时间轴压缩得多。
换句话说,你可以这样做:
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"))
但是,从数据可视化的角度来看,这个图很难理解,并且会让观众感到困惑。有两个独立的地块是一个更好的主意:
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')