pycirclize python包画circos环形图

news2024/12/25 1:03:26

pycirclize python包画circos环形图

很多小伙伴都有画环形图的需求,网上也有很多画环形图的教程,讲解circos软件和circlize R包的比较多,本文介绍一款python包:pyCirclize。适合喜欢python且希望更灵活作图的小伙伴。

pyCirclize包实际上也是以matplotlib模块为基础进行开发,个人使用体验感觉比circos软件灵活很多,例如circos软件没办法为各圈写标题,图注也比较单一,相比之下pycirclize的图注和对扇区的调整更加灵活。详见官方的教程文档:https://moshi4.github.io/pyCirclize/。

1. 安装pycirclize

直接使用pip工具安装即可,要求Python 3.9以上版本

pip install pycirclize

2. 实例图

多说无益,直接上一个样图。
下图是一个甲基化相关环形图,包含了常用环形图的诸多要素,根据实例图代码修改应该可以满足大部分作图需求了。

  • 第一圈为染色体:需要显示染色体ID和刻度(大刻度标出刻度值,但起始的大刻度不显示,免得首位的刻度值重叠显得很乱),标出小刻度。
  • 第二圈为case组相对于control组的高甲基化位点:CG、CHG、CHH三种颜色均显示,图中由于CHH类型位点太多导致其他两个看不太清了。标注出甲基化水平刻度线,从0到0.9共10条浅灰色的线。
  • 第三圈为基因密度热图:用黑白渐变展示。
  • 第四圈为case组相对于control组的低甲基化位点:同第二圈,但方向相反。
    在这里插入图片描述

3. 作图

俗话说得好:Talk is cheap. Show me the code.

3.1 数据准备

  1. 第一圈的chromosome.bed 文件:
    共三列,染色体名,start,end。
CHR1 0       27139696
CHR2 0       27139696
  1. 第二圈和第四圈的gDMR.hyper.txt
    共4列,染色体ID,Start,End,值。
CHR1 1482   1487   0.167943
  1. 基因密度
    根据gff文件提取
cut -f 1,3 chromosome.bed > test
bedtools makewindows -g test -w 1000000 > 1M
grep -w "gene" my.gff3 |awk '{print $1"\t"$4"\t"$5}'|uniq > gene.pos
bedtools intersect -a 1M -b gene.pos -c >gene.density

3.2 实例代码

python代码见下,细节部分注释了内容。希望能达到抛砖引玉的作用吧,祝大家科研顺利!

from pycirclize import Circos
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import pandas as pd
np.random.seed(0)
from matplotlib.patches import Patch
from matplotlib.lines import Line2D

# Initialize Circos from BED chromosomes
circos = Circos.initialize_from_bed("chromosome.bed", space=1,start=5,end=355,endspace=False) # 定义染色体,space设置间距

circos.text("图中标题,可以设置为组名vs组名", size=12, r=25,weight='bold') # 标题文字,默认位于在图中央
circos.text("Gene density", size=10, r=16,weight='bold')

# Plot chromosome name
for sector in circos.sectors:
    sector.text(sector.name, size=5)
    # Plot outer track
    outer_track = sector.add_track((98, 100))
    outer_track.axis(fc="lightgrey")
    major_interval = 10000000 # 设置大刻度
    minor_interval = 1000000 # 设置小刻度
    if sector.size > minor_interval:
        outer_track.xticks_by_interval(major_interval, label_formatter=lambda v: f"{v / 1000000:.0f} Mb" if v != 0 else None,label_size=4)
        outer_track.xticks_by_interval(minor_interval, tick_length=1, show_label=False)
    Hyper_CG=pd.read_table("CG_gDMR.hyper.txt",header=None)
    x = np.array(Hyper_CG[Hyper_CG[0]==sector.name][1]+(Hyper_CG[Hyper_CG[0]==sector.name][2]-Hyper_CG[Hyper_CG[0]==sector.name][1])/2)
    y = np.array(Hyper_CG[Hyper_CG[0]==sector.name][3])
    track1 = sector.add_track((75, 95), r_pad_ratio=0.1)
    # 注释圈名
    if sector.name == circos.sectors[0].name:
        circos.text("Hyper", r=track1.r_center, size=8)
    for r in range(77, 95, 2):
        sector.line(r=r, ec="lightgrey")
    track1.scatter(x, y,c="#EECA40",vmin=0,vmax=1,ec="black",lw=0.1,alpha=0.5)
    Hyper_CHG=pd.read_table("CHG_gDMR.hyper.txt",header=None)
    x = np.array(Hyper_CHG[Hyper_CHG[0]==sector.name][1]+(Hyper_CHG[Hyper_CHG[0]==sector.name][2]-Hyper_CHG[Hyper_CHG[0]==sector.name][1])/2)
    y = np.array(Hyper_CHG[Hyper_CHG[0]==sector.name][3])
    track1.scatter(x, y,c="#FD763F",vmin=0,vmax=1,ec="black",lw=0.1,alpha=0.5)
    Hyper_CHH=pd.read_table("CHH_gDMR.hyper.txt",header=None)
    x = np.array(Hyper_CHH[Hyper_CHH[0]==sector.name][1]+(Hyper_CHH[Hyper_CHH[0]==sector.name][2]-Hyper_CHH[Hyper_CHH[0]==sector.name][1])/2)
    y = np.array(Hyper_CHH[Hyper_CHH[0]==sector.name][3])
    track1.scatter(x, y,c="#23BAC5",vmin=0,vmax=1,ec="black",lw=0.1,alpha=0.5)
    # Add cytoband tracks from cytoband file
    gene_density=pd.read_table("gene.density",header=None)
    track2 = sector.add_track((70, 75), r_pad_ratio=0.1)
    # 注释圈名
    if sector.name == circos.sectors[0].name:
        circos.text("Gene", r=track2.r_center, size=8)
    track2.heatmap(gene_density[gene_density[0]==sector.name][3],vmin=0,vmax=max(gene_density[3]),cmap="Greys")
    # 内圈的负值
    Hyper_CG=pd.read_table("CG_gDMR.hypo.txt",header=None)
    x = np.array(Hyper_CG[Hyper_CG[0]==sector.name][1]+(Hyper_CG[Hyper_CG[0]==sector.name][2]-Hyper_CG[Hyper_CG[0]==sector.name][1])/2)
    y = np.array(Hyper_CG[Hyper_CG[0]==sector.name][3])
    track3 = sector.add_track((50, 70), r_pad_ratio=0.1)
    # 注释圈名
    if sector.name == circos.sectors[0].name:
        circos.text("Hypo", r=track3.r_center, size=8)
    for r in range(52, 70, 2):
        sector.line(r=r, ec="lightgrey")
    track3.scatter(x, y,c="#EECA40",vmin=-1,vmax=0,ec="black",lw=0.1,alpha=0.5)
    Hyper_CHG=pd.read_table("CHG_gDMR.hypo.txt",header=None)
    x = np.array(Hyper_CHG[Hyper_CHG[0]==sector.name][1]+(Hyper_CHG[Hyper_CHG[0]==sector.name][2]-Hyper_CHG[Hyper_CHG[0]==sector.name][1])/2)
    y = np.array(Hyper_CHG[Hyper_CHG[0]==sector.name][3])
    track3.scatter(x, y,c="#FD763F",vmin=-1,vmax=0,ec="black",lw=0.1,alpha=0.5)
    Hyper_CHH=pd.read_table("CHH_gDMR.hypo.txt",header=None)
    x = np.array(Hyper_CHH[Hyper_CHH[0]==sector.name][1]+(Hyper_CHH[Hyper_CHH[0]==sector.name][2]-Hyper_CHH[Hyper_CHH[0]==sector.name][1])/2)
    y = np.array(Hyper_CHH[Hyper_CHH[0]==sector.name][3])
    track3.scatter(x, y,c="#23BAC5",vmin=-1,vmax=0,ec="black",lw=0.1,alpha=0.5)

