R学习|感受ggplot2的魅力—ggplot2复现Nature Cancer可视化(七)

Roger 不言 劝人学医TDLP 2023-10-07 20:49
       
我们继续接着上期的内容,学习一下文章图2的可视化思路。
图片

Váraljai, Renáta et al. “Author Correction: Interleukin 17 signaling supports clinical benefit of dual CTLA-4 and PD-1 checkpoint inhibition in melanoma.” Nature cancer vol. 4,9 (2023): 1395. doi:10.1038/s43018-023-00632-w

以下是作者图2中的主要图。

图片


我们本次复现的内容主要有

图2a中的肿瘤生长曲线图:肿瘤生长曲线是动物实验中经常用到的可视化方式,用于比较不同干预下皮下瘤小鼠模型的肿瘤体积变化。肿瘤生长曲线可视化主要涉及重复测量数据的可视化。在R中,我们可以通过ggplot2绘制带误差棒的折线图+散点图来实现我们的可视化需求。

图片


图2b中带误差棒柱状图的多组统计比较可视化:这个作图思路就是先绘制不同组之间的柱状图+添加误差棒+添加抖动散点,然后添加统计注释。因为是多组之间比较,如果利用ggsignif做统计检验比较麻烦。可以事先进行统计比较,将统计结果作为一个注释数据框,然后在geom_signif函数中添加统计注释,下图是我们可视化的效果。

图片


图2c中带误差棒柱状图的两组统计比较可视化:这个作图思路同上。

图片


图2d中的热图:热图可视化我们之前好多期都有涉及。选择性比较多,可以用ggplot2中的geom_tile函数,也可以使用pheatmap函数,这里我们用的是complexheatmap,更加灵活。

图片


图2e中的文本注释相关性散点图:这个作图思路也很清洗,相关性散点图+添加辅助线+文本注释,主要用到ggplot2和ggrepel包。

图片


最后是图2f中的配对散点图:这个思路跟我们之前的配对箱线图的可视化思路基本一样。配对分析可视化中最主要的是多了配对变量,即需要指明不同分组中哪些观察值匹配。这个图的作图思路就是散点图+配对线图。

图片

下面开启我们的复现之旅!



1

肿瘤生长曲线图

图片

什么是肿瘤生长曲线图


图片

肿瘤生长曲线图是一种用于描述肿瘤体积、质量或大小随时间变化的图表。这种图表通常用于研究肿瘤在不同治疗条件下的生长情况,或者用于比较不同肿瘤类型之间的生长速率。肿瘤生长曲线图可以提供关于肿瘤生长动态的重要信息,有助于研究人员和临床医生了解肿瘤的特性和应对治疗的效果。

在肿瘤生长曲线图中,通常以下要素会被考虑:
  • 时间轴:横轴通常表示时间,可以是天、周、月等时间单位,取决于研究的时间范围。
  • 肿瘤体积/大小:纵轴表示肿瘤的体积、质量或大小。这个指标可以根据研究的目的选择,例如,体积通常用于描述立体肿瘤,而质量可能更适用于分析肿瘤质量变化。
  • 不同组别或条件:如果研究中有多个实验组或治疗条件,每个组别的肿瘤生长曲线通常会以不同的线条或颜色表示,以便比较它们之间的差异。
  • 数据点:在每个时间点上,记录肿瘤的体积、质量或大小,并将这些数据点连接起来以形成生长曲线。
肿瘤生长曲线图的形状和趋势可以提供有关肿瘤生长的关键信息。例如,曲线的斜率可以表示肿瘤的生长速率,而曲线的拐点可能表示肿瘤生长的阶段性变化或治疗效果的转折点。
这种类型的图表在肿瘤研究、癌症治疗评估以及药物疗效研究中经常使用。通过监测肿瘤的生长曲线,研究人员可以更好地理解肿瘤的生物学特性,评估不同治疗策略的效果,并为临床决策提供有用的信息。

图片

复现代码

# Figure 2a# 读入数据library(readxl)library(tidyverse)library(ggplot2)library(ggpubr)library(numform)#对数字和图表进行统一格式化# 读取Excel文件中的特定工作表Figure_2a <- read.delim("Fig 2a.txt",header = T)#因子化Figure_2a$Group<-factor(Figure_2a$Group,levels = unique(Figure_2a$Group))# 可视化Fig_2a<-ggplot(Figure_2a,aes(x=Day,y=Mean,color=Group,group=Group))+  geom_errorbar(aes(ymin=Mean,ymax=Mean+SEM,width=0.25),color="grey")+#添加误差棒  geom_point(size=2.5)+#点图  geom_line(linewidth=1)+#线图  labs(x="Time (d)",y=expression("Tumor volume (mm"^3*")"))+#设置坐标轴标题格式  scale_x_continuous(limits = c(8,28),breaks =seq(8,28,4),expand = c(0,0))+#设置坐标轴刻度及起始  scale_y_continuous(limits = c(0,1200),breaks = seq(0,1200,125),expand = c(0,0))+  scale_color_manual(values = c("black","#1b6292","#ff8080","#c5934e"))+  theme_classic()+  theme(legend.title = element_blank(),#不显示图例标题        legend.text = element_blank(),#不显示图例文本        legend.key.width = unit(1,"cm"),#图例宽度        legend.key.height = unit(1,"cm"),#图例高度        plot.margin = margin(r=0.5,t=0.5,unit = "cm"),#设置画板边缘大小        axis.text = element_text(color = "black"))#不显示坐标轴文本Fig_2aggsave("Figure 2a.png",plot = Fig_2a,width =5,height =3.5,dpi = 600)

图片

统计结果可以在prism里面计算出来后在AI或PS里面添加。

2

带误差棒柱状图的多组统计比较可视化

图片

复现代码

# Figure 2b# 读入数据Figure_2b <- read_excel("./Fig 1.xlsx", sheet = "Fig.2b",na="NA",skip = 1)[1:5,1:4]# 宽数据转换为长数据格式Figure_2b%>%  pivot_longer(cols = 1:4,               names_to = "Group",               values_to ="Value")->Figure_2b# 分组标签Group<-unique(Figure_2b$Group)# 分组因子化Figure_2b$Group<-factor(Figure_2b$Group,levels = unique(Figure_2b$Group),labels = c("A","B","C","D"))# 统计分析anova_result<-aov(Value~Group,data=Figure_2b)# 多重比较anno_df1<-TukeyHSD(anova_result)%>%broom::tidy()#1. Specify the stat comparison groupsp <- "P"anno_df1 %>%  #P值格式   mutate(p_new = ifelse(adj.p.value > 0.01, c(paste("italic('P')~`=", f_num(adj.p.value,2), "`")), adj.p.value))%>%   mutate(p_new = ifelse(adj.p.value < 0.01, c(paste("italic('P')~`=", f_num(adj.p.value,3), "`")), p_new)) %>%  mutate(p_new = ifelse(adj.p.value < 0.001, c(paste("italic('P')~`", "<.001", "`")), p_new))->anno_df# 产生P值注释的xmin和xmax参数anno_df$group1<-substr(anno_df$contrast,3,3)anno_df$group2<-substr(anno_df$contrast,1,1)# 执行两两比较,使用 Bonferroni 校正# dunn.test::dunn.test(Figure_2b$Value, g = Figure_2b$Group, method = "sidak")# 计算不同组的均数和标准差# 自定义函数data_summary <- function(data, varname, groupnames){  require(plyr)  summary_func <- function(x, col){    c(mean = mean(x[[col]], na.rm=TRUE),      sd = sd(x[[col]], na.rm=TRUE))  }  data_sum<-ddply(data, groupnames, .fun=summary_func,                  varname)  data_sum <- rename(data_sum, c("mean" = varname))  return(data_sum)}# 产生新数据框,包含每个分组的均数和标准差Figure_2b2 <- data_summary(Figure_2b, varname="Value",                     groupnames="Group")# 可视化Fig_2b<-ggplot(Figure_2b2,aes(x=Group,y=Value,fill=Group))+  geom_bar(stat="identity",width = 0.6,color="black",position=position_dodge()) +#柱状图  geom_errorbar(aes(ymin=Value, ymax=Value+sd), width=.3,#添加误差棒                position=position_dodge(.9))+  geom_jitter(data=Figure_2b,aes(x=Group,y=Value),#添加散点图并设置属性              width = 0.3,height = 0.1,color="black",alpha=0.3,fill="transparent",na.rm = TRUE)+  labs(x = "", y = expression("Serum IL-17A (pg ml"^{-1}*")"))+  scale_y_continuous(limits = c(0,2500),breaks = seq(0,2500,500),expand = c(0,0))+  scale_fill_manual(values = c("black","#1b6292","#ff8080","#c5934e"),                    labels=Group)+  theme_classic()+  theme(legend.position ="top",        legend.title = element_blank(),        legend.key.width = unit(1,"cm"),        legend.key.height = unit(0.3,"cm"),        legend.text = element_text(size =6),        axis.text.x = element_blank(),        axis.text.y = element_text(color = "black"),        axis.ticks.x = element_blank(),        plot.margin = margin(t=0.5,r=0.5,unit="cm"))+  guides(fill=guide_legend(nrow =2))+#设置图例显示为两行  geom_signif(annotations = anno_df[-3,]$p_new,#添加统计学结果              y_position = c(1300,2000,2200,2350,2100), #统计结果纵坐标轴对应位置              xmin=anno_df[-3,]$group1,               xmax=anno_df[-3,]$group2,textsize=8/.pt,               manual= F, parse=T, size=0.3)
Fig_2bggsave("Figure 2b.png",plot = Fig_2b,width =4,height =4,dpi = 600)

