代码
# 检查并安装所需的R包
required_packages <- c(
  "tidyverse",    # ggplot2, dplyr等
  "ggthemes",     # 主题
  "survival",     # 生存分析
  "survminer",    # 生存曲线可视化
  "meta",         # Meta分析
  "metafor",      # Meta分析森林图
  "corrplot"      # 相关系数矩阵可视化
)

# 检查并安装缺失的包
new_packages <- required_packages[!(required_packages %in% installed.packages()[,"Package"])]
if(length(new_packages)) install.packages(new_packages)

# 加载所有包
invisible(lapply(required_packages, library, character.only = TRUE))

4.1 ggplot2核心语法

4.1.1 临床指标分布直方图

代码
library(tidyverse)
library(ggthemes)

# 创建示例数据
set.seed(123)
clinical_data <- data.frame(
  BMI = rnorm(200, 24, 3),
  年龄 = rnorm(200, 45, 15),
  性别 = factor(sample(c("男", "女"), 200, replace = TRUE)),
  血糖 = rnorm(200, 5.5, 1)
)

# 绘制BMI分布直方图
ggplot(clinical_data, aes(x = BMI)) +
  geom_histogram(aes(y = ..density..), bins = 30, fill = "lightblue") +
  geom_density(color = "red") +
  labs(title = "患者BMI分布",
       x = "BMI (kg/m²)",
       y = "密度") +
  theme_minimal()

4.1.2 药物效果折线图

代码
# 创建药物效果随访数据
drug_data <- data.frame(
  时间点 = rep(c(0, 4, 8, 12, 16), each = 30),
  治疗组 = rep(rep(c("药物A", "药物B", "安慰剂"), each = 10), 5),
  血压 = rnorm(150, mean = 140, sd = 10) - 
        rep(c(0, 4, 8, 12, 16), each = 30) * 
        rep(c(2, 1.5, 0.5), each = 10)
)

# 绘制药物效果折线图
ggplot(drug_data, aes(x = 时间点, y = 血压, color = 治疗组)) +
  stat_summary(fun = mean, geom = "line") +
  stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.5) +
  labs(title = "不同治疗方案的降压效果",
       x = "随访时间 (周)",
       y = "收缩压 (mmHg)") +
  theme_minimal()

4.2 医学专用图形

4.2.1 生存曲线(Kaplan-Meier)

代码
library(survival)
library(survminer)

# 创建生存数据
set.seed(123)
survival_data <- data.frame(
  time = rexp(200, 1/50),
  status = sample(0:1, 200, replace = TRUE),
  group = factor(sample(c("高危", "低危"), 200, replace = TRUE))
)

# 创建生存对象
surv_obj <- Surv(survival_data$time, survival_data$status)
fit <- survfit(surv_obj ~ group, data = survival_data)

# 绘制生存曲线
ggsurvplot(fit,
           data = survival_data,
           pval = TRUE,
           conf.int = TRUE,
           risk.table = TRUE,
           title = "不同风险组患者生存曲线",
           xlab = "时间 (月)",
           ylab = "生存概率",
           legend.title = "风险分组",
           ggtheme = theme_minimal())

4.2.2 森林图(Meta分析)

代码
library(meta)
library(metafor)

# 创建Meta分析数据
studies <- data.frame(
  author = paste("研究", 1:8),
  year = 2015:2022,
  te = rnorm(8, 0.5, 0.2),   # 处理效应
  se = runif(8, 0.1, 0.3)    # 标准误
)

# 进行Meta分析
meta_analysis <- metagen(TE = te,
                        seTE = se,
                        studlab = author,
                        data = studies,
                        sm = "RR",
                        fixed = TRUE,
                        random = TRUE)

# 绘制森林图
forest(meta_analysis,
       leftlabs = c("研究", "年份"),
       xlab = "风险比(RR)",
       text.random = "随机效应模型",
       text.fixed = "固定效应模型")

4.3 图形美化与输出

4.3.1 期刊论文格式调整

代码
# 创建期刊风格主题
journal_theme <- theme_minimal() +
  theme(
    text = element_text(family = "Times New Roman", size = 12),
    axis.title = element_text(size = 14),
    plot.title = element_text(size = 16, face = "bold"),
    legend.position = "bottom",
    panel.grid.minor = element_blank()
  )

# 应用到图形
ggplot(clinical_data, aes(x = 年龄, y = 血糖, color = 性别)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm") +
  labs(title = "年龄与血糖水平的关系",
       x = "年龄 (岁)",
       y = "空腹血糖 (mmol/L)") +
  journal_theme

4.3.2 导出高分辨率TIFF/PDF

代码
# 导出TIFF格式
ggsave("figure1.tiff",
       width = 8, height = 6,
       dpi = 300,
       compression = "lzw")

# 导出PDF格式
ggsave("figure1.pdf",
       width = 8, height = 6,
       device = cairo_pdf)
练习
  1. 使用自己的数据创建分布图
  2. 绘制治疗效果的时间序列图
  3. 制作一个符合期刊要求的图形
  4. 尝试不同的配色方案

4.4 本章小结

在本章中,我们学习了:

  1. ggplot2的基本语法和应用
  2. 医学研究中常用的图形类型
  3. 如何美化图形以符合出版要求
  4. 高质量图形的导出方法

下一章,我们将学习基础统计分析方法。