Seurat绘制细胞的marker DotPlot时,如果细胞名称过长或者相应细胞的marker gene太少则可能会导致细胞名称显示不全,看如下实例,以Seurat自带的pbmc_small数据集为例,寻找其差异表达gene作为绘制Dotplot的marker gene。
library(Seurat)
library(tidyverse)
all_markers <-
pbmc_small %>%
FindAllMarkers(group.by="RNA_snn_res.0.8")
marker_gene <-
all_markers %>%
group_by(cluster)%>%
dplyr::filter(
p_val <0.05,
pct.1- pct.2>0.2
)%>%
slice_max(avg_log2FC, n =5)%>%
dplyr::select(cluster, gene)%>%
deframe()
marker_gene
# 0 0 0 0 0 1 1 1 1 1
# "GZMM" "GNLY" "PRF1" "GZMA" "CTSW" "S100A8" "CD14" "S100A9" "FPR1" "ASGR1"
根据差异基因的类别,指定0是cytotoxic T lymphocyte,1是myeloid cells,并绘制DotPlot:
names(marker_gene)<-
marker_gene %>%
names()%>%
fct_recode(
"cytotoxic T lymphocyte"='0',
"myeloid cells"='1'
)
p <-
DotPlot(
pbmc_small,
group.by="RNA_snn_res.0.8",
features = marker_gene
)
p
理论上讲,这个图调宽是可以避开显示不全的问题的,但是实际场景中,这个图不可能无限加宽,不然比例失调。本例中每个细胞是5个marker基因,但是实际绘图是有可能只展示一个marker基因的,这个时候遮挡几乎是必然发生的事情,而肆意加宽图片往往都是很受限制的行为。
为了模拟效果,这里设置了一个较为窄的宽度,可以看到cell label的折叠状态:
可以发现上图有两个问题:x轴文字遮挡和上面的细胞label遮挡。x轴遮挡好解决,只需要加上Seurat的RotatedAxis即可。
p2 <- p +RotatedAxis()
p2
如果需要修改cell label遮挡的问题,可以使用ggtext包的element_markdown格式,它可以渲染markdown语法和部分html标记。因此可以选择在特定位置将字符替换为html的换行符即可。
有两个策略,直接修改marker_gene的名称,重新绘图,这个操作比较简单,不再赘述。第二方法是可以修改DotPlot返回的ggplot对象的data slot,如下所示:
p3 <- p2
p3$data$feature.groups <-
p3$data$feature.groups %>%
str_wrap(width =20)%>%
str_replace_all("\\n","<br/>")
p3 <- p3 +
theme(
strip.text = ggtext::element_textbox_simple(halign =0.5),
)
p3
str_wrap函数可以定义在多少字符的位置换行,而且str_wrap还可以只在空格位置换行,上述代码是选择第20位字符附近的空格处换行,由于str_wrap是补充了一个换行符,因此str_replace_all再将其转换为html换行符br即可,效果如下: