文献美图汇总--火山图

火山图绘制–形式一

效果如下

volcano1.png

相关代码:

library(ggplot2)

setwd("C:/Users/Kevin/Desktop/R_Visualization/01.火山图")

########## 普通火山图 ############ 
rm(list = ls())

df <- read.table('diff_DEseq2.xls', header = TRUE, sep = "\t",row.names = 1)
head(df)

#对差异基因的p值从小到大排序
df <- df[order(df$padj),]
up.genes = head(df$gene[which(df$change == "up")],5)
##低表达的基因中,选择adj.P.Val值最小的10个
down.genes = head(df$gene[which(df$change == "down")],5)

sig_genes <- df %>% filter(gene %in% c(up.genes, down.genes))
up_genes <- df %>% filter(gene %in% up.genes)
down_genes <- df %>% filter(gene %in% down.genes)

table(df$change)

df$change <- factor(df$change, levels = c('up','down','stable'))
library(ggrepel)
df %>%
  ggplot(aes(x = log2FoldChange, y = -log10(padj))) +
  # 绘制基础散点图,并根据 gene_type 对点的颜色进行分类,设置点的透明度 (alpha=0.6),形状 (shape = 16),大小 (size = 1)
  geom_point(aes(color = change), alpha = 0.6, shape = 16, size = 2) +
  # 从 up_genes 数据框中绘制特定形状的散点图,填充颜色为红色,边框颜色为黑色,大小为 2
  geom_point(data = up_genes, shape = 21, size = 3, fill = "#C70E7BFF", colour = "#C70E7BFF") +
  # 从 down_genes 数据框中绘制特定形状的散点图,填充颜色为钢蓝色,边框颜色为黑色,大小为 2
  geom_point(data = down_genes, shape = 21, size = 3, fill = "#007BC3FF", colour = "#007BC3FF") +
  # 添加水平虚线,y 轴截距为 -log10(0.05),表示显著性阈值为 0.05
  geom_hline(yintercept = -log10(0.05), linetype = "dashed") +
  # 添加垂直虚线,x 轴截距为 log2(0.5) 和 log2(2),表示折叠变化范围为 0.5 到 2
  geom_vline(xintercept = c(log2(0.5),log2(2)), linetype = "dashed") +
  # 在图中显示 sig_genes 数据框中基因符号的标签
  geom_label_repel(data = sig_genes, aes(label = gene), force = 2, nudge_y = 1) +
  # 设置 gene_type 对应的颜色映射
  scale_color_manual(values = c("up" = "#FC6882FF", "down" = "#54BCD1FF", "stable" = "grey"),
                     labels = c(  "up 559", 'down 582', 'stable 19752')) +
  # 设置 x 轴的刻度和范围
  # scale_x_continuous(breaks = c(seq(-10, 10, 2)), limits = c(-10, 10)) +
  # 设置 x 轴和 y 轴的标签
  labs(x = "log2(fold change)", y = "-log10(adjusted P-value)", colour = "Expression change") +
  # 调整图例外观,将图例大小设为 5,位置设置为右上角
  guides(color = guide_legend(override.aes = list(size = 5))) +
  theme_bw() + #  # 设置图的主题为白色背景
  # 设置图的主题样式,包括边框、网格线、背景等
  theme(panel.border = element_rect(colour = "black", fill = NA, size = 0.5),
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        plot.background = element_blank(),
        axis.title = element_text( color = "black", size = 10),
        axis.text = element_text(color = "black", size = 9),
        legend.background = element_blank(),
        legend.title = element_text( color = "black", size = 10),
        legend.text = element_text( color = "black", size = 9),
        legend.spacing.x = unit(0, "cm"),
        legend.position = c(0.88, 0.89)  # 设置图例位置为右上角
  )

ggsave('volcano1.png',dpi = 300,bg = 'white',width = 8,height = 7)

火山图绘制–形式二

效果如下

volcano2.png

相关代码

########## 普通火山图2 ############ 
rm(list = ls())

####----load R Package----####
library(tidyverse)
library(ggrepel)
library(ggfun)
library(grid)

####----load data----####
df <- read.table('diff_DEseq2.xls', header = TRUE, sep = "\t",row.names = 1)

