前情提要

上期的推文VlnPlot结果及常用参数浅析整理介绍了一下小提琴图可视化marker基因,在结尾简单介绍了一下可用于美化可视化结果的参数。

这期我们就一起来使用一下这些参数,绘制更好看的小提琴图叭!

分析数据简介

因为分析中需要用到分组信息,而pbmc3k的数据集是单个样品,没有包含分组信息。所以这期的示例数据换为ifnb.SeuratData的数据集

ifnb.SeuratData数据降维聚类分群的内容见推文——ifnb数据集分析及注释对比

最后的手动分群情况

获取top3的Marker基因:

markers <- FindAllMarkers(sce.all.int, only.pos = TRUE, min.pct = 0.25,  logfc.threshold = 0.25, verbose = FALSE)

top3 = markers %>% group_by(cluster) %>% top_n(n = 3, wt = avg_log2FC)
g2 = unique(top3$gene)

基于VlnPlot参数美化小提琴图

1. 直接可视化

VlnPlot(sce.all.int, features = g2[1:6])

如果直接使用VlnPlot可视化,不设置参数,会得到每个基因单独展示的结果,不太易读

如果想将marker一起展示,就需要使用stack参数绘制堆叠小提琴图

2. 堆叠小提琴图

#使用paletteer包来调用awtools包中的调色板函数
library(paletteer)

color <- c(paletteer_d("awtools::bpalette"),
           paletteer_d("awtools::a_palette"),
           paletteer_d("awtools::mpalette"))

#stack=T绘制堆叠小提琴图
p1 <- VlnPlot(sce.all.int,features=g2,
              group.by="celltype",
              stack=T,cols=color
)

#去掉标签注释
p1+NoLegend()

可以使用flip参数进行翻转,使得结果更加易读

p1 <- VlnPlot(sce.all.int,features=g2,
              group.by="celltype",
              flip=T,stack=T,cols=color
)

p1+NoLegend()

3. 分组小提琴图

分组小提琴图是一种用于展示不同组别中数据分布情况的可视化图表,当有两个组别时可以很好的展示基因在两个组间的差异

使用split.by参数可选择按照某一分组变量(这里是 ‘stim’)来分割数据

p2 <- VlnPlot(sce.all.int, g2, stack = TRUE,
              split.by = 'stim',flip=T, add.noise = T,
              cols = c("#78C2C4","#C73E3A"),) ;p2

从图中可以看到pDC相关基因主要在STIM组高表达,有些基因仅在STIM或者只在CTRL组表达

4. 分组分半小提琴图

也可以在同一个图形中绘制多个分组的分布,可以直观地比较不同组之间的数据分布情况,以便进行统计分析和推断。

使用split.plot = T生成每个分组的单独小提琴图

p<-VlnPlot(sce.all.int, features = g2,stack=T,
           pt.size=0,flip = T,add.noise = T,
           split.by = 'stim',
           group.by = "celltype",
           cols = c("#78C2C4","#C73E3A"),
           split.plot = T)

将分组以及分组且分半小提琴图拼图,可以更加直观的看到两个分组之间基因表达的差异

使用ggplot2进行美化

因为VlnPlot是一个ggplot的对象,所以可以基于ggplot2进行美化。或者提取需要的数据,使用ggplot2直接绘制小提琴图

1. 美化VlnPlot结果

可以基于ggplot2的theme函数去调整坐标轴,设置文本颜色和大小、添加边框、调整间距等

p1 + theme_bw()+
  theme(
    axis.text.x.bottom = element_text(angle = 45,hjust = 1,vjust = 1),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    legend.position = "none",
    axis.text.x = element_text(color = 'black',size = 11),
    axis.text.y = element_blank(),
    axis.title.x = element_text(color = 'black', size = 15),
    axis.ticks.x = element_line(color = 'black'),
    axis.ticks.y = element_blank(),
  )
  • 旋转并对齐 x 轴标签,设置其样式;
  • 取消 x 轴的次要网格线与 y 轴的刻度标签;
  • 隐藏图例;
  • 设置 x 轴标题和刻度线的颜色和大小;
  • 完全取消 y 轴的刻度和网格线,以简化图形展示。

p1+theme_minimal()+
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        axis.text.y = element_blank(),
        axis.title = element_text(size = 12),
        legend.position = 'none')+
  scale_fill_manual(values = color)+
  labs(title = 'Top 3 markers for each cluster',
       x = 'Cluster',
       y = 'Expression')

通过theme_minimal()theme()函数对图形的样式进行美化:

  • 将 x 轴标签旋转 45 度并右对齐;
  • 隐藏 y 轴的刻度标签;
  • 设定轴标题的字体大小;
  • 移除图例;
  • 自定义填充颜色;
  • 添加标题和轴标签。

2. 提取数据使用ggplot2进行美化

小谢私认为基于ggplot2的theme函数美化VlnPlot结果已经比较好看了,但由于是VlnPlot结果的框架下,可能还是会有些限制

如果需要高度定制化小提琴的图的结果,也可以提取需要的数据,使用ggplot2从绘图到美化

之前的前辈们已经整理好了提取数据进行可视化的方法:

小结

这期使用VlnPlot函数的相关参数,绘制堆叠小提琴图,以及对小提琴图进行了分组分半的展示

基于ggplot2在VlnPlot结果的基础上进行调整,如果想提取需要的数据,使用ggplot2从绘图到美化,可以参考前辈们整理的推文!