图片

这里需要说明的是,作者在原文中是用了方差分析后的两两比较(Holm–Sidak’s多重比较)计算P值。

"One-way ANOVA with Holm–Sidak’s multiple-comparison test" 是一种用于分析多组数据之间差异的统计方法。它结合了一元方差分析(One-way ANOVA)和 Holm-Sidak 多重比较检验(multiple-comparison test)。
一元方差分析用于比较三个或更多组之间的均值是否显著不同。它告诉您是否有统计学上的差异存在,但不能告诉您哪两组之间存在差异。这时就需要进行多重比较检验来确定哪些组之间存在显著差异。
Holm-Sidak 多重比较检验是一种常用的多重比较方法之一。它通过对每一对组之间的比较进行修正,以减少因进行多次比较而引起的错误发现率。Holm-Sidak 方法通常比 Bonferroni 方法更具统计功效,因为它对更显著的比较施加了较小的调整,而对不太显著的比较施加了较大的调整。
两者的区别在于:Bonferroni 是一种保守的多重比较方法,它将显著性水平除以所进行的比较次数来控制错误发现率。这意味着它对每一对比较都施加相同的调整,可能导致过于保守的结果。Holm-Sidak 方法也用于控制错误发现率,但它根据比较的相对显著性对调整进行更细致的控制。这意味着对于那些在未经校正的条件下非常显著的比较,Holm-Sidak 方法可能会施加较小的调整,从而提高了检测到显著性的可能性。
小编在查询资料后发现目前在R中可以通过dunn.test检验进行方差分析后的Sidak校正多重比较。然而小编却没有得到跟作者一样的结果。这里为了演示可视化过程,小编采用了TukeyHSD方法进行两两比较。

3

带误差棒柱状图的两组统计比较可视化

图片

复现代码