####----plot----####
ggplot(data = df) + 
  geom_point(aes(x = log2FoldChange, y = -log10(padj), 
                 color = log2FoldChange,
                 size = -log10(padj))) + 
  geom_point(data =  df %>%
               tidyr::drop_na() %>%
               dplyr::filter(change != "stable") %>%
               dplyr::arrange(desc(-log10(padj))) %>%
               dplyr::slice(1:20),
             aes(x = log2FoldChange, y = -log10(padj),
                 # fill = log2FoldChange,
                 size = -log10(padj)),
             shape = 21, show.legend = F, color = "#000000") +
  geom_text_repel(data =  df %>% 
                    tidyr::drop_na() %>% 
                    dplyr::filter(change != "stable") %>%
                    dplyr::arrange(desc(-log10(padj))) %>%
                    dplyr::slice(1:15) %>%
                    dplyr::filter(change == "up"),
                  aes(x = log2FoldChange, y = -log10(padj), label = gene),
                  box.padding = 0.5,
                  nudge_x = 0.5,
                  nudge_y = 0.2,
                  segment.curvature = -0.1,
                  segment.ncp = 3,
                  # segment.angle = 10,
                  direction = "y", 
                  hjust = "left"
  ) + 
  geom_text_repel(data =  df %>% 
                    tidyr::drop_na() %>% 
                    dplyr::filter(change != "stable") %>%
                    dplyr::arrange(desc(-log10(padj))) %>%
                    dplyr::slice(1:15) %>%
                    dplyr::filter(change == "down"),
                  aes(x = log2FoldChange, y = -log10(padj), label = gene),
                  box.padding = 0.5,
                  nudge_x = -0.2,
                  nudge_y = 0.2,
                  segment.curvature = -0.1,
                  segment.ncp = 3,
                  segment.angle = 20,
                  direction = "y", 
                  hjust = "right"
  ) + 
  scale_color_gradientn(colours = c("#3288bd", "#66c2a5","#ffffbf", "#f46d43", "#9e0142"),
                        values = seq(0, 1, 0.2)) +
  scale_fill_gradientn(colours = c("#3288bd", "#66c2a5","#ffffbf", "#f46d43", "#9e0142"),
                       values = seq(0, 1, 0.2)) +
  geom_vline(xintercept = c(-log2(1.5), log2(1.5)), linetype = 2) +
  geom_hline(yintercept = -log10(0.05), linetype = 4) + 
  scale_size(range = c(1,7)) + 
  # ggtitle(label = "Volcano Plot",
  #         subtitle = "volcano plot") + 
  # xlim(c(-3, 3)) + 
  # ylim(c(-1, 90)) + 
  theme_bw() + 
  theme(panel.grid = element_blank(),
        legend.background = element_roundrect(color = "#808080", linetype = 1),
        axis.text = element_text(size = 13, color = "#000000"),
        axis.title = element_text(size = 15),
        plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)
  ) + 
  annotate(geom = "text", x = 2.5, y = 0.25, label = "p = 0.05", size = 5) + 
  coord_cartesian(clip = "off") + 
  annotation_custom(
    grob = grid::segmentsGrob(
      y0 = unit(-10, "pt"),
      y1 = unit(-10, "pt"),
      arrow = arrow(angle = 45, length = unit(.2, "cm"), ends = "first"),
      gp = grid::gpar(lwd = 3, col = "#74add1")
    ), 
    xmin = range(df$log2FoldChange)[1]/10*9, 
    xmax = range(df$log2FoldChange)[1]/10*4,
    ymin = range(-log10(df$padj))[2]/10*9.5,
    ymax = range(-log10(df$padj))[2]/10*9.5
  ) +
  annotation_custom(
    grob = grid::textGrob(
      label = "Down",
      gp = grid::gpar(col = "#74add1")
    ),
    xmin = range(df$log2FoldChange)[1]/10*9, 
    xmax = range(df$log2FoldChange)[1]/10*4,
    ymin = range(-log10(df$padj))[2]/10*9.5,
    ymax = range(-log10(df$padj))[2]/10*9.5
  ) +
  annotation_custom(
    grob = grid::segmentsGrob(
      y0 = unit(-10, "pt"),
      y1 = unit(-10, "pt"),
      arrow = arrow(angle = 45, length = unit(.2, "cm"), ends = "last"),
      gp = grid::gpar(lwd = 3, col = "#d73027")
    ), 
    xmin = range(df$log2FoldChange)[2]/10*9, 
    xmax = range(df$log2FoldChange)[2]/10*4,
    ymin = range(-log10(df$padj))[2]/10*9.5,
    ymax = range(-log10(df$padj))[2]/10*9.5
  ) +
  annotation_custom(
    grob = grid::textGrob(
      label = "Up",
      gp = grid::gpar(col = "#d73027")
    ),
    xmin = range(df$log2FoldChange)[2]/10*9, 
    xmax = range(df$log2FoldChange)[2]/10*4,
    ymin = range(-log10(df$padj))[2]/10*9.5,
    ymax = range(-log10(df$padj))[2]/10*9.5
  ) 