circos.colorbar(bounds=(0.35, 0.55, 0.3, 0.01),vmin=0,vmax=max(gene_density[3]),orientation="horizontal",cmap="Greys")
fig = circos.plotfig()

# 图注画在圈中间
_ = circos.ax.legend(
    handles=[
        Line2D([], [], color="#EECA40", marker="o", label="CG", ms=6, ls="None"),
        Line2D([], [], color="#FD763F", marker="o", label="CHG", ms=6, ls="None"),
        Line2D([], [], color="#23BAC5", marker="o", label="CHH", ms=6, ls="None"),
    ],
    bbox_to_anchor=(0.5, 0.45),
    loc="center",
    ncols=1,
)
fig.savefig("Circos.pdf") # 保存
fig.savefig("Circos.png",dpi=300)

更多内容敬请关注微信公众号:
在这里插入图片描述

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

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

相关文章

衡石分析平台系统管理手册-功能配置之SMTP 服务

SMTP 服务​ SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。 HENGSHI 用户需要开启 SMTP 服务并进行配置,才能收到系统发送邮件。 SMTP 服务需要用户配置服务器…

基于STM32的智能温室监控系统

目录 引言项目背景环境准备 硬件准备软件安装与配置系统设计 系统架构关键技术代码示例 传感器数据采集自动控制风扇与洒水系统实时数据展示与报警应用场景结论 1. 引言 智能温室监控系统是农业现代化的重要组成部分,能够通过传感器实时监测温度、湿度和光照等环…

20240926给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Buildroot的EVB4方案【通过HDMI0显示】

20240926给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Buildroot的EVB4方案【通过HDMI0显示】 2024/9/26 15:15 1、由于荣品RD-RK3588-AHD开发板没有HDMI1部分,因此拿掉了HDMI1的配置部分: Z:\rk3588s_20230620\kernel\arch\arm64\boot\dts\rockchip\rk358…

嵌入式学习——进程间通信方式(1)——有名管道和匿名管道

一、基本概念 我们要知道管道为什么叫做管道,管道就好比我们生活中的水管,水总是从一端流向另一端,你总不能从水龙头往里灌水吧,它只能出水。管道也是类似的,数据从管子的一端传入,在另一端进行数据的读取…

电脑使用技巧:C盘大文件如何清理?

随着时间的推移,电脑C盘可能会因为各种大文件的堆积而变得容量不足,影响系统运行速度。在这篇文章中,小编将分享几种C盘大文件清理的小妙招,让你的电脑流畅运行。 方法一:使用系统自带的磁盘清理 Windows系统提供了内…

画册翻页电子版是如何制作的?

​随着科技的不断发展,电子出版逐渐成为主流,画册翻页电子版也应运而生。它不仅保留了传统画册的精美风格,还融入了现代电子产品的便捷性。那么,画册翻页电子版究竟是如何制作的呢? 1.要制作电子杂志,首先需要选择一款…

峟思传感器:基坑监测的主要内容与技术

在现代城市建设和土木工程中,基坑监测扮演着至关重要的角色。基坑监测是指在基坑开挖和施工过程中,对基坑及其周边环境进行实时观测和分析的技术手段,以确保工程的安全性和有效性。本文将详细介绍基坑监测的主要内容及其所采用的关键技术。 点…

前端js下载文件时后缀名多出一个下划线(已解决)

问题:前端js下载文件时后缀名多出一个下划线 在打印的时候发现文件名啥啥啥的都没问题,创建的元素似乎也没问题。 但是呢结果?多了个下划线。 原因 细心的你可能发现了a标签的download的内容是双层双引号。具体原因可能是谷歌浏览器做了安全…

