2023-11-28-直播单细胞图表美化-seurat数据结构 featureplot dotplot vlnplot

单细胞常见的可视化方式有DimPlot,FeaturePlot ,DotPlot ,VlnPlot 和 DoHeatmap几种 ,Seurat中均可以很简单的实现,但是文献中的图大多会精美很多。

之前 跟SCI学umap图| ggplot2 绘制umap图,坐标位置 ,颜色 ,大小还不是你说了算 介绍过DimPlot的一些调整方法。

本文介绍FeaturePlot的美化方式,包含以下几个方面 :

(1)调整点的颜色 ,大小

(2)展示基因共表达情况(点图,密度图

(3)优化Seurat分组展示

(4)ggplot2修改theme ,lengend等

(5)批量绘制

一 载入R包,数据

仍然使用之前注释过的sce.anno.RData数据 ,后台回复 anno 即可获取

library(Seurat)
library(tidyverse)
library(scCustomize) # 需要Seurat版本4.3.0
library(viridis)
library(RColorBrewer)
library(gridExtra)load("sce.anno.RData")
head(sce2,2)

这里额外安装scCustomize包,该R包对上面提到的Seurat 常用绘图函数进行了一些优化,但是需要Seurat版本4.3.0 以上

二 FeaturePlot 相关

1,调整FeaturePlot颜色,大小

(1)Seurat 修改

有以下几种方式,可以使用FeaturePlot 内置的cols参数进行修改(p2 , p3),也可以使用ggplot2的方式 添加scale 进行修改(p4)

p1 <- FeaturePlot(object = sce2, features = "CD3D") p2 <- FeaturePlot(sce2, "CD3D", cols = c("#F0F921FF", "#7301A8FF"))p3 <- FeaturePlot(sce2, "CD3D", cols = brewer.pal(10, name = "RdBu"))p4 <- FeaturePlot(object = sce2, features = "CD3D") + scale_colour_gradientn(colours = rev(brewer.pal(n = 10, name = "RdBu")))

注意左下p3 ,legend是有问题的,会随col参数中brewer.pal(10, name = "RdBu")中的10的数值而变动。

修改大小的话很简单,直接调整 pt.size = 1 即可,此处不做演示。

(2)scCustomize 修改

p11 <- FeaturePlot_scCustom(seurat_object = sce2, features = "CD3D")p22 <- FeaturePlot_scCustom(seurat_object = sce2, features = "CD3D", colors_use = brewer.pal(11, name = "RdBu"),order = T)p11 + p22

这里cols参数是没有问题的。

2 ,多基因共“表达”

单个基因就按照上面的方法直接绘制即可,如果想同时显示2个基因呢?

(1)Seurat 中提供了 blend = TRUE 函数,来可视化两个基因的共表达情况

FeaturePlot(sce2, features = c("MS4A1", "CD79A"), blend = TRUE)

注意blend = TRUE函数只能适用于2个基因,多个基因会报错 。

如果想实现多个基因的话,将目标基因和UMAP 的坐标提取出来使用ggplot2绘制即可 或者 使用scCustomize 包中的多基因联合密度图 ,如下。

(2)scCustomize 多基因联合密度图

密度图是通过Nebulosa包实现的,因此需要先安装Nebulosa 包 。然后用Plot_Density_Joint_Only()函数即可以同时绘制多个基因的联合密度图 ,可以不限于2个基因 。

BiocManager::install("Nebulosa")
#单基因
p000 <- Plot_Density_Custom(seurat_object = sce2, features = "CD3D")
#双基因
p111 <- Plot_Density_Joint_Only(seurat_object = sce2, features = c("CD3D", "CD3E"))
#多基因
p222 <- Plot_Density_Joint_Only(seurat_object = sce2, features = c("CD3D", "CD3E","CD79A"),custom_palette = BlueAndRed())
p000 + p111 + p222

可以通过custom_palette 函数调整颜色,选择较少 。

除了展示共表达外,还可展示目标celltype的几个marker来辅助细胞类型鉴定。

3 , 分组相关

很多时候会需要分样本/分组展示重点基因来进行表达的比较,

(1)Seurat有 split.by 函数 ,虽然可以设置ncol,但是没有效果,如图所示,

sce2sub <- subset(sce2 ,group == "PT")
FeaturePlot(sce2sub, "CD3D", cols = brewer.pal(11, name = "RdBu"),pt.size = 1,split.by = "sample" ,ncol = 4)

(2)scCustomize 中FeaturePlot_scCustom函数 ,算是修正了这个小bug

FeaturePlot_scCustom(seurat_object = sce2, features = "CD3D", split.by = "orig.ident",num_columns = 4)

4 ,ggplot2 修改theme / legend 相关

类似前面使用ggplot2的scale修改颜色,当然也可以修改theme等一系列

FeaturePlot(object = sce2, features = "CD3D",pt.size = 1,order = T) + scale_colour_gradientn(colours = rev(brewer.pal(n = 10, name = "RdBu"))) + DarkTheme() + theme(text=element_text(size=14))+ theme(text=element_text(face = "bold"))+theme(legend.text=element_text(size=8))

此处简单的示例,更多的参考ggplot2 | 关于标题,坐标轴和图例的细节修改,你可能想了解 , ggplot2|theme主题设置,详解绘图优化-“精雕细琢” ,和ggplot2 |legend参数设置,图形精雕细琢

5 批量绘制

当有多个基因需要绘制时候,需要批量绘制 。

(1)features 可以接受向量,因此可以直接完成

marker_sign <- c("CD3E", 'CD3D', 'EPCAM', 'CD4', 'CD8A','SPP1', 'CD19', 'COL1A1', 'IGLC1')
FeaturePlot(sce2,features = marker_sign)

(2)grid.arrange 方式绘制

grid.arrange接受的是list ,可以通过layout_matrix 调整布局 。当然也可以最开始调整好基因在向量中的顺序,Seurat的结果是一样的 。

intersect_tls <- intersect(marker_sign,rownames(sce2)) 
plot_list <- lapply(intersect_tls,function(x){plot_list <- FeaturePlot(sce2,features = x)})
#设置布局
lay <- rbind(c(1,2,3),c(4,5,6),c(7,8,9))grid.arrange(grobs = plot_list, layout_matrix = lay)

因为单细胞的FeaturePlot的都是样的,看不出来grid.arrange的优势,后面会介绍空转中使用该函数通过布局 和 选择展示的图片 来绘制CNS级别的主图。

1. tsne展示marker基因

FeaturePlot(mye.seu,features = "CCR7",reduction = "tsne",pt.size = 1)+scale_x_continuous("")+scale_y_continuous("")+theme_bw()+ #改变ggplot2的主题theme( #进一步修改主题panel.grid.major = element_blank(),panel.grid.minor = element_blank(), #去掉背景线axis.ticks = element_blank(),axis.text = element_blank(), #去掉坐标轴刻度和数字legend.position = "none", #去掉图例plot.title = element_text(hjust = 0.5,size=14) #改变标题位置和字体大小)
ggsave("CCR7.pdf",device = "pdf",width = 10,height = 10.5,units = "cm")  

另一种方法就是把tsne的坐标和基因的表达值提取出来,用ggplot2画,其实不是很必要,因为FeaturePlot也是基于ggplot2的,我还是演示一下

mat1=as.data.frame(mye.seu[["RNA"]]@data["CCR7",])
colnames(mat1)="exp"
mat2=Embeddings(mye.seu,"tsne")
mat3=merge(mat2,mat1,by="row.names")#数据格式如下:
> head(mat3)
Row.names     tSNE_1     tSNE_2   exp
1 N01_AAACGGGCATTTCAGG_1   5.098727  32.748145 0.000
2 N01_AAAGATGCAATGTAAG_1 -24.394040  26.176422 0.000
3 N01_AACTCAGGTAATAGCA_1  11.856730   8.086553 0.000
4 N01_AACTCAGGTCTTCGTC_1  10.421878  12.660407 0.000
5 N01_AACTTTCAGGCCATAG_1  33.555756 -10.437406 1.606
6 N01_AAGACCTTCGAATGGG_1 -23.976967  11.897753 0.738mat3%>%ggplot(aes(tSNE_1,tSNE_2))+geom_point(aes(color=exp))+scale_color_gradient(low = "grey",high = "purple")+theme_bw()
ggsave("CCR7.2.pdf",device = "pdf",width = 13.5,height = 12,units = "cm")

用ggplot2的好处就是图形修改很方便,毕竟ggplot2大家都很熟悉

2. 热图展示marker基因

画图前,需要给每个细胞一个身份,因为我们跳过了聚类这一步,此处需要手动赋值

Idents(mye.seu)="celltype"library(xlsx)
markerdf1=read.xlsx("ref_marker.xlsx",sheetIndex = 1)
markerdf1$gene=as.character(markerdf1$gene)
# 这个表格整理自原文的附表,选了53个基因#数据格式
# > head(markerdf1)
# gene   celltype
# 1    S100B DC2(CD1C+)
# 2 HLA-DQB2 DC2(CD1C+)
# 3   FCER1A DC2(CD1C+)
# 4     CD1A DC2(CD1C+)
# 5     PKIB DC2(CD1C+)
# 6    NDRG2 DC2(CD1C+)DoHeatmap(mye.seu,features = markerdf1$gene,label = F,slot = "scale.data")
ggsave("heatmap.pdf",device = "pdf",width = 23,height = 16,units = "cm")

label = F不在热图的上方标注细胞类型,
slot = "scale.data"使用scale之后的矩阵画图,默认就是这个

接下来用pheatmap画,在布局上可以自由发挥

library(pheatmap)
colanno=mye.seu@meta.data[,c("CB","celltype")]
colanno=colanno%>%arrange(celltype)
rownames(colanno)=colanno$CB
colanno$CB=NULL
colanno$celltype=factor(colanno$celltype,levels = unique(colanno$celltype))

先对细胞进行排序,按照celltype的顺序,然后对基因排序

rowanno=markerdf1
rowanno=rowanno%>%arrange(celltype)

提取scale矩阵的行列时,按照上面的顺序

mat4=mye.seu[["RNA"]]@scale.data[rowanno$gene,rownames(colanno)]
mat4[mat4>=2.5]=2.5
mat4[mat4 < (-1.5)]= -1.5 #小于负数时,加括号!

下面就是绘图代码了,我加了分界线,使其看上去更有区分度

pheatmap(mat4,cluster_rows = F,cluster_cols = F,show_colnames = F,annotation_col = colanno,gaps_row=as.numeric(cumsum(table(rowanno$celltype))[-6]),gaps_col=as.numeric(cumsum(table(colanno$celltype))[-6]),filename="heatmap.2.pdf",width=11,height = 7)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/180669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[SaaS] 广告创意中stable-diffusion的应用

深度对谈&#xff1a;广告创意领域中 AIGC 的应用这个领域非常快速发展&#xff0c;所以你应该保持好奇心&#xff0c;不断尝试新事物&#xff0c;不断挑战自己。https://mp.weixin.qq.com/s/ux9iEABNois3y4wwyaDzAQ我对AIGC领域应用调研&#xff0c;除了MaaS服务之外&#xff…

安全防控 | AIRIOT智能安防管理解决方案

现代社会对安全和便捷性的需求越来越高&#xff0c;特别是在大型商业园区、住宅社区和办公大楼等场所。传统的安防系统往往存在一些痛点: 通行效率问题&#xff1a;传统门禁系统通常导致人员排队等待&#xff0c;降低了通行效率。车辆通行管理不当会导致交通拥堵和停车问题。 …

Elasticsearch 线上实战问题及解决方案探讨

1、reindex相关问题 1.1 问题描述 我有 1tb 的一个大索引若干&#xff0c;要迁移到另外一个新集群去&#xff0c;有没有好办法&#xff1f;reindex好像会中断...... reindex 是不是就算设置了频率也会莫名的中断&#xff0c;而且没地方查到错误&#xff1f;1000多万的数据&…

【axios封装】万字长文,TypeScript实战,封装一个axios - 基础封装篇

目录 前言版本环境变量配置引入的类型1、AxiosIntance: axios实例类型2、InternalAxiosRequestConfig: 高版本下AxiosRequestConfig的拓展类型3、AxiosRequestConfig: 请求体配置参数类型4、AxiosError: 错误对象类型5、AxiosResponse: 完整原始响应体类型 目标效果开始封装骨架…

鸿运主动安全监控云平台存在任意文件读取漏洞 附POC

@[toc] 鸿运主动安全监控云平台存在任意文件读取漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途…

蓝桥杯物联网竞赛_STM32L071_5_串口接收发送数据

理论&#xff1a; 串口采取异步通信&#xff0c;即不依赖时钟节拍来接收或发送数据&#xff0c;而是采用互相约定的波特率传输数据。 波特率与单位时间传输的比特数有关&#xff0c;波特率越大传输的数据越多 传输一个比特花费的时间T 1 / 比特率 接受和发送数据的时候需要…

leetcode:455. 分发饼干

一、题目 原题链接&#xff1a;455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a;int findContentChildren(int* g, int gSize, int* s, int sSize) 二、思路 将胃口数组和饼干尺寸数组降序排序 遍历两个数组&#xff0c;从胃口数组中找到符合饼干尺…

网络入门---网络的大致了解

目录标题 网络发展的简单认识协议作用的理解协议的本质什么是协议分层网络通信所面对的问题OSI七层模型TCP/IP模型协议报头的理解局域网通信局域网通信基本原理报头的问题局域网的特点跨网的网络链接如何查看mac地址 网络发展的简单认识 通过之前的学习我们知道计算机是给人提…

使用docker-compose优雅部署nacos

查看代码中引入nacos版本 在应用的pom.xml中搜索nacos关键字&#xff0c;找到相关的nacos依赖 点击以来左边的图标&#xff0c;找到依赖管理器中的pom.xml&#xff0c;并全局搜索nacos&#xff0c;即可找到对应的nacos客户端版本 使用docker-compose部署nacos version: 3s…

Jmeter-分布式压测(远程启动服务器,windows)

1 前提条件 JDK已部署&#xff0c;版本一致Jmeter已部署&#xff0c;版本一致多台服务器连接的同一网络(例如&#xff1a;同一wifi)防火墙处于关闭状态&#xff08;或者对应默认端口处于开放状态&#xff09;虚拟网络适配器都处于关闭状态查找到每一台服务器的IP 2 主服务器配…

蓝桥杯第229题 迷宫与陷阱 BFS C++ 模拟 带你理解迷宫的深奥

题目 迷宫与陷阱 - 蓝桥云课 (lanqiao.cn)https://www.lanqiao.cn/problems/229/learning/?page1&first_category_id1&name%E8%BF%B7%E5%AE%AB%E4%B8%8E%E9%99%B7%E9%98%B1 思路和解题方法 首先&#xff0c;定义了一个结构体node来表示迷宫中的每个节点&#xff0c;包…

3种在ArcGIS Pro中制作山体阴影的方法

山体阴影可以更直观的展现地貌特点&#xff0c;表达真实的地形&#xff0c;这里为大家介绍一下在ArcGIS Pro中制作山体阴影的方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&#xff0c;常见的GIS数据…

揭秘Git高手的10个秘密武器:让你的工作效率飙升!

Git和GitHub是每个软件工程师都必须了解的最基本的工具。它们是开发人员日常工作不可或缺的一部分&#xff0c;每天都要与之互动。 精通Git不仅能简化你的日常操作&#xff0c;还能显著提高生产力。在这篇文章中&#xff0c;我们将探讨一组能够极大提升生产力的命令。 随着对…

适用于 Windows 的最佳电脑数据恢复软件是什么?

数据丢失是数字世界中令人不快的一部分&#xff0c;它会在某一时刻影响许多计算机用户。很容易意外删除一些重要文件&#xff0c;这可能会在您努力恢复它们时带来不必要的压力。幸运的是&#xff0c;数据恢复软件可以帮助恢复已删除的文件&#xff0c;即使您没有备份它们。这是…

智慧公厕为高速服务区公厕做出的贡献

在现代社会&#xff0c;科技的飞速发展改变了人们的生活方式&#xff0c;也深刻影响着城市的基础设施和公共服务。而在这个数字化时代的背景下&#xff0c;智慧公厕作为城市智能化管理的一部分&#xff0c;为高速服务区公厕带来了一系列的创新和贡献&#xff0c;为旅客的出行提…

动态规划经典例题leetcode思路代码详解

目录 动态规划基础篇例题 leetcode70题.爬楼梯 leetcode746题.使用最小花费爬楼梯 leetcode198题.打家劫舍 leetcode62题.不同路径 leetcode64题.最小路径和 leetcode63题.63不同路径II 动态规划基础篇例题 这一篇的例题解答是严格按照我上一篇写的动态规划三部曲做的&…

P9242 [蓝桥杯 2023 省 B] 接龙数列(dp+最长接龙序列+分类)

1. 计算0~9为结尾的最长子串长度 2. 对于每个数字&#xff0c;比较其开头可连接子串长度1 与 原来以其末位为末尾的子串长度 3. 更新以其末位为末尾的子串长度 #include<iostream> #include<string.h>using namespace std;// 相当于记录…

万户协同办公平台ezoffice SendFileCheckTemplateEdit.jsp接口存在SQL注入漏洞 附POC

@[toc] 万户协同办公平台ezoffice SendFileCheckTemplateEdit.jsp接口存在SQL注入漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文…

力扣141-环形链表

文章目录 力扣141-环形链表示例代码实现要点剖析 力扣141-环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测…

计算机基础知识60

MySQL分组 # 概念&#xff1a;分组是按照某个指定的条件将单个单个的个体分成一个个整体 # MySQL分组的关键字&#xff1a;group by # 分组一般配合聚合函数使用&#xff1a; sum max min avg count 基本的语法格式: group by 字段名 [having 条件表达式] # 单独使用 group by关…