方法说明
双轴图用途:
- 展示两个不同量级的指标(如发病率 vs 患病率)
- 比较绝对数值(人数)和相对数值(率)
- 展示时间趋势和年龄分布
代码实现
1. 发病率 + 患病率时间趋势
R 代码:双轴时间趋势图
library(ggplot2)
library(dplyr) # 读取数据:需要年份、发病率、患病率
df <- fread("examples/dual_axis_input.csv") # 按年份汇总
df_yearly <- df[, .( incidence = sum(incidence, na.rm = TRUE), prevalence = sum(prevalence, na.rm = TRUE)
), by = .(year)] # 绘制双轴图
p_dual <- ggplot(df_yearly, aes(x = year)) + # 左轴:发病率(柱状图) geom_bar(aes(y = incidence), fill = "steelblue", stat = "identity", alpha = 0.7) + # 右轴:患病率(折线图) geom_line(aes(y = prevalence), color = "#e31a1c", linewidth = 1.5, group = 1) + geom_point(aes(y = prevalence), color = "#e31a1c", size = 2) + # 设置右轴 scale_y_continuous( name = "Incidence", sec.axis = sec_axis(~., name = "Prevalence") ) + labs(x = "Year") + theme_minimal + theme( axis.title.y.left = element_text(color = "steelblue"), axis.title.y.right = element_text(color = "#e31a1c") ) p_dual
ggsave("examples/dual_axis_trend.png", p_dual, width = 10, height = 6) 2. 年龄分布双轴图
R 代码:年龄分布双轴图
# 按年龄组汇总
df_age <- df[, .( number = sum(number, na.rm = TRUE), rate = mean(rate, na.rm = TRUE)
), by = .(age_group)] # 排序年龄组
df_age$age_group <- factor(df_age$age_group, levels = c("<5", "5-9", "10-14", "15-19", "20-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50-54", "55-59", "60-64", "65-69", "70-74", "75-79", "80-84", "85-89", "90-94", "95+")) # 绘制
p_age_dual <- ggplot(df_age, aes(x = age_group)) + geom_bar(aes(y = number), fill = "steelblue", stat = "identity", alpha = 0.7) + geom_line(aes(y = rate * max(number) / max(rate)), # 缩放率值 color = "#e31a1c", linewidth = 1.5, group = 1) + geom_point(aes(y = rate * max(number) / max(rate)), color = "#e31a1c", size = 2) + scale_y_continuous( name = "Number of Cases", sec.axis = sec_axis(~ . * max(df_age$rate) / max(df_age$number), name = "Rate (per 100,000)") ) + theme(axis.text.x = element_text(angle = 45, hjust = 1)) p_age_dual