解读 Story Protocol:IP 与区块链的潜力与障碍

撰文:100y.eth 编译:J1N,Techub News 8 月,据 The Block 报道,专注于知识产权(IP)的区块链 Story 宣布完成 a16z Crypto 领投 8000 万美元 B 轮融资,参投方包括 Polychain Capital&…

VBA技术资料MF204:右键多按钮弹出菜单中使用图标

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

MySQL常见面试总结

MySQL基础 什么是关系型数据库? 顾名思义,关系型数据库(RDB,Relational Database)就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系(一对一、一对多、多对多&…

【大数据】元数据是解锁数据价值的关键

在信息爆炸的数字时代,数据无处不在,它以多种形式存在,从文本文档到数字图片,从交易记录到科学测量。然而,如果没有合适的数据管理和理解,这些数据的价值就会大打折扣。如何提高数据价值呢?这就…

IDA Pro基本使用

IDA Pro基本使用 1.DllMain的地址是什么? 打开默认在的位置1000D02E就是DllMain地址 按空格键可以看到图形化界面选择options、general勾选对应的选项在图像化也能看到 2.使用Imports 窗口并浏览到 gethostbyname,导入函数定位到什么地址? 这里可以打开Impo…

2024 Python3.10 系统入门+进阶(十六):正则表达式

目录 一、认识正则表达式二、正则表达式基本语法2.1 行界定符2.2 单词定界符2.3 字符类2.4 选择符2.5 范围符2.6 排除符2.7 限定符2.8 任意字符2.9 转义字符2.10 反斜杠2.11 小括号2.11.1 定义独立单元2.11.2 分组 2.12 反向引用2.13 特殊构造2.14 匹配模式 三、re模块3.1 comp…

文件防泄密措施有哪些?教你10个权威方法,有效防止文件泄密!【聚焦职场安全】

【聚焦职场安全】数字化办公,文件防泄密已成为企业不可忽视的重要环节。 文件泄密不仅会导致企业核心竞争力的丧失,还可能引发法律纠纷和经济损失。 接下来,我将为您揭晓10个权威且实用的文件防泄密措施,这些方法简单易行&#…

斯坦福STANFORD RESEARCH SR860 DSP 锁相放大器SR830

斯坦福研究 SR860 具有无与伦比的模拟性能、先进的新型数字信号处理功能、完全现代、直观的用户界面以及广泛的计算机连接选项,是任何同步检测应用的理想选择。从消除开关模式噪声的重型环形变压器到将锁定功能带入手机的 iOS 连接,再到可消除更多噪声并…

DrawDB本地Windows环境部署结合内网穿透远程设计数据库

文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 前言 我们在开发项目时很多时候都会使用到数据库,所以选择一个好用的数据库设计工具会让工作效率翻倍。在当今数字化时代,数据库管理是许多企业…

超全攻略,教你验证第三方电子合同平台的真伪

不了解电子合同不用担心,通过本篇文章,您可以深入了解电子合同以及第三方平台有效性。 如何辨别第三方电子合同平台的真伪,可以从合法性、技术安全、平台、功能、服务等几个方面入手: 1.合法性方面: 资质认证&#…

Azure Kinect 人体跟踪关节

Azure Kinect 人体跟踪关节 azure kinect dk 提取人体骨骼 要在Azure Kinect DK上提取人体骨骼,你需要使用Azure Kinect SDK和OpenPose库。以下是一个简化的代码示例,展示如何集成这两个库来提取骨骼关键点: 首先,确保你已经安装…

linux 下域名解析错误

本文参考这里 作者:程序那点事儿 日期:2024/01/31 16:25 ping raw.githubusercontent.com,ping这个域名时,发现返回的是本地ip 原因是,配置了本地网关地址 192.168.xx.1 用命令查看默认网卡的网关:nmcli …