####----save result----####
ggsave('volcano2.png',dpi = 300,bg = 'white',width = 8,height = 7)

火山图绘制–形式三

效果如下

volcano3.png

相关代码

########## 渐变火山图3 ############ 
rm(list = ls())

library(ggplot2) #绘图使用
library(cowplot) #调整背景
library(ggrepel) #加标签

####----load data----####
df <- read.table('diff_DEseq2.xls', header = TRUE, sep = "\t",row.names = 1)
df$log10FDR <- -log10(df$padj)

#新加一列label
df$label = ""
#对差异基因的p值从小到大排序
df <- df[order(df$padj),]
#高表达的基因中,选择FDR值最小的10个
up.genes = head(df$gene[which(df$change == "up")],10)
##低表达的基因中,选择FDR值最小的10个
down.genes = head(df$gene[which(df$change == "down")],10)
#将高表达基因和低表达基因合并,加入到label中
deg.top10.genes <- c(as.character(up.genes),as.character(down.genes))
df$label[match(deg.top10.genes,df$gene)] <- deg.top10.genes

# 设置点的大小
max_size <- 4
min_size <- 1
df$Size <- sqrt(min_size + (max_size - min_size) * (df$log10FDR - min(df$log10FDR)) / (max(df$log10FDR) - min(df$log10FDR)))

##绘图
ggplot(df,aes(log2FoldChange, -log10(padj)))+
  # 横向水平参考线:
  geom_hline(yintercept = -log10(0.05), linetype = "dashed", color = "#999999")+
  # 纵向垂直参考线:
  geom_vline(xintercept = c(-1.2,1.2), linetype = "dashed", color = "#999999")+
  # 散点图:
  geom_point(aes(size=Size, color= -log10(padj)))+
  # 指定颜色渐变模式:
  scale_color_gradientn(values = seq(0,1,0.2),
                        colors = c("#39489f","#39bbec","#f9ed36","#f38466","#b81f25"))+
  # 指定散点大小渐变模式:
  scale_size_continuous(range = c(0.5,4))+
  # 主题调整:
  theme_bw()+
  # 调整主题和图例位置:
  theme(panel.grid = element_blank(),
        legend.position = c(0.01,0.8),
        legend.justification = c(0,1)
  )+
  # 设置部分图例不显示:
  guides(col = guide_colourbar(title = "-Log10_p-value"),
         size = "none")+
  # 添加标签:
  geom_text(aes(label=label, color = -log10(padj)), size = 3, vjust = 1.5, hjust=1)+
  # 修改坐标轴:
  xlab("Log2FC")+
  ylab("-Log10(FDR p-value)")

####----save result----####
ggsave('volcano3.png',dpi = 300,bg = 'white',width = 8,height = 7)

火山图绘制–形式四

效果如下

volcano4.png

相关代码

########## 火山图4 ############ 
rm(list = ls())
#相关R包载入:
library(ggplot2)
library(ggrepel)
library(dplyr)
library(patchwork)

# 横坐标A—组间表达量的平均强度:
# (log2(Mean_expA*Mean_expD))/2
# 纵坐标M—组间差异倍数取以2为底的对数值:
# log2FC

####----load data----####
df <- read.table('diff_DEseq2.xls', header = TRUE, sep = "\t",row.names = 1)

#新建横纵坐标列:
df$log2baseMean <- log2(df$baseMean)

#ggplot2绘图:
#自定义颜色:
mycol <- c("#EB4232","grey90","#2DB2EB")

#自定义主题:
mytheme <- theme_classic() +
  theme(plot.title = element_text(size = 17),
        axis.title = element_text(size = 15),
        axis.text = element_text(size = 14),
        legend.text = element_text(size = 14),
        plot.margin = margin(15,5.5,5.5,5.5))

#以显著上下调Top10为例:
up <- filter(df, change == 'up') %>% distinct(gene, .keep_all = T) %>%
  top_n(10, -log10(padj))