# Figure 2c# 读入数据Figure_2c<- read_excel("./Fig 1.xlsx", sheet = "Fig.2c",na="NA",skip = 1)[,1:2]colnames(Figure_2c)<-c("A","B")# 数据格式转换Figure_2c%>%  pivot_longer(cols = 1:2,               names_to = "Group",               values_to = "Value")->Figure_2c# 去除缺失值Figure_2c<-na.omit(Figure_2c)# 因子化Figure_2c$Group<-factor(Figure_2c$Group,levels = unique(Figure_2c$Group))#统计分析#1. Specify the stat comparison groupsP <- "P"#使用t检验(非配对样本)比较不同组间的差异anno_df2 <- compare_means(Value~Group, data =Figure_2c, method="t.test",var.equal=TRUE,paired=F) anno_df2 %>%  #P值格式   mutate(p_new = ifelse(p > 0.01, c(paste("italic('P')~`=", f_num(p,4), "`")), p))%>%   mutate(p_new = ifelse(p < 0.01, c(paste("italic('P')~`=", f_num(p,3), "`")), p_new)) %>%  mutate(p_new = ifelse(p < 0.001, c(paste("italic('P')~`", "<.001", "`")), p_new))->anno_df2# 产生新数据框,包含每个分组的均数和标准差Figure_2c2 <- data_summary(Figure_2c, varname="Value",                            groupnames="Group")# 可视化Fig_2c<-ggplot(Figure_2c2,aes(x=Group,y=Value))+  geom_bar(stat="identity",width = 0.5,color="black",alpha=0.8,fill="grey",position=position_dodge()) +  geom_errorbar(aes(ymin=Value, ymax=Value+sd), width=.3,                position=position_dodge(.9))+  geom_jitter(data=Figure_2c,aes(x=Group,y=Value),size=2,              width = 0.3,height = 0.1,color="black",alpha=0.3,fill="transparent")+  labs(x="",y = expression("Serum IL-17A (pg ml"^{-1}*")"))+  scale_y_continuous(limits = c(0,2400),breaks = seq(0,2400,500),expand = c(0,0))+  scale_x_discrete(labels= c(expression("< 800 mm"^3), expression("> 800 mm"^3))) +  theme_classic()+  theme(axis.text = element_text(color = "black"),        axis.text.x = element_text(angle = 45,hjust =1),        plot.margin = margin(t=0.5,r=0.2,unit="cm"))+  geom_signif(annotations = anno_df2$p_new,#添加统计学结果              y_position =2250,               xmin=anno_df2$group1,               xmax=anno_df2$group2,textsize=8/.pt,               manual= F, parse=T, size=0.3)
Fig_2c ggsave("Figure 2c.png",plot = Fig_2c,width =2.5,height =3.5,dpi = 600)

图片


4

热图

图片

复现代码

# Figure 2d# 读入数据Figure_2d<- read_excel("./Fig 1.xlsx", sheet = "Fig.2d",na="NA",skip = 2)# 重命名colnames(Figure_2d)<-c("ID","MEL126","MEL149-2","MEL070","MEL126","MEL149-2","MEL070")# 数据格式转换Figure_2d%>%  t()%>%as.data.frame()->Figure_2d# 重命名colnames(Figure_2d)<-Figure_2d[1,]Figure_2d<-Figure_2d[-1,]# 将字符串转换为数值型变量Figure_2d2<-data.frame(lapply(Figure_2d, as.numeric))# 行名列名重命名rownames(Figure_2d2)<-rownames(Figure_2d)colnames(Figure_2d2)<-colnames(Figure_2d)# 将数据框转换为矩阵mat<-as.matrix(Figure_2d2)# 可视化col_fun<-colorRampPalette(colors = c("#5a89c5","white","#f8696b"))(50) #构建用于绘图的颜色# 加载包library(ComplexHeatmap)library(circlize)# 分组设置Group=data.frame(Group=factor(rep(c("α-CTLA-4 + α-PD-1","α-CTLA-4 + α-PD-1 +α-IL-17A"),each=3)),row.names = rownames(Figure_2d2))# 热图绘制ha<-Heatmap(mat,col = col_fun,        name = "z score",#热图名称        cluster_rows = F,cluster_columns = F,#不聚类        row_names_side = "left",#行名位置        row_names_gp = gpar(fontsize=10),#行名字体大小        column_names_gp = gpar(fontsize=10),#列名字体大小        row_title_side = "right",#行标题位置        row_title_gp = gpar(fontsize=8),#行标题字体大小        row_title_rot =0,#行标题旋转        border = T,#显示热图边框        border_gp = gpar(color="black",lwd=2),#热图边框色及宽度        rect_gp = gpar(col="grey",lwd=1.5),#热图单元格边框色及宽度        heatmap_legend_param = list(#热图图例设置          at = c(-2, 0, 2),#图例显示刻度          title = "z score",#图例标题          legend_height = unit(2, "cm"),#图例高度          direction="horizontal",#图例方向          border="black"),#图例边框颜色        row_split = Group,#行分割        row_gap = unit(0, "mm"))#行间隔宽度pdf("Figure 2d.pdf",width =8,height =2.5)draw(ha,heatmap_legend_side = "top")dev.off()

图片

剩下的细节可以在AI或PS调节。

5

带文本注释的相关性散点图可视化

图片

复现代码

