1、获取Seurat::DotPlot() 绘图数据
pacman::p_load(Seurat,dplyr,ggplot2)
sc <- pbmc_small
data.usage <- DotPlot(sc,features = VariableFeatures(sc)[1:10])$data
> data.usage
avg.exp pct.exp features.plot id avg.exp.scaled
Htr2c 6.387599e-02 0.88218224 Htr2c 0 -0.241662933
St6gal1 1.504964e-02 0.21474173 St6gal1 0 -0.523974858
AC121788.1 4.451450e-02 0.64422519 AC121788.1 0 -0.310429629
Gm28928 4.653460e-03 0.05803831 Gm28928 0 -0.215970623
2、创建x轴分类标签注释
data.anno <- data.frame(
features.plot = unique(data.usage$features.plot),
label = c("Cell.A","Cell.A","Cell.B","Cell.C","Cell.C","Cell.D","Cell.E","Cell.F","Cell.G","Cell.H")
)
> data.anno
features.plot label
1 Htr2c Cell.A
2 St6gal1 Cell.A
3 AC121788.1 Cell.B
4 Gm28928 Cell.C
3、将注释添加到data.usage方便绘图调用
df.plot <- plyr::join(data.usage,data.anno)
4、重排y轴绘图顺序
df.plot$id <- factor(df.plot$id,levels = sort(levels(df.plot$id),decreasing = T) )
> df.plot$id
[1] 0 0 0 0...
Levels: 9 8 7 6 5 4 3 21 20 2 19 18 17 16 15 14 13 12 11 10 1 0 #自定义的绘图标签顺序
5、重绘气泡图并基于facet
分面方法为x轴添加注释标签
p <- ggplot(df.plot,aes(x=features.plot,y = as.numeric(id),size = pct.exp, color = avg.exp.scaled))+
geom_point() +
scale_size("% detected", range = c(0,10)) + #调整绘图点的相对大小
scale_color_gradientn(colours = viridis::viridis(20),
guide = guide_colorbar(ticks.colour = "black",frame.colour = "black"),
name = "Average\nexpression") +
cowplot::theme_cowplot() +
ylab("") + xlab("Markers") + theme_bw() +
scale_y_continuous(breaks = 1:length(levels(df.plot$id)),labels = levels(df.plot$id),sec.axis = dup_axis())+ #复制 y轴 代替边框效果
facet_grid(~label, scales="free_x",space = "free")+theme_classic() +
theme(
axis.text.x = element_text(size=12, angle=0, hjust=0.5, color="black",face="bold"),#x轴标签样式
axis.text.y = element_text(size=12, color="skyblue",face="bold"),
axis.title.x = element_text(size=14,colour = 'black',vjust = -0.8,hjust = 0.5),#坐标轴标题
axis.ticks.y = element_blank(),#坐标轴刻度
axis.text.y.right = element_blank(),#坐标轴标签隐藏
axis.ticks.x = element_blank(),
axis.line = element_line(colour = 'grey30',size = 0.2), #坐标轴轴线样式
panel.spacing=unit(0, "mm"), #分面图图块间距
strip.text.x = element_text(size=15, face="bold",color = "#FFFFFF",
vjust = 0.5,margin = margin(b = 3,t=3)),#分面标签样式
strip.background = element_rect(colour="grey30", fill="grey60",size = 1)
)
6、分面标签上色
g <- ggplot_gtable(ggplot_build(p))
strips <- which(grepl('strip-', g$layout$name))
cols <- BuenColors::jdb_color_maps[1:length(unique(df.plot$label))] %>% as.vector()
for (i in seq_along(strips)) {
k <- which(grepl('rect', g$grobs[[strips[i]]]$grobs[[1]]$childrenOrder))
l <- which(grepl('titleGrob', g$grobs[[strips[i]]]$grobs[[1]]$childrenOrder))
g$grobs[[strips[i]]]$grobs[[1]]$children[[k]]$gp$fill <- cols[i]
}
plot(g)
最后再分享一个添加层次聚类树的绘图脚本,在我的GitHub。
Reference
r - ggplot2 outside panel border when using facet - Stack Overflow