pythonic生物人

喜提“Acceptance”,多亏这两张图,能顶60张图的工作量!

本次使用R语言复现Nature子刊上的两张图!

R绘制-a图

Image
这是一张典型的分面(facet)图,分面图将数据根据条件变量(季节、月份或者样本等)划分成多个子集,并分别对这些子集进行绘图,然后将图按照从左到右或者从上到下的顺序排列。

分面图可以帮助快速识别条件变量变化对子数据集的影响,同时极大节约寸土寸金的版面费。


✅读入测试数据

Image

✅关键代码,

# 关键代码
figure1A <-  ggplot() +
# 添加辅助背景色块
  geom_rect(
    data = . %>% filter(!is.na(Antigen)),  
    aes(
      xmin = Time - 0.5,            # 色块左边界(时间-0.5天)
      xmax = Time + 0.5,            # 色块右边界(时间+0.5天)
      ymin = -Inf, ymax = Inf,      # 色块垂直范围(整个图表高度)
      alpha = Antigen               # 透明度根据抗原结果(Pos/Neg)调整
    ),
    fill = "#DDCC77",               # 设置色块颜色为黄色
    stat = "unique"# 确保每个时间点只画一个色块
  ) +

# 添加深蓝色数据
  geom_point(aes(x = Time, y = Nasal_CN, color = "#004488", shape = "N"),
    alpha = 0.7, size = 0.5# 设置透明度和大小
  ) +

# 添加蓝绿色数据点
  geom_point(aes(x = Time, y = Saliva_Ct, col = "#009988", shape = "S"),
    alpha = 0.7, size = 0.5
  ) +

# 添加红色十字数据点
  geom_point(aes(Time, (Virus_pos_days - 1) * 10, color = "#B2182B", shape = "V"),
    size = 0.5, stat = "unique",    # 确保每个时间点只画一个点
    stroke = 0.8, alpha = 0.7# 设置十字线粗细和透明度
  ) +

# 添加水平参考线
  geom_hline(yintercept = 45, lty = "dashed", size = 0.3) +

# 添加垂直参考线
  geom_vline(xintercept = 0, linetype = 3, size = 0.3, alpha = 0.7) +

# 设置色块的透明度图例
  scale_alpha_manual("",
    breaks = c("Neg", "Pos"),            # 图例分Neg和Pos两类
    values = c(0.2, 0.6),                # 对应的透明度值
    labels = c("Negative Antigen test", "Positive Antigen test"),  # 图例标签
    guide = guide_legend(override.aes = list(alpha = c(0.4, 1)))  # 图例样式覆盖
  ) +

# 设置点形状图例
  scale_shape_manual("",
    guide = "legend",                   # 显示图例
    breaks = c("N", "S", "V"),          # 对应三种点形状
    values = c(19, 19, 4),              # 19=实心圆,4=十字
    labels = c("Nasal PCR", "Saliva PCR", "Viral culture")  # 图例标签
  ) +

# 设置颜色图例
  scale_color_identity("",
    labels = c("Nasal PCR", "Saliva PCR", "Viral culture"),  # 图例标签
    guide = guide_legend(override.aes = list(size = 1))      # 图例点大小覆盖
  ) +

  scale_y_continuous(
# 添加左边y轴
"Saliva Ct valuesnNasal CN values",  
    trans = "reverse",                    
    breaks = seq(10, 40, 10),            
    limits = c(50, 10),                   
# 添加右边y轴
    sec.axis = sec_axis(~ . * 0.1 + 1,    
      name = "Day of culture positivity", 
      breaks = 5:2
    )
  ) +

# 按参与者绘制分面图,5行,每个参与者一个子图
  facet_wrap(~Ind, scales = "free", nrow = 5) 

figure1A 
Image

该图通过多维度数据(分子检测PCR法、抗原检测antigen test、活病毒培养viral culture法)直观对比了30名参与者不同采样部位(唾液/鼻腔)的病毒载量动态变化趋势,揭示了病毒载量随时间的变化规律及检测方法的敏感性差异。

✅值得学习的R可视化知识点:

  • 🔸ggplot2的分面方法,
# 按参与者绘制分面图
  facet_wrap(~Ind, scales = "free", nrow = 5) 

共有30名参与者,每个参与者一个子图,facet_wrap分面为5行,每行为6个子图。

在ggplot2中,分面方法主要包括facet_wrap()和facet_grid()两种类型,二者区别:

Image

facet_wrap()和facet_grid()详细使用见ggplot2教程第9章,

Image

  • 🔸双y坐标轴妙用

当两类数据大小不在同一数量级时,推荐使用双y轴。