# Figure 2e# 热图文本注释包library(ggrepel)# 读入数据Figure_2e<- read_excel("./Fig 1.xlsx", sheet = "Fig.2e",na="NA",skip = 1)# 可视化Fig_2e<-ggplot(Figure_2e,aes(x=`αPD1+αCTLA4`,y=`αPD1+αCTLA4+αIL17A`))+  geom_point(size=3.5,color="#1b6292")+#散点图  scale_y_continuous(limits = c(-1,2.5),expand = c(0,0))+  scale_x_continuous(limits = c(-1,2.5),expand = c(0,0))+  labs(x="α-CTLA-4 + α-PD-1 (z scores)",       y="α-CTLA-4 + α-PD-1 + α-IL-17A\n(z scores)")+  theme_bw()+  theme(panel.grid = element_blank())+  geom_abline(slope = 1,linetype="dashed",color="grey")+#添加辅助线  geom_label_repel(data =Figure_2e,#添加文本注释                   aes(x=`αPD1+αCTLA4`,y=`αPD1+αCTLA4+αIL17A`, label = Marker),                   box.padding = 0.2,                   segment.color = NA,                   label.padding = 0,                   label.size =NA,                   nudge_x = 0.05,                   nudge_y = 0.05,                   color = "black",                   fill=NA,                   size =3,                   max.overlaps =100)Fig_2e  ggsave("Figure 2e.png",plot = Fig_2e,width =4,height =3.5,dpi = 600) 

图片



5

配对散点图可视化


图片

复现代码

# Figure 2f# 读入数据Figure_2f<- read_excel("./Fig 1.xlsx", sheet = "Fig.2f",na="NA",skip = 2)[1:3,1:3]# 重命名列名colnames(Figure_2f)<-c("Patient","α-CTLA-4 + α-PD-1","α-CTLA-4 + α-PD-1+α-IL-17A")# 数据格式转换Figure_2f%>%  pivot_longer(cols = 2:3,               names_to = "Group",               values_to = "Value")->Figure_2f# 因子化Figure_2f$Group<-factor(Figure_2f$Group,levels = unique(Figure_2f$Group))# 可视化Fig_2f<-ggplot(Figure_2f,aes(x=Group,y=Value,color=Group,group=Patient))+#按照patient分组  geom_line(color="grey")+#配对线图  geom_point(size=4)+#散点图  scale_color_manual(values = c("#1b6292","#c5934e"))+  scale_y_continuous(limits = c(min(Figure_2f$Value),80))+  labs(x="",y=expression("Delta (pg ml"^{-1}*")"))+  theme_classic()+  theme(legend.position = "top",        axis.text.x = element_blank(),        axis.text.y = element_text(color = "black"),        axis.ticks.x = element_blank())+  guides(color=guide_legend(nrow = 2))Fig_2fggsave("Figure 2f.png",plot = Fig_2f,width =3,height =3.5,dpi = 600) 

图片

本次的复现就到这里了,下次再见!

图片

图源于网络



图片

相关推荐


图片

R学习|使用forestploter绘制meta分析发表级森林图


图片

R学习|使用ggplot2将你的回归分析结果可视化


图片

R学习|个性化森林图可视化


图片

R学习|forplo——更为灵活的森林图可视化R包


图片

R学习|forestploter——助力实现发表级森林图绘制

图片

R学习|一键单多因素回归分析及ggplot2可视化回归分析结果

图片

R学习|感受ggplot2的魅力—Nature Cancer可视化结果复现

图片

R学习|感受ggplot2的魅力—Nature Cancer可视化结果复现(二)


图片

R学习|堆叠百分比面积图了解一下!


图片

Python学习|Python中几行代码实现高颜值相关性热图及聚类热图可视化


图片

R学习|感受ggplot2的魅力—ggplot2复现Nature可视化(三)

图片

R学习|感受ggplot2的魅力—ggplot2复现Nature可视化(四)

图片

R学习|感受ggplot2的魅力—ggplot2复现Nature可视化(五)

图片

R学习|感受ggplot2的魅力—ggplot2复现Nature Cancer可视化(六)



收录于合集 #R学习
 45
上一篇R学习|感受ggplot2的魅力—ggplot2复现Nature Cancer可视化(六)
文章已于2023-10-08修改

微信扫一扫
关注该公众号