喜提“Acceptance”,多亏这两张图,能顶60张图的工作量!
本次使用R语言复现Nature子刊上的两张图!
R绘制-a图
分面图可以帮助快速识别条件变量变化对子数据集的影响,同时极大节约寸土寸金的版面费。
✅读入测试数据
✅关键代码,
# 关键代码
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
该图通过多维度数据(分子检测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()两种类型,二者区别:
facet_wrap()和facet_grid()详细使用见ggplot2教程第9章,
🔸双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
)
)
左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"# 确保每个时间点只画一个色块
)
深黄色阴影区域,显示抗原检测阳性时段;浅黄色阴影区域,显示抗原检测阴性时段 。
🔸标记妙用
不同颜色点、不同标记(圆点和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)) # 图例点大小覆盖
)
唾液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)
垂直虚线-标识CN值最低的日期;水平虚线-标明PCR和病毒培养的检测下限。
总之,图很简单,细节很多。
R绘制-b图
✅读入测试数据,
✅关键代码,
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轴缩放
✅值得学习的R可视化知识点:
🔸拟合曲线妙用
# 添加模型拟合曲线
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)
🔸分面妙用
共有30名参与者,每个参与者一个子图,facet_wrap分面为5行,每行为6个子图,
# 分面显示每个个体
facet_wrap(~Ind, scales = "free", nrow = 5) + # 5行排列
正文结束!
测试数据+详细代码👇
(备注:299)