火山图绘制–形式一
效果如下
相关代码:
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)
火山图绘制–形式二
效果如下
相关代码
########## 普通火山图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)
火山图绘制–形式三
效果如下
相关代码
########## 渐变火山图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)
火山图绘制–形式四
效果如下
相关代码
########## 火山图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)
火山图绘制–形式五
效果如下
相关代码
########## 双曲线火山图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)
火山图绘制–形式六
效果如下
相关代码
#### 对角火山图 #######
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)
火山图绘制–形式七
效果如下
相关代码
######## 多分组多条件 火山图
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)
火山图绘制–形式八
效果如下
相关代码
######### 自定义函数 #########
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
,谢谢您!