首页 > 科研绘图 > 如何绘制新颖好看的火山图?
2022
06-28

如何绘制新颖好看的火山图?

火山图(Volcano plot)是一种比较“远古”的一种散点图,广泛应用于转录组、蛋白组等组间差异分析结果的展示。图表的横轴一般展示差异倍数的变化,而纵轴表示差异分析结果的可靠性。

我这里对传统的火山图做了进一步的优化,比如通过调整点的大小突出展示感兴趣基因对应的点,并将感兴趣基因的名称以标签的方式展示出来,如下。

那么,如何绘制这般个性又好看的火山图呢?我这里主要用到的还是最常见的ggplot2包。

#设置工作目录;

setwd( "C:/Users/MHY/Desktop/火山图的绘制")

dir

#读入数据;

data<- read.csv( "protein_dia_simple.csv",header = T)

head(data)

#载入相关的R包;

library(dplyr)

library(ggplot2)

library(ggrepel)

#转成tibble便于后续使用,去掉不需要的列;

dt<- as_tibble(data[c(-2,-3,-5)])

head(dt)

#对Q值取对数;

dt$log10FDR <- -log10(dt$qvalue)

#生成显著上下调数据的分组标签;

dt$group <- case_when(dt$log2fc > 1 & dt$qvalue < 0.05 ~ "Up",

dt$log2fc < -1 & dt$qvalue < 0.05 ~ "Down",

abs(dt$log2fc) <= 1 ~ "None",

dt$qvalue >= 0.05 ~ "None")

head(dt)

#获取表达差异最显著的10个基因;

top10sig<- filter(dt,group!= "None") %>% distinct(Symbol,.keep_all = T) %>% top_n(10,abs(log2fc))

top10sig

#将差异表达Top10的基因表格拆分成up和down两部分;

up<- filter(top10sig,group== "Up")

up

down<- filter(top10sig,group== "Down")

down

#新增一列,将Top10的差异基因标记为2,其他的标记为1;

dt$size <- case_when(!(dt$id %in% top10sig$id)~ 1,

dt$id %in% top10sig$id ~ 2)

head(dt)

#提取非Top10的基因表格;

df<- filter(dt,size==1)

head(df)

#指定绘图顺序,将group列转成因子型;

df$group <- factor(df$group,

levels= c( "Up", "Down", "None"),

ordered= T)

#开始绘图,建立映射;

p0<-ggplot(data=df,aes(log2fc,log10FDR,color=group))

#添加散点;

p1<- p0+geom_point(size=1.6)

p1

#自定义半透明颜色(红绿);

mycolor<- c( "#FF9999", "#99CC00", "gray80")

p21<- p1 + scale_colour_manual(name= "",values=alpha(mycolor,0.9))

p21

#其他配色方案:

mycolor<- c( "#FF99CC", "#99CC00", "gray80")

p22<- p1 + scale_colour_manual(name= "",values=alpha(mycolor,0.7))

p22

#继续添加Top10基因对应的点;

p2<- p22+geom_point(data=up,aes(log2fc,log10FDR),

color= "#FF9999",size=3,alpha=0.9)+

geom_point(data=down,aes(log2fc,log10FDR),

color= "#7cae00",size=3,alpha=0.9)

p2

调整横轴和纵轴绘图区域的范围,重点突出Top10基因;设置y轴范围(上下两端的空白区域设为1),修改刻度标签。

#expansion函数设置坐标轴范围两端空白区域的大小;mult为“倍数”模式,add为“加性”模式;

p3<-p2+labs(y= "-log10FDR")+

scale_y_continuous(expand=expansion(add = c(2, 0)),

limits= c(0, 40),

breaks= c(0,10,20,30,40),

label= c( "0", "10", "20", "30", "40"))+

scale_x_continuous(limits = c(-4, 4),

breaks= c(-4,-2,0,2,4),

label= c( "-4", "-2", "0", "2", "4"))

p3

接下来为top10基因对应的散点添加指引线,我们主要用到geom_text_repel和geom_label_repel这两个函数,下面是比较重要的一些参数:

nudge_x/y:数据点与相应数据标签的距离,例如1表示标签在点右/上的1个单位处,而-2.2表示标签在点左/下2.2个单位处;

direction:标签分布方向,x表水平分布,y 表示垂直分布,both 表示随机分布;

segment.size:指定线段的粗细;

point.padding:表示点周围的空余区域,决定连接线端点到到数据点中心的距离,单位为line。

#添加箭头;

set.seed(007)

p4<- p3+geom_text_repel(data=top10sig,aes(log2fc,log10FDR,label=Symbol),

force=80,color= "grey20",size=3,

point.padding = 0.5,hjust = 0.5,

arrow= arrow(length = unit(0.01, "npc"),

type= "open", ends = "last"),

segment.color= "grey20",

segment.size=0.2,

segment.alpha=0.8,

nudge_x=0,

nudge_y=1)

p4

#自定义图表主题,对图表做精细调整;

top.mar=0.2

right.mar=0.2

bottom.mar=0.2

left.mar=0.2

#隐藏纵轴,并对字体样式、坐标轴的粗细、颜色、刻度长度进行限定;

mytheme<-theme_classic+

theme(text=element_text(family = "sans",colour = "gray30",size = 12),

axis.line = element_line(size = 0.6,colour = "gray30"),

axis.ticks = element_line(size = 0.6,colour = "gray30"),

axis.ticks.length = unit(1.5,units = "mm"),

plot.margin=unit(x=c(top.mar,right.mar,bottom.mar,left.mar),

units= "inches"))

#应用自定义主题;

p4+mytheme

#添加辅助线;

p5<- p3+geom_hline(yintercept = c(-log10(0.05)),

size= 0.7,

color= "orange",

lty= "dashed")+

geom_vline(xintercept = c(-1,1),

size= 0.7,

color= "orange",

lty= "dashed")

p5

#添加其他样式的标签;

#为了方便自定义左右区域的标签,这里使用up、down两个独立的子表格;

p6<- p5+geom_label_repel(

data= up,aes(log2fc,log10FDR,label=Symbol),

nudge_x= 1,

nudge_y= 5,

color= "white",

alpha= 0.9,

point.padding = 0.5,

size= 3,

fill= "#96C93D",

segment.size = 0.5,

segment.color = "grey50",

direction= "y",

hjust= 0.5) +

geom_label_repel(

data= down,aes(log2fc,log10FDR,label=Symbol),

nudge_x= -1,

nudge_y= 3,

color= "white",

alpha= 0.9,

point.padding = 0.5,

size= 3,

fill= "#9881F5",

segment.size = 0.5,

segment.color = "grey50",

direction= "y",

hjust= 0.5)

#应用自定义主题;

p7<- p6+mytheme

p7

好啦,以上就是今天分享的全部内容,你学会了吗?

转自:基迪奥生物


最后编辑:
作者:萌小白
一个热爱网络的青年!

发布评论

表情