R语言绘制染色体变异位置分布图,RIdeogram包

news2025/1/12 9:43:34

变异位点染色体分布图

今天分享的内容是通过RIdeogram包绘制染色体位点分布图,并介绍一种展示差异位点的方法。

alt

在遗传学研究中,通过测序等方式获得了基因组上某些位置的基因型信息。 如下表,第一列是变异位点的ID,第二列是染色体,第三列是物理位置,最后两列是两个样品的基因型。

alt

这个文件通常有好几万行,要想快速从中获得有效信息,可以借助变异位点染色体分布图功能实现。比如下图,红色部分表示样品A和样品B差异的位置,一眼就能看出哪些位置比较关键。

alt

数据准备

alt

主要的输入文件有两个,第一个是染色体结构信息(长度、着丝粒位置等),第二个是待分析标注的位点信息(不同材料在某位置的基因型),如下所示:

alt

操作方法

首先,安装并加载R包:

library(RIdeogram)
library(tidyverse)
library(xlsx)

设置参数

将整理好的文件保存为csv格式,输入文件名。centwidth是着丝粒显示宽度,singewidth是单个位点的显示宽度,这两个值可以自定义设置。(如果设置的值越大,那么线条就越粗)

my_filename <- "data.csv"
my_centwidth <- 5000000
my_color <- c("#e0e0e0""#304ffe""#dd2c00","#00bfa5")
my_singewidth <- 5000000
alt

添加染色体信息

由于绘图时需要每个染色体的长度(起始和终止位置)和着丝粒的位置,因此提前准备一个txt文档,按如下格式整理数据,用于后续绘图。 alt

下面是读取染色体信息的代码:

df_chr_pos_cent <- read.table("./Ref_chromedata.txt",header = T)
df_chr_pos_cent <- cbind(df_chr_pos_cent$chr,"0",
                         df_chr_pos_cent$length,
                         df_chr_pos_cent$centromere,
                         as.numeric(df_chr_pos_cent$centromere) + my_centwidth)
df_chr_pos_cent <- as.data.frame(df_chr_pos_cent)
df_chr_pos_cent <- df_chr_pos_cent[1:21,] %>% 
      mutate_at(vars(V2,V3,V4,V5),as.integer)
colnames(df_chr_pos_cent) <- c("Chr","Start","End","CE_start","CE_end")
> head(df_chr_pos_cent)
  Chr Start       End  CE_start    CE_end
1  1A     0 594102056 213000000 218000000
2  1B     0 689851870 240600000 245600000
3  1D     0 495453186 170000000 175000000
4  2A     0 780798557 326650000 331650000
5  2B     0 801256715 347850000 352850000
6  2D     0 651852609 268450000 273450000
alt

先从名为 "Ref_chromedata.txt" 的文件中读取数据,并将其存储在名为 df_chr_pos_cent 的数据框中,再选取某些列的内容,并将它们拼接成一个新的矩阵,自动计算每条染色体的起止位置和着丝粒的起止位置。

创建判定子代和亲本关系的函数

为了更方便的计算某个位点在亲本和子代中的存在情况,快速获得子代中突变信息的来源,创建一个亲缘关系判定函数。

# 函数:输入两个亲本和子代基因型,判断子代来源
determine_progeny <- function(p1,p2,prog,name_p1,name_p2){
      if (p1 == p2){
            if (p1 == prog & p2 == prog){
                  return("Both")
            }else{
                  return("Unknown")
            }
      }else{
            if (p1 == prog){
                  return(name_p1)
            }else{
                  if (p2 == prog){
                        return(name_p2)
                  }else{
                        return("Unknown")
                  }
            }
      }
}

这个函数叫做 determine_progeny,它用于确定两个亲本(p1 和 p2)以及一个后代(prog)之间的关系。

参数说明:

  • p1 - 第一个亲本的标识。
  • p2 - 第二个亲本的标识。
  • prog - 后代的标识。
  • name_p1 - 第一个亲本的名字
  • name_p2 - 第二个亲本的名字

功能介绍:

首先,检查如果第一个亲本 p1 和第二个亲本 p2 相等,那么它们之间的关系有两种情况:

  1. 如果它们都等于后代 prog,那么返回 "Both",表示两个亲本都与后代相关。
  2. 另外一种情况,返回 "Unknown",表示无法确定它们之间的关系。

