前一期:
今天给大家复现上次提到的Nature文章中对单细胞不同亚群的特征基因进行展示的气泡图。
原图如下:
image-20240322182254814
此图主要涉及的点有:多亚群同时展示,配色雅致,气泡图中基因标签右对齐且不重叠
此图展示的是在monkey spinal cords中三种不同的胶质细胞的特征基因,数据在文章的附表Supplementary Table 4。
下载链接:https://static-content.springer.com/esm/art%3A10.1038%2Fs41586-023-06783-1/MediaObjects/41586_2023_6783_MOESM3_ESM.xlsx
此数据就是我们做单细胞分析时,FindAllMarkers() 函数的分析结果:
library(tidyverse)
library(ggplot2)
# skip=1跳过第一行描述行
data <- readxl::read_xlsx("41586_2023_6783_MOESM3_ESM.xlsx", sheet = "Supplementary Table 4", skip = 1)
head(data)
# A tibble: 6 × 7
p_val avg_logFC pct.1 pct.2 p_val_adj cluster gene
<dbl> <dbl> <dbl> <dbl> <dbl> <chr> <chr>
1 8.90e-67 0.524 0.578 0.412 1.70e-62 Microglia1 VAV3
2 6.78e-27 0.610 0.132 0.053 1.30e-22 Microglia1 CX3CR1
3 1.43e-19 0.538 0.101 0.042 2.74e-15 Microglia1 MRC1
4 0 2.40 0.93 0.337 0 Microglia2 SPP1
5 0 2.21 0.201 0.014 0 Microglia2 ENSMFAG00000000159
6 0 1.44 0.627 0.21 0 Microglia2 CD83
此图的横坐标为一个Rank指标,使用p_val_adj从小到大对每个CLuster的基因进行的一个排序序号;
纵坐标为log10(p_val_adj)
df <- data %>%
arrange(cluster, p_val_adj)
# 横坐标
df$Rank <- c(1:table(data$cluster)["Microglia1"],
1:table(data$cluster)["Microglia2"],
1:table(data$cluster)["Microglia3"])
# 纵坐标,对于太大的padj值,做了一下处理
df$logPadj = -log10(df$p_val_adj)
df[df$logPadj>200,]$logPadj = 200
head(df)
# A tibble: 6 × 8
p_val avg_logFC pct.1 pct.2 p_val_adj cluster gene logPadj
<dbl> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <dbl>
1 8.90e-67 0.524 0.578 0.412 1.70e-62 Microglia1 VAV3 61.8
2 6.78e-27 0.610 0.132 0.053 1.30e-22 Microglia1 CX3CR1 21.9
3 1.43e-19 0.538 0.101 0.042 2.74e-15 Microglia1 MRC1 14.6
4 0 2.40 0.93 0.337 0 Microglia2 SPP1 200
5 0 2.21 0.201 0.014 0 Microglia2 ENSMFAG00000000159 200
6 0 1.44 0.627 0.21 0 Microglia2 CD83 200
文章可能选取了p_val_adj值从小到大的top15中的一些基因,按照生物学意义挑选进行展示。
## 得到标记的top 15基因
data.label <- df %>% group_by(cluster) %>% top_n(n=15,wt = -Rank)
data.label <- data.label[!grepl(pattern = "ENS",data.label$gene), ]
接下来还需要稍微调整:
nudge_x:“标签”到“点”的水平距离,想要标签右对齐,需要为标签指定同样的横坐标,本文为100减去“点”的横坐标值
文字右对齐:hjust参数也很重要,“0”表示文字左对齐,“0.5”表示文字居中,“1”表示文字右对齐。
加上阴影:geom_stripped_cols,这里的阴影三个分面都是一样的区域,目前没有找到一个好办法可以不同分面加不同区域的阴影。美中不足啊~
p <- ggplot(df, aes(x=Rank, y=logPadj, color=cluster)) +
geom_point(alpha=0.8, shape=16, size=2) +
scale_x_continuous(breaks = c(0,50,100)) +
ggrepel::geom_text_repel(inherit.aes = T,
data = data.label,
aes(x=Rank, y=logPadj, label=gene),
size=3,
segment.color = "grey50", #文本标签与点之间连线的颜色
box.padding = 0.1,
force = 1, # 重叠文本标签之间的排斥力
nudge_x = 100-data.label$Rank, # 标签在x轴上的起始位置,与x轴的数据单位相同
direction = "y", # 排列方向
hjust= 1) + # 添加标签右对齐
facet_wrap(~cluster, nrow=1) + # 分面
scale_color_manual(values=c('#b7b7b7', '#6bb9d2', '#d55640')) +
theme(panel.grid = element_blank(), panel.background = element_blank(),
axis.line = element_line(color='black'),
axis.ticks = element_line(color='black'),
legend.position = 'none',
axis.text = element_text(color='black'),
plot.title = element_text(hjust=0.5)) +
ggtitle(label = "Marker genes for microglia states")
## 不同分面添加阴影
p1 <- p +
geom_stripped_cols(width = 60, nudge_x = 80, color=NA, even ="grey50", alpha = .05, yfrom = 5, yto = 208)
p1
ggsave(filename = "test.png", width = 5.5, height = 4, plot = p1, bg="white")
结果如下:
image-20240322213728156
简直是Perfect!!!
文献信息如下:
https://www.nature.com/articles/s41586-023-06783-1
CHIT1-positive microglia drive motor neuron ageing in the primate spinal cord
Nature. 2023 Dec;624(7992):611-620. doi: 10.1038/s41586-023-06783-1. Epub 2023 Oct 31
下期见~