首页 > 编程笔记 > Python笔记 阅读:1

Python Pycirclize绘制切尔科斯图(附带实例)

切尔科斯图(Circos)是一种用于可视化循环数据的强大工具,它的特点是将数据以圆环的形式展示出来,便于观察和理解数据之间的关系。

通常情况下,切尔科斯图用于展示染色体的结构、基因组之间的相互作用、基因表达数据等循环性质的数据。切尔科斯图由以下 4 个部分组成:
【实例 1】使用 Pycirclize 库创建一个切尔科斯图。输入如下代码:
from pycirclize import Circos  # 导入 Pycirclize 库中的 Circos 类
import numpy as np    # 导入 NumPy
np.random.seed(0)  # 设置随机数种子,确保每次运行结果一致

# 初始化切尔科斯图的扇形区域
sectors={"A": 10,"B": 15,"C": 12,"D": 20,"E": 15}
circos=Circos(sectors,space=5)  # 创建 Circos 对象,指定扇形区域和间隔

for sector in circos.sectors:  # 循环遍历每个扇形区域
    # 绘制扇形区域的名称
    sector.text(f"Sector: {sector.name}", r=110,size=15)
    # 创建 X 坐标位置和随机的 Y 值
    x=np.arange(sector.start,sector.end) + 0.5
    y=np.random.randint(0,100,len(x))

    # 绘制线条
    track1=sector.add_track((80,100),r_pad_ratio=0.1)  # 在扇形区域内添加轨道
    track1.xticks_by_interval(interval=1)  # 设置刻度间隔
    track1.axis()  # 添加轨道的坐标轴
    track1.line(x,y)  # 绘制线条

    # 绘制散点
    track2=sector.add_track(55,75),r_pad_ratio=0.1)  # 添加轨道
    track2.axis()  # 添加坐标轴
    track2.scatter(x,y)  # 绘制散点图

    # 绘制条形图
    track3=sector.add_track(30,50),r_pad_ratio=0.1)  # 添加轨道
    track3.axis()  # 添加坐标轴
    track3.bar(x,y)  # 绘制条形图

    # 绘制连接线
    circos.link("A",0,3,"B",15,12)  # 连接扇形区域 A 和 B
    circos.link("B",0,3,"C",7,11),color="skyblue"  # 连接扇形区域 B 和 C,指定颜色为天蓝色
    circos.link("C",2,5,"E",15,12),color="chocolate",direction=1)  # 连接扇形区域 C 和 E,指定颜色为巧克力色,设置方向为逆时针
    circos.link("D",3,5,"D",18,15),color="lime", ec="black",lw=0.5,hatch="//",direction=2)  # 连接扇形区域 D 和 D,指定颜色为酸橙色,边缘颜色为黑色,填充样式为斜线
    circos.link("D",8,10,"E",2,8),color="violet", ec="red",lw=1.0,ls="dashed")  # 连接扇形区域 D 和 E,指定颜色为紫罗兰色,边缘颜色为红色,线型为虚线

circos.save("example01.png")  # 将绘制好的切尔科斯图保存为图片文件
fig=circos.plotfig()  # 绘制切尔科斯图
上述代码展示如何在不同的扇形区域内绘制线条、散点和条形图,以及如何添加连接线。通过这些可视化操作,可以直观地展示循环数据之间的关系和分布情况。输出的结果如下图所示。


【实例 2】利用 Pycirclize 库创建一个切尔科斯图,用于展示大肠杆菌质粒(NC_002483)的基因组结构信息,包括基因的分布和定位。输入如下代码:
from pycirclize import Circos  # 导入 Pycirclize 库中的 Circos 类
from pycirclize.utils import fetch_genbank_by_acid  # 用于下载 GenBank 数据
from pycirclize.parser import Genbank  # 用于解析 GenBank 数据

# 下载大肠杆菌质粒(NC 002483)的 GenBank 数据
gbk_fetch_data=fetch_genbank_by_acid("NC_002483")
gbk=Genbank(gbk_fetch_data)  # 使用 GenBank 数据初始化 Genbank 解析器

# 使用基因组大小初始化 Circos 实例
circos=Circos(sectors=(gbk.name: gbk.range_size)
circos.text(f"Escherichia coli K-12 plasmid F\nn{gbk.name}", size=14)  # 在图中添加文本信息
circos.rect(r_lim=(90,100), fc="lightgrey", ec="none", alpha=0.5)  # 绘制一个灰色矩形
sector=circos.sectors[0]  # 获取第一个扇形区域

# 绘制正向链 CDS
f_cds_track=sector.add_track(95, 100)  # 在扇形区域内添加轨道
f_cds_feat=gbk.extract_features("CDS", target_strand=1)
f_cds_track.genomic_features(f_cds_feat, plotstyle="arrow", fc="salmon", lw=0.5)

# 绘制反向链 CDS
r_cds_track=sector.add_track(90, 95)
r_cds_feat=gbk.extract_features("CDS", target_strand=-1)
r_cds_track.genomic_features(r_cds_feat, plotstyle="arrow", fc="skyblue", lw=0.5)

# 绘制 'gene' qualifier 标签(如果存在)
labels, label_pos_list=[], []
for feat in gbk.extract_features("CDS"):
    start=int(feat.location.start)
    end=int(feat.location.end)
    label_pos=(start + end) / 2
    gene_name=feat.qualifiers.get("gene", [None] [0]
    if gene_name is not None:
        labels.append(gene_name)
        label_pos.append(label_pos)

f_cds_track.xticks(label_pos_list, labels, label_size=6, label_orientation="vertical")

# 绘制 X 轴刻度(间隔为 10Kb)
r_cds_track.xticks_by_interval(10000, outer=False,
                    label_formatter=lambda v: f"{v/1000:.1f} Kb")
fig=circos.plotfig()  # 绘制 Circos 图
上述代码首先下载 GenBank 数据,使用 Genbank 解析器进行解析。然后,利用 Circos 类初始化一个 Circos 实例,根据基因组大小创建了相应的扇形区域,并在图中添加了相关文本信息和灰色矩形。接着,根据正向链和反向链的 CDS 数据绘制了箭头表示的基因区域。最后,根据基因名称绘制了刻度标签。输出的结果如下图所示。

相关文章