如果第一个亲本 p1 和第二个亲本 p2 不相等,那么它们之间的关系也有两种情况:

  1. 如果第一个亲本 p1 等于后代 prog,那么返回 name_p1,表示第一个亲本是后代的亲本。
  2. 如果第二个亲本 p2 等于后代 prog,那么返回 name_p2,表示第二个亲本是后代的亲本。

最后,如果以上条件都不满足,返回 "Unknown",表示无法确定它们之间的关系。 这个函数的目的是根据输入的亲本和后代信息,确定它们之间的关系,并返回一个相应的标注信息。

创建判定杂合子的函数

如果某些位点为杂合状态,需要对其进行识别标注,以下提供一种算法进行识别:

# 函数:判断杂合子
decide_hybrid <- function(genetype){
      tem <- str_split(genetype,"")
      if (length(tem[[1]]) != 2){
            return("Error")
      }else{
            first <- tem[[1]][1]
            sencend <- tem[[1]][2]
            if (first == sencend){
                  return("equal")
            }else{return("diff")}
      }
}

这段代码定义了一个名为decide_hybrid的函数,其作用是接受一个字符串参数genetype,然后将该字符串拆分成两个字符,并检查这两个字符是否相等。

如果输入字符串的长度不等于2,函数将返回"Error",表示输入错误。

否则,如果两个字符相等,函数将返回"equal",表示相等。

如果两个字符不相等,函数将返回"diff",表示不相等。这个函数主要用于比较输入的基因型是否相等或不等。 alt

计算每个位点的变异类型

for (i in 1:nrow(df)){
      if (df$chr[i] == "#N/A"){
            df$type[i] <- "del"
            next
      }
      if (df$pos[i] == "#N/A"){
            df$type[i] <- "del"
            next
      }
      if (decide_hybrid(df[i,3]) == "diff" |
          decide_hybrid(df[i,4]) == "diff" |
          decide_hybrid(df[i,5]) == "diff"){
            df$type[i] <- "del"
            next
      }
      df$type[i] <- determine_progeny(df[i,3],df[i,4],df[i,5],
                                      colnames(df)[3],colnames(df)[4])
}

这段代码的主要作用是根据一系列条件来确定df 数据框中每一行的"type"列的值,并根据不同条件进行相应的处理。如果某些条件满足,它将类型设置为 "del",否则它会计算新的类型并将其存储在数据框中。

alt

绘图数据初步整理

df_marker <- df %>% filter(type != "del")
df_marker$chr <- sub("chr","",df_marker$chr)
df_marker$Start <- df_marker$pos
df_marker$End <- as.numeric(df_marker$pos) + my_singewidth
df_marker$Value[which(df_marker$type == "Both")] <- 4
df_marker$Value[which(df_marker$type == colnames(df)[3])] <- 3
df_marker$Value[which(df_marker$type == colnames(df)[4])] <- 2
df_marker$Value[which(df_marker$type == "Unknown")] <- 1

首先从数据框df中筛选出type列不等于"del"的行,然后对筛选后的数据框df_marker进行一系列操作:

移除df_marker$chr列中的"chr"前缀,将结果存储回df_marker$chr中。 将df_marker$pos列的值赋给新的列df_marker$Start,以便将位置信息重命名。 根据my_singewidth的值计算新的列df_marker$End,该列的值等于df_marker$pos加上my_singewidth的数值。

alt

根据条件对df_marker$Value列进行更新,将根据type列的不同值分配不同的数值,以下为对应规则:

如果type等于"Both",则将df_marker$Value设置为4。
如果type等于数据框中的第三列的列名,则将df_marker$Value设置为3。
如果type等于数据框中的第四列的列名,则将df_marker$Value设置为2。
如果type等于"Unknown",则将df_marker$Value设置为1。

主要目的是根据条件对df数据框进行筛选和转换操作,创建一个数据框df_marker,其中包括重命名列、计算新列以及根据不同的type值赋予相应的数值。

转换数据格式

df_marker_plot <- cbind(df_marker[,c(1,7,8,9)])
df_marker_plot <- df_marker_plot %>% 
      mutate_at(vars(Start,End,Value),as.integer)
df_marker_plot <- df_marker_plot[which(df_marker_plot$chr !="Un"),]
colnames(df_marker_plot) <- c("Chr","Start","End","Value")

这段代码的功能是对名为df_marker的数据框进行处理,首先选择其中的特定列(第1、7、8、9列),然后将这些列的数据类型转换为整数类型,接着从中删除chr列值不等于"Un"的行,最后重命名这些列为"Chr"、"Start"、"End"和"Value",用于后续的数据可视化或分析。

绘制染色体全景图