down <- filter(df, change == 'down') %>% distinct(gene, .keep_all = T) %>%
  top_n(10, -log10(padj))

sig <- rbind(up,down)

ggplot() +
  geom_point(data = df[df$change=='stable',],
             aes(x = log2baseMean, y = log2FoldChange, color = change)) +
  geom_point(data = df[df$change=='up',],
             aes(x = log2baseMean, y = log2FoldChange, color = change)) +
  geom_point(data = df[df$change=='down',],
             aes(x = log2baseMean, y = log2FoldChange, color = change)) +
  geom_point(data = sig,
             aes(x = log2baseMean, y = log2FoldChange, color = change),
             size = 3.5, alpha = 0.2) +
  geom_text_repel(data = sig,
                  aes(x = log2baseMean, y = log2FoldChange, label = gene),
                  seed = 233,
                  size = 3.5,
                  color = 'black',
                  min.segment.length = 0,
                  force = 2,
                  force_pull = 2,
                  box.padding = 0.1,
                  max.overlaps = Inf,
                  segment.linetype = 3, #线段类型,1为实线,2-6为不同类型虚线
                  segment.color = 'black', #线段颜色
                  segment.alpha = 0.5, #线段不透明度
                  nudge_x = 10 - sig$A, #标签x轴起始位置
                  direction = "y",
                  hjust = 0) + #0右对齐,1左对齐,0.5居中 
  scale_colour_manual(name = '', values = rev(alpha(mycol, 0.7))) +
  geom_hline(yintercept = 0, size = 0.5, color = "black", lty = 'dashed') +
  labs(title = 'MA_Plot') +
  mytheme
####----save result----####
ggsave('volcano4.png',dpi = 300,bg = 'white',width = 8,height = 7)

火山图绘制–形式五

效果如下

volcano5.png

相关代码

########## 双曲线火山图5 ############ 
rm(list = ls())
#相关R包载入:
library(dplyr)
library(ggplot2)
library(ggrepel)
library(patchwork)

####----load data----####
df <- read.table('diff_DEseq2.xls', header = TRUE, sep = "\t",row.names = 1)

##筛选阈值确定:p<0.05,|log2FC|>1
padj = 0.05
log2FC = 1

#根据反比例函数 y = 1/X和设定的阈值自定义双曲线函数:
f <- function(x){
  inputx <- seq(0.0001, x, by = 0.0001)
  y <- 1/(inputx) + (-log10(padj))
  dff <- rbind(data.frame(x = inputx + log2FC, y = y),
               data.frame(x = -(inputx + log2FC), y = y))
  return(dff)
}
#根据函数生成所需的曲线数组坐标:
dff_curve <- f(5)
head(dff_curve)

#新增曲线数值列:
##每列log2FoldChange值在曲线上对应的y轴坐标;
df$curve_y <- case_when(
  df$log2FoldChange > 0 ~ 1/(df$log2FoldChange-log2FC) + (-log10(padj)),
  df$log2FoldChange <= 0 ~ 1/(-df$log2FoldChange-log2FC) + (-log10(padj))
)
#根据曲线新增上下调分组标签:
#转换为因子指定绘图顺序;
df$`-log10(padj)` <- -log10(df$padj) #新增-log10p列
df$group2 <- case_when(
  df$`-log10(padj)` > df$curve_y & df$log2FoldChange >= log2FC ~ 'up',
  df$`-log10(padj)` > df$curve_y & df$log2FoldChange <= -log2FC ~ 'down',
  TRUE ~ 'none'
)
#绘制新双曲线阈值火山图:
df$group2 <- factor(df$group2, levels = c("up","down","none")) #指定顺序
mycol2 <- c("#F8B606","#4A1985","#d8d8d8")

#筛选显著性top10标签:
top10 <- filter(df, group2 != "none") %>%
  distinct(gene, .keep_all = T) %>%
  top_n(10, abs(log2FoldChange))

ggplot(data = df,
             aes(x = log2FoldChange, y = -log10(padj), color = group2)) + #使用新的分组
  geom_point(size = 2.2) +
  geom_text_repel(data = top10,
                  aes(x = log2FoldChange, y = -log10(padj), label = gene),
                  force = 80, color = 'black', size = 3.2,
                  point.padding = 0.5, hjust = 0.5,
                  arrow = arrow(length = unit(0.02, "npc"),
                                type = "open", ends = "last"),
                  segment.color="black",
                  segment.size = 0.3,
                  nudge_x = 0,
                  nudge_y = 1) + 
  # scale_x_continuous(limits = c(-4, 4), breaks = seq(-4, 4, by = 2)) +
  scale_y_continuous(expand = expansion(add = c(2, 0)),
                     limits = c(0, max(range(df$`-log10(padj)`))), 
                     breaks = seq(0,max(range(df$`-log10(padj)`)), by = 10)) +
  scale_colour_manual(name = "", values = alpha(mycol2, 0.7)) +
  geom_line(data = dff_curve,
            aes(x = x, y = y), #曲线坐标
            color = "black",lty = "dashed", size = 0.7) +
  theme_classic() +
  theme(
    axis.title = element_text(size = 15),
    axis.text = element_text(size = 14),
    legend.text = element_text(size = 14)
  )
####----save result----####
ggsave('volcano5.png',dpi = 300,bg = 'white',width = 8,height = 7)

火山图绘制–形式六

效果如下

Diagonal_volcano.png

相关代码

#### 对角火山图 #######
rm(list = ls())

library(ImageGP)
library(ggplot2)
library(ggpubr)
library(egg)
library(ggrepel) #加标签

diffexpr <- read.table('HG_data.txt',header = T,sep = '\t',check.names = F)
diffexpr$CG_mean <- log10(rowMeans(diffexpr[,c(2:4)])+1)
diffexpr$HG_mean <- log10(rowMeans(diffexpr[,c(5:7)])+1)

diffexpr$level <- ifelse(diffexpr$`p-value`<0.05, 
                         ifelse(diffexpr$`log2(Fold_change)`>=1, "high glucose", 
                                ifelse(diffexpr$`log2(Fold_change)`<=-1, "normal glucose", "NoSig")),"NoSig")
head(diffexpr)

##批量手动选择
diffexpr  <- diffexpr %>% mutate(label = ifelse(gene %in% c("Nr4a1"),gene,""))


p <- sp_scatterplot(diffexpr, xvariable = "HG_mean", yvariable = "CG_mean", 
                    color_variable = "level",
                    color_variable_order = c("NoSig","high glucose", "normal glucose"),
                    manual_color_vector = c("grey","firebrick","dodgerblue"),
                    legend.position = c(0.2,0.8)) + coord_fixed(1) + 
  labs(x = 'high glucose log10(mean normalized reads + 1)',
       y = 'normal glucose log10(mean normalized reads + 1)')+
  geom_label_repel(aes(label = label),show.legend = F, 
                   size = 3, box.padding = 2,max.overlaps = 10000)

xplot <- ggplot(diffexpr, aes(x=HG_mean)) + geom_histogram(fill="firebrick") +
  theme_classic() + 
  theme(axis.line.x=element_blank(), 
        axis.ticks.x=element_blank(), 
        axis.text.x = element_blank(), 
        axis.title.x = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank(),
        legend.title = element_blank(),
        legend.position = c(0.75,0.85),
        #legend.title = element_text(size = 5), 
        legend.text  = element_text(size = 8),
        legend.key.size = unit(0.5, "lines"),
        legend.spacing = unit(0.3, "cm"),
  ) + ylab("Density")

yplot <- ggplot(diffexpr, aes(x=CG_mean)) + geom_histogram(fill="dodgerblue") +
  theme_classic() +
  theme(axis.line.y=element_blank(),  
        axis.ticks.y=element_blank(), 
        axis.text.y = element_blank(), 
        axis.title.y=element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank(),
        legend.title = element_blank(),
        legend.position = c(0.7,0.8),
        #legend.title = element_text(size = 5), 
        legend.text  = element_text(size = 8),
        legend.key.size = unit(0.5, "lines"),
        legend.spacing = unit(0.3, "cm"),
  ) + ylab("Density") +
  rotate()

white <- ggplot() + theme_void()

pc <- egg::ggarrange(xplot, white, p, yplot, 
                     widths=c(5,2),heights = c(2,5),padding=unit(0,"line"))
ggsave('Diagonal_volcano.png',pc,dpi = 300,bg = 'white',width = 8,height = 7)

火山图绘制–形式七

效果如下

volcano6.png

相关代码

######## 多分组多条件 火山图
library(scRNAtoolVis)
rm(list = ls())

DEG1 <- read.table('PN-Normal_DEGs.xls',row.names = 1,header = T,sep = '\t')
DEG1$cluster <- 'PN-Normal'