scale_y_continuous(
# 添加左边y轴
"Saliva Ct valuesnNasal CN values",  
    trans = "reverse",                    
    breaks = seq(10, 40, 10),            
    limits = c(50, 10),                   
# 添加右边y轴
    sec.axis = sec_axis(~ . * 0.1 + 1,    
      name = "Day of culture positivity", 
      breaks = 5:2
    )
  ) 
Image

左y轴显示检测的Ct值和CN值(圆点使用该y轴);右y轴显示细胞出现病变效应的培养天数(x点使用该轴)。

  • 🔸辅助面妙用
# 添加辅助背景色块
  geom_rect(
    data = . %>% filter(!is.na(Antigen)),  
    aes(
      xmin = Time - 0.5,            # 色块左边界(时间-0.5天)
      xmax = Time + 0.5,            # 色块右边界(时间+0.5天)
      ymin = -Inf, ymax = Inf,      # 色块垂直范围(整个图表高度)
      alpha = Antigen               # 透明度根据抗原结果(Pos/Neg)调整
    ),
    fill = "#DDCC77",               # 设置色块颜色为黄色
    stat = "unique"# 确保每个时间点只画一个色块
  ) 
Image

深黄色阴影区域,显示抗原检测阳性时段;浅黄色阴影区域,显示抗原检测阴性时段 。

  • 🔸标记妙用

不同颜色点、不同标记(圆点和x点)代表不同类别数据,

# 设置点形状图例
  scale_shape_manual("",
    guide = "legend",                   # 显示图例
    breaks = c("N", "S", "V"),          # 对应三种点形状
    values = c(19, 19, 4),              # 19=实心圆,4=十字
    labels = c("Nasal PCR", "Saliva PCR", "Viral culture")  # 图例标签
  ) +

# 设置颜色图例
  scale_color_identity("",
    labels = c("Nasal PCR", "Saliva PCR", "Viral culture"),  # 图例标签
    guide = guide_legend(override.aes = list(size = 1))      # 图例点大小覆盖
  ) 
Image

唾液Saliva PCR数据(蓝绿色圆点);鼻腔Nasal PCR数据(深蓝色圆点);活病毒培养Viral culture数据(红色x)

  • 🔸辅助线妙用

辅助线常用于指定数据的上下左右边界线,

# 添加水平参考线
  geom_hline(yintercept = 45, lty = "dashed", size = 0.3) +

# 添加垂直参考线
  geom_vline(xintercept = 0, linetype = 3, size = 0.3, alpha = 0.7)
Image

垂直虚线-标识CN值最低的日期;水平虚线-标明PCR和病毒培养的检测下限。

总之,图很简单,细节很多。


R绘制-b图


Image
图b基于图a中同一批参与者的数据,通过模型拟合展示了唾液Saliva PCR数据(蓝绿色圆点)和鼻腔Nasal PCR数据(深蓝色圆点)的动态变化。

✅读入测试数据,

Image

✅关键代码,

figure2B <- facet_data2 %>%        
  right_join(ID_fig1) %>%         

# 开始ggplot绘图
  ggplot() +

# 添加观测数据点
  geom_point(aes(x = Timez, y = Obs, alpha = "O", col = Compartment),
    size = 1, stat = "unique"# 点大小1,确保唯一性
  ) +

# 添加模型拟合曲线
  geom_line(
    data = . %>% filter(!is.na(Sim)), size = 0.5,  # 线宽0.5,过滤NA值
    aes(x = Timez, y = Sim, alpha = "S", col = Compartment)
  ) +

# 添加参考线
  geom_hline(yintercept = 42, linetype = 3, size = 0.5, col = "#004488") +  
  geom_hline(yintercept = 40, linetype = 3, size = 0.5, col = "#009988") +  
  geom_vline(xintercept = 0, linetype = 3, size = 0.2, alpha = 0.7) +       

# 分面显示每个个体
  facet_wrap(~Ind, scales = "free", nrow = 5) +  # 5行排列,自由y轴缩放
Image

✅值得学习的R可视化知识点:

  • 🔸拟合曲线妙用
# 添加模型拟合曲线
  geom_line(
    data = . %>% filter(!is.na(Sim)), size = 0.5,  # 线宽0.5,过滤NA值
    aes(x = Timez, y = Sim, alpha = "S", col = Compartment)
  )
Image
  • 🔸辅助线妙用
# 添加参考线
  geom_hline(yintercept = 42, linetype = 3, size = 0.5, col = "#004488") +  
  geom_hline(yintercept = 40, linetype = 3, size = 0.5, col = "#009988") +  
  geom_vline(xintercept = 0, linetype = 3, size = 0.2, alpha = 0.7) 
Image
  • 🔸分面妙用

共有30名参与者,每个参与者一个子图,facet_wrap分面为5行,每行为6个子图,

# 分面显示每个个体
  facet_wrap(~Ind, scales = "free", nrow = 5) +  # 5行排列

正文结束!


测试数据+详细代码👇

(备注:299)

图片