# 绘制全景图
ideogram(karyotype = df_chr_pos_cent,
         overlaid = df_marker_plot,
         colorset1 = my_color)
convertSVG("chromosome.svg", device = "pdf")

最后,使用如上代码即可生成最终的结果图片。该R包非常巧妙的使用SVG语法构建图形,并且提供了svg转pdf、png等多种方式。

alt

提示:分类型离散数据通过数值映射转换为连续型,便可以通过函数进行绘图计算,如果有多个维度的数据需要展示,可以添加其他类型的标注。

多组学应用:

  • 差异表达基因的分布(RNA-seq)
  • 开放染色质的分布(ATAC-seq)
  • CTCF结合位点(ChIP-seq)
  • 突变位点在染色体上的分布(WGS)
  • DNA甲基化的分布(WGBS)
  • 外显子在染色体上的分布(WES)

遗传学应用:

  • 变异位点全景图绘制
  • 标记物理位置展示图绘制
  • 遗传多样性来源展示
  • 基因连锁定位结果展示
>>> 参考资料
https://github.com/cran/RIdeogram
http://doi.org/10.7717/peerj-cs.251
https://www.jianshu.com/p/07ae1fe18071
>>> Tips:本文所有示例数据均随机生成,不具有任何意义

本文由 mdnice 多平台发布

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

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

相关文章

Python 字典的定义

视频版教程 Python3零基础7天入门实战视频教程 字典dict 字典也是Python提供的一种常用的数据结构&#xff0c;它用于存放具有映射关系的数据。 字典的定义 比如有成绩表数据——语文:68&#xff0c;数学:98&#xff0c;英语: 76&#xff0c;这组数据看上去像两个列表&…

每天几道Java面试题:集合(第四天)

目录 第四幕 、第一场&#xff09;大厦楼下门口第二场&#xff09;大门口 友情提醒 背面试题很枯燥&#xff0c;加入一些戏剧场景故事人物来加深记忆。PS:点击文章目录可直接跳转到文章指定位置。 第四幕 、 第一场&#xff09;大厦楼下门口 【面试者老王&#xff0c;门卫甲…

浅谈C++|STL之stack+queue+priority_queue篇

一.stack基本概念 栈&#xff08;Stack&#xff09;是一种常见的线性数据结构&#xff0c;遵循后进先出&#xff08;Last-In-First-Out&#xff0c;LIFO&#xff09;的原则。类似于我们在现实生活中堆叠书本或盘子的方式&#xff0c;最后放入的元素最先被取出。 在栈中&#…

【基于多输出方向的同步异步日志系统】

本项目涉及的到所有源码见以下链接&#xff1a; https://gitee.com/ace-zhe/wz_log 一、项目简介 1.日志的概念&#xff08;白话版&#xff09; 日志类似于日记&#xff0c;通常是指对完成某件事情的过程中状态等的记录&#xff0c;而计算机中的日志是指日志数据&#xff0c…

Python实现的mqtt客户端工具分享,小巧且超轻量级(python+tkinter+paho.mqtt)

mqtt协议调试时需要个客户端工具&#xff0c;但网上找的体积包都很大&#xff0c;都不够小巧和便携。于是趁周末时间用python搞出来了个客户端工具&#xff0c;使用pythontinkerpaho.mqtt实现。源码量很少但功能不弱&#xff0c;相当的轻量级。分享给有需要的小伙伴&#xff0c…

论文写作指导手册

TIPS&#xff1a;最近我们上线了“AI写作大师”&#xff0c;后续会继续围绕论文、文章、文案写相关的文章&#xff0c;来验证写作大师能力如何&#xff0c;敬请持续关注&#xff08; openrabbit.net&#xff09;&#xff5e; 一、论文选题 选题是论文研究的第一步&a…

Prometheus+Grafana可视化监控【Nginx状态】

文章目录 一、安装Docker二、安装Nginx(Docker容器方式)三、安装Prometheus四、安装Grafana五、Pronetheus和Grafana相关联六、安装nginx_exporter七、Grafana添加Nginx监控模板 一、安装Docker 注意&#xff1a;我这里使用之前写好脚本进行安装Docker&#xff0c;如果已经有D…

软件测试中常见的难题

1、需求定义&#xff1a; 需求可能不完整或者不准确&#xff0c;这会导致测试人员无法测试应用程序的所有功能。 例如&#xff1a;在一个电子商务网站上&#xff0c;可能需要测试的某些操作并未在需求中列出&#xff0c;导致测试人员无法测试到这些操作。 对策&#xff1a;测…