DEG2 <- read.table('Psoriasis-Normal_DEGs.xls',row.names = 1,header = T,sep = '\t')
DEG2$cluster <- 'Psoriasis-Normal'

DEG3 <- read.table('Psoriasis-PN_DEGs.xls',row.names = 1,header = T,sep = '\t')
DEG3$cluster <- 'Psoriasis-PN'

# rbind
markers <- rbind(DEG1,DEG2,DEG3)
colnames(markers)[1] <- 'avg_log2FC'
colnames(markers)[4] <- 'p_val'
colnames(markers)[5] <- 'p_val_adj'

library(paletteer) 
col <- paletteer_d("khroma::light")

# change aes color type
jjVolcano(diffData = markers,
          log2FC.cutoff = 0.5,
          tile.col = col[3:5],
          pSize = 2,
          #col.type = "adjustP",
          size  = 3,
          fontface = 'italic',
          legend.position = c(0.1,0.9),
          topGeneN = 5)
ggsave('volcano6.png',dpi = 300,bg = 'white',width = 8,height = 7)

火山图绘制–形式八

效果如下

volcano7.png

相关代码

######### 自定义函数 ######### 
color.pals = c("#DC143C","#0000FF","#20B2AA","#FFA500","#9370DB","#98FB98","#F08080","#1E90FF","#7CFC00","#FFFF00","#808000","#FF00FF","#FA8072","#7B68EE","#9400D3","#800080","#A0522D","#D2B48C","#D2691E","#87CEEB","#40E0D0","#5F9EA0","#FF1493","#0000CD","#008B8B","#FFE4B5","#8A2BE2","#228B22","#E9967A","#4682B4","#32CD32","#F0E68C","#FFFFE0","#EE82EE","#FF6347","#6A5ACD","#9932CC","#8B008B","#8B4513","#DEB887")


