本文首发于“生信补给站”公众号 https://mp.weixin.qq.com/s/dgsAjDnLOtzgejzzr4RcFw
umap/tsne图作为单细胞转录组的王牌图形之一,当seurat 或者 singleR 直接绘制的umap/tsne 图需要调整的时候,可能比较难调整,当然AI或者PS都可以办到 。但是本次主要分享使用ggplot2进行可视化,能比较方便的进行后期的微调 ,也学习回顾了ggplot2的基本参数。
文末有代码和数据的获取方式。
一 加载数据 R包
读取singleR注释后的数据作为示例数据
# library(SingleR) library(Seurat) library(tidyverse) library(ggrepel) #pbmc_tutorial_singleR.RData load("pbmc_tutorial_singleR.RData") #简单的查看 pbmc #An object of class Seurat #13714 features across 2638 samples within 1 assay #Active assay: RNA (13714 features, 2000 variable features) # 3 dimensional reductions calculated: pca, umap, tsne seurat 包中`DimPlot`函数一行代码绘制umap图 DimPlot(pbmc, group.by = c("labels"),reduction = "umap")
二 ggplot2绘制umap图
2.1 查看绘制umap的数据
可以先str(pbmc),然后找需要的数据 。
umap图所需的数据就是每个cell的坐标以及cluster或者celltype信息,然后绘制点图 umap = pbmc@reductions$umap@cell.embeddings %>% #坐标信息 as.data.frame() %>% cbind(cell_type = pbmc@meta.data$labels) # 注释后的label信息 ,改为cell_type head(umap) UMAP_1 UMAP_2 cell_type AAACATACAACCAC-1 -4.577857 1.650203 T_cells AAACATTGAGCTAC-1 -2.813911 -11.897462 B_cell AAACATTGATCAGC-1 -1.684490 3.302480 T_cells AAACCGTGCTTCCG-1 12.694498 2.098798 Monocyte AAACCGTGTATGCG-1 -9.829201 3.982013 NK_cell AAACGCACTGGTAC-1 -2.908319 1.249230 T_cells
2.2 ggplot2 绘制umap图
调整color,颜色列表来自于https://www.jianshu.com/p/67d2decf5517
allcolour=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") p <- ggplot(umap,aes(x= UMAP_1 , y = UMAP_2 ,color = cell_type)) + geom_point(size = 1 , alpha =1 ) + scale_color_manual(values = allcolour) p
看一下和文章SCI 截图的差别在哪?
嗯?好像差不多嘛 ,无非就是
A:主题部分(去掉背景,去掉网格线,去掉横纵坐标) ;
B:legend部分(调整legend ,去掉背景灰色,调整字体)
C:注释部分(坐标轴标到左下角,图中标示标签)三部分。
知道该调整哪些了,调整就一步步来就是了。
三 ggplot2-umap-调整
3.1 调整umap图 - theme
主题的调整比较简单,去掉网格线,坐标轴和背景色即可
p2 <- p + theme(panel.grid.major = element_blank(), #主网格线 panel.grid.minor = element_blank(), #次网格线 panel.border = element_blank(), #边框 axis.title = element_blank(), #轴标题 axis.text = element_blank(), # 文本 axis.ticks = element_blank(), panel.background = element_rect(fill = 'white'), #背景色 plot.background=element_rect(fill="white")) p2
更多theme的设置详见ggplot2|theme主题设置,详解绘图优化-“精雕细琢”
3.2 调整umap图 - legend
legeng部分去掉legend.title后,调整标签大小,标签点的大小以及 标签之间的距离
p3 <- p2 + theme( legend.title = element_blank(), #去掉legend.title legend.key=element_rect(fill='white'), # legend.text = element_text(size=20), #设置legend标签的大小 legend.key.size=unit(1,'cm') ) + # 设置legend标签之间的大小 guides(color = guide_legend(override.aes = list(size=5))) #设置legend中 点的大小 p3
更多legend设置详见ggplot2 |legend参数设置,图形精雕细琢
3.3 调整umap图 - annotation
坐标轴放到左下角可以通过ggplot2添加箭头和文本实现。
p4 <- p3 + geom_segment(aes(x = min(umap$UMAP_1) , y = min(umap$UMAP_2) , xend = min(umap$UMAP_1) +3, yend = min(umap$UMAP_2) ), colour = "black", size=1,arrow = arrow(length = unit(0.3,"cm")))+ geom_segment(aes(x = min(umap$UMAP_1) , y = min(umap$UMAP_2) , xend = min(umap$UMAP_1) , yend = min(umap$UMAP_2) + 3), colour = "black", size=1,arrow = arrow(length = unit(0.3,"cm"))) + annotate("text", x = min(umap$UMAP_1) +1.5, y = min(umap$UMAP_2) -1, label = "UMAP_1", color="black",size = 3, fontface="bold" ) + annotate("text", x = min(umap$UMAP_1) -1, y = min(umap$UMAP_2) + 1.5, label = "UMAP_2", color="black",size = 3, fontface="bold" ,angle=90) p4
那如果想把注释加到点之上怎么办呢?
(1)直接使用label 添加,需要先给每个cluster一个单独的坐标,本示例中使用此方法。
(2)text 根据cluster的位置,手动添加,需要尝试,倒是效果会好一些。
更多注释详见ggplot2-annotation|画图点“精”,让图自己“解释”
3.4 调整umap图 - repel - labels
1)计算每个cluster的median 坐标位置
cell_type_med <- umap %>% group_by(cell_type) %>% summarise( UMAP_1 = median(UMAP_1), UMAP_2 = median(UMAP_2) )
2)geom_label_repel 添加注释
使用ggrepel包的repel函数可以使注释的标签不重叠。
library(ggrepel) p4 + geom_label_repel(aes(label=cell_type), fontface="bold",data = cell_type_med, point.padding=unit(0.5, "lines"))
3)去掉legend
p4 + geom_label_repel(aes(label=cell_type), fontface="bold",data = cell_type_med, point.padding=unit(0.5, "lines")) + theme(legend.position = "none")
OK ,以上就是使用ggplot2绘制umap图并进行调整的过程,这样就可以根据需求进行调整了。