MySQL实现单个字段根据特定字符拆分

1.字段内容 2.想得到的效果 步骤1中&#xff0c;每一条记录的FJ字段&#xff0c;根据分号&#xff0c;拆分成多条&#xff0c;如下图所示&#xff1a; 3.具体实现 说明&#xff1a; SELECT DISTINCTsubstring_index(substring_index(a.要拆分的字段, 分隔字符, b.help_top…

自动化项目实战:用requests库自动保存王者荣耀英雄皮肤到本地,文末附源码下载!

前言 王者荣耀是一款备受欢迎的手机游戏&#xff0c;拥有众多精美的英雄皮肤。如果你想获取这些皮肤的图片或者其他相关信息&#xff0c;可以利用Python编写一个简单的爬虫来实现。 安装第三方库 首先&#xff0c;我们需要安装Python的requests和BeautifulSoup库。可以使用…

系列六、Nginx配置实例之反向代理2

一、目标 浏览器网页中访问http://${Linux服务器的IP}:9001/basketball/index.html&#xff0c;浏览器中打印"篮球8080!!!"&#xff1b; 浏览器网页中访问http://${Linux服务器的IP}:9001/football/index.html&#xff0c;浏览器中打印"足球8081!!!"&#…

[NLP] LLM---<训练中文LLama2(五)>对SFT后的LLama2进行DPO训练

当前关于LLM的共识 大型语言模型&#xff08;LLM&#xff09;使 NLP 中微调模型的过程变得更加复杂。最初&#xff0c;当 ChatGPT 等模型首次出现时&#xff0c;最主要的方法是先训练奖励模型&#xff0c;然后优化 LLM 策略。从人类反馈中强化学习&#xff08;RLHF&#xff09…

[字符串和内存函数]错误信息报告函数strerror详解

strerror介绍 strerror是一个C库函数&#xff0c;用于将错误代码转换为对的错误信息字符串。它接受一个整数参数errno&#xff0c;返回一个指向错误信息字符串的指针。 errno是一个全局变量&#xff0c;可以直接使用。它在C语言中用于表示发生错误时的错误码。它是一个整数&…

笔记1.4 计算机网络性能

1. 速率 速率即数据率&#xff08;data rate&#xff09;或称数据传输速率或比特率 单位时间&#xff08;秒&#xff09;传输信息&#xff08;比特&#xff09;量 计算机网络中最重要的一个性能指标 单位&#xff1a;bps、kbps、Mbps k 10^3、M 10^6、G 10^9 速率往往…

autosar 诊断入门

AUTOSAR (汽车开放系统架构) 是一个国际汽车行业的开放和标准化的软件架构。它的主要目标是为了创建一种独立于硬件的软件架构&#xff0c;以提高汽车电子系统的模块化和可重用性。 AUTOSAR架构主要分为两个部分&#xff1a;AUTOSAR Runtime Environment (RTE) 和 AUTOSAR Soft…

HTTP各版本差异

HTTP1.0 无法复用连接 HTTP1.0为每个请求单独新开一个TCP连接 #mermaid-svg-9N3exXRS4VvT4bWF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9N3exXRS4VvT4bWF .error-icon{fill:#552222;}#mermaid-svg-9N3exXRS…

集成电路运算放大器[23-9-16]

目录 1、结构组成&#xff1a;差分放大电路、电压放大电路、功率放大电路。 2、同相放大器&#xff1a; 3、反相放大器&#xff1a;一个正电压放大并变为负电压。 4、差分放大电路&#xff1a;输入两个不同的电压&#xff0c;两者的差值乘以放大系数得到输 出电压。 1、结构组…

2.策略模式

UML图 代码 main.cpp #include "Strategy.h" #include "Context.h"void test() {Context* pContext nullptr;/* StrategyA */pContext new Context(new StrategyA());pContext->contextInterface();/* StrategyB */pContext new Context(new Strat…

MybatisPlus(5)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 上篇讲了增删的操作&#xff0c;这篇讲修改操作中的一个问题以及它对应的…

002-第一代硬件系统架构确立及产品选型

第一代硬件系统架构确立及产品选型 文章目录 第一代硬件系统架构确立及产品选型项目介绍摘要硬件架构硬件结构选型及设计单片机选型上位机选型扯点别的 关键字&#xff1a; Qt、 Qml、 信号采集机、 数据处理、 上位机 项目介绍 欢迎来到我们的 QML & C 项目&#xff…