#
#' multi volcano plot for scRNA-seq
#' @version 0.2 change legend order
#' @version 0.3 add max_overlaps for annotation
#'
#' @param dat Seurat FindAllMarkers returns, must set only.pos = F;
#' @param color.arr color list, default same as Seurat
#' @param onlyAnnotateUp only annote gene symbols for up genes
#' @param log2Foldchang threshold for annotation
#' @param adjp  threshold for annotation
#' @param top_marker gene number for annotation
#' @param max_overlaps annotation label overlapping
#'
#' @return ggplot2 obj
#' @export
#'
#' @examples
multiVolcanoPlot = function(dat, color.arr=NULL, onlyAnnotateUp=T,
                            log2Foldchang=0.58, adjp=0.05, top_marker=5, 
                            max_overlaps=10, width=0.9){
  library(dplyr)
  library(ggrepel)
  # set default color list
  if(is.null(color.arr)){
    len = length(unique(dat$cluster))
    color.arr=scales::hue_pal()(len)
  }
  
  dat.plot <- dat %>% mutate(
    "significance"=case_when(p_val_adj < adjp & avg_log2FC >= log2Foldchang  ~ 'Up',
                             p_val_adj < adjp & avg_log2FC <= -log2Foldchang  ~ 'Down',
                             TRUE ~ 'None'))
  tbl = table(dat.plot$significance)
  print( tbl )
  background.dat <- data.frame(
    dat.plot %>% group_by(cluster) %>% filter(avg_log2FC>0) %>%
      summarise("y.localup"=max(avg_log2FC)),
    dat.plot %>% group_by(cluster) %>% filter(avg_log2FC<=0) %>%
      summarise("y.localdown"=min(avg_log2FC)),
    x.local=seq(1:length(unique(dat.plot$cluster)))
  ) %>% select(-cluster.1)
  #names(background.dat)
  #head(background.dat)
  #dim(background.dat)
  
  #
  x.number <- background.dat %>% select(cluster, x.local)
  dat.plot <- dat.plot%>% left_join(x.number,by = "cluster")
  #names(dat.plot)
  #head(dat.plot)
  
  #selecting top-up and top-down proteins
  dat.marked.up <- dat.plot %>% filter(significance=="Up") %>%
    group_by(cluster) %>% arrange(-avg_log2FC) %>%
    top_n(top_marker,abs(avg_log2FC))
  dat.marked.down <- dat.plot %>% filter(significance=="Down") %>%
    group_by(cluster) %>% arrange(avg_log2FC) %>%
    top_n(top_marker,abs(avg_log2FC))
  dat.marked <- dat.marked.up %>% bind_rows(dat.marked.down)
  #referring group information data
  dat.infor <- background.dat %>%
    mutate("y.infor"=rep(0,length(cluster)))
  #names(dat.infor)
  #dim(dat.infor)
  #head(dat.infor)
  
  ##plotting:
  #setting color by loading local color schemes
  vol.plot <- ggplot()+
    # background
    geom_col(background.dat,mapping=aes(x.local, y.localup),
             fill="grey80", alpha=0.2, width=0.9, just = 0.5)+
    geom_col(background.dat,mapping=aes(x.local,y.localdown),
             fill="grey80", alpha=0.2, width=0.9, just = 0.5)+
    # point plot
    geom_jitter(dat.plot, mapping=aes(x.local, avg_log2FC, #x= should be number, Not string or factor
                                      color=significance),
                size=0.8, width = 0.4, alpha= 1)+
    scale_color_manual(name="significance", 
                       breaks = c('Up', 'None', 'Down'),
                       values = c("#d56e5e","#cccccc", "#5390b5")) + #set color for: Down None   Up
    geom_tile(dat.infor, mapping=aes(x.local, y.infor), #x axis color box
              height = log2Foldchang*1.3,
              fill = color.arr[1:length(unique(dat.plot$cluster))],
              alpha = 0.5,
              width=width) +
    labs(x=NULL,y="log2 Fold change")+
    geom_text(dat.infor, mapping=aes(x.local,y.infor,label=cluster))+
    # Down is not recommend, not meaningful, hard to explain; so prefer dat.marked.up to dat.marked
    ggrepel::geom_label_repel(data=if(onlyAnnotateUp) dat.marked.up else dat.marked, #gene symbol, of up group default
                              mapping=aes(x=x.local, y=avg_log2FC, label=gene),
                              force = 2, #size=2,
                              max.overlaps = max_overlaps,
                              label.size = 0, #no border
                              fill="#00000000", #box fill color
                              seed = 233,
                              min.segment.length = 0,
                              force_pull = 2,
                              box.padding = 0.1,
                              segment.linetype = 3,
                              #segment.color = 'black',
                              #segment.alpha = 0.5,
                              #direction = "x", #line direction
                              hjust = 0.5)+
    annotate("text", x=1.5, y=max(background.dat$y.localup)+1,
             label=paste0("|log2FC|>=", log2Foldchang, " & FDR<", adjp))+
    theme_classic(base_size = 12)+
    
    theme(
      axis.title = element_text(size = 13, color = "black"),
      axis.text = element_text(size = 15, color = "black"),
      axis.line.y = element_line(color = "black", size = 0.8),
      #
      axis.line.x = element_blank(), #no x axis line
      axis.ticks.x = element_blank(), #no x axis ticks
      axis.title.x = element_blank(), #
      axis.text.x = element_blank(),
      #
      legend.spacing.x = unit(0.1,'cm'),
      legend.key.width = unit(0.5,'cm'),
      legend.key.height = unit(0.5,'cm'),
      legend.background = element_blank(),
      legend.box = "horizontal",
      legend.position = c(0.13, 0.77),legend.justification = c(1,0)
    )+
    guides( #color = guide_legend( override.aes = list(size=5) ), #legend circle size
      color=guide_legend( override.aes = list(size=5), title="Change")
    )
  #guides(fill=guide_legend(title="Change"))+ #change legend title
  vol.plot
}

## 调用自定义函数绘图
multiVolcanoPlot(markers,log2Foldchang = 0.5,adjp = 0.05,color.arr = col)
# multiVolcanoPlot(scObj.markers.time, onlyAnnotateUp = F)
ggsave('volcano7.png',dpi = 300,bg = 'white',width = 8,height = 7)

最后,如果项目和教程对你有所帮助或者你看见了还算比较喜欢,欢迎给我star,谢谢您!


 本篇
文献美图汇总--火山图 文献美图汇总--火山图
火山图是数据可视化中最重要的一种展示形式之一,本篇blog拟汇总当前最流行最美观一些火山图绘制方法。同时也给自己开一个新坑,就是(争取)每日都更新一种图形绘制形式,方便以后自己快速查询相关的绘图代码,也便于大家相互学习。
下一篇 
学习Git使用 学习Git使用
Git是目前世界上最先进的分布式版本控制系统,这篇blog将系统介绍它的一些常用命令,方便自己以后的翻阅以及查询。
  目录