pythonic生物人

不用Perl和R,轻松Circos实现

👉Python matplotlib教程(优惠截止到2025年1月29日)

Image

Circos图是一种采用圆形布局展示数据的可视化图表,这种独特的圆形设计特别适合用来探索不同对象之间或位置之间的关系。

Circos图无论是基因组学研究、迁徙模式分析,还是数学艺术创作等领域都被广泛使用。


circos案例分享

看一些案CNS、NAR等顶刊中的案例,

ImageImageImageImageImageImageImageImage


Python实现circos图

Python matplotlib结合pycirclize可轻松实现circos图。

这里利用“3.2.16 circos 数据集”直观演示 PyCirclize 的基本用法。

  • 数据准备
chr_bed_file = "matplotlib_data/pycircos_data/hg38_chr.bed"  # 染色体信息
cytoband_file = "matplotlib_data/pycircos_data/hg38_cytoband.tsv"  # Cytoband数据
link_file = "matplotlib_data/pycircos_data/hg38_genomic_link.tsv"  # 基因组链接数据
link_data = pd.read_csv(link_file, sep="t", header=None)
  • circos图绘制
# 定义绘图配色
ColorCycler.set_cmap("Accent")  # 设置调色板
chr_names = [s.name for s in circos.sectors]  # 获取染色体名称
colors = ColorCycler.get_color_list(len(chr_names))  # 生成颜色列表
chr_name2color = {name: color for name, color in zip(chr_names, colors)}

# 绘图
circos = Circos.initialize_from_bed(chr_bed_file,
                                    start=0,
                                    end=360,
                                    space=2,
                                    endspace=True)  # 初始化Circos图

# 添加Cytoband(最外层)
circos.add_cytoband_tracks((95, 100), cytoband_file)
for sector in circos.sectors:
    sector.text(sector.name.replace("chr", "Chr"),
                r=120,
                size=10,
                color="black")  # 显示染色体名称
    sector.get_track("cytoband").xticks_by_interval(
        50000000,  # 每隔50000000bp添加刻度
        label_size=8,
        label_orientation="vertical",
        label_formatter=lambda v: f"{v / 1000000:.0f} Mb",  # 刻度标签格式化为Mb
    )

for sector in circos.sectors:
    # 为每条染色体区域(sector)生成示例数据(一般使用场景为,区域的基因表达水平、突变频率或覆盖度等信息)
    step = 8000000  # 数据间隔
    x = np.arange(sector.start + (step / 2), sector.end - (step / 2),
                  step)  # X轴数据
    y = np.random.randint(0, 100, size=len(x))  # Y轴数据

    # 添加散点图(第2层)
    track1 = sector.add_track((80, 90), r_pad_ratio=0.1)
    track1.axis()
    track1.scatter(x, y, vmax=100, s=10, color="g")

    # 添加柱状图(第3层)
    track2 = sector.add_track((65, 75), r_pad_ratio=0.1)
    track2.axis()
    track2.bar(x, y, vmax=100, width=step * 0.7, color="r")

    # 添加折线图(第4层)
    track3 = sector.add_track((50, 60), r_pad_ratio=0.1)
    track3.axis()
    track3.line(x, y, vmax=100, color="b")

# 添加Chord图(第5层)
for index, row in link_data.sample(n=2500, random_state=42).iterrows():
    region1 = (row[0], row[1], row[2])  # 第一个基因组区域
    region2 = (row[3], row[4], row[5])  # 第二个基因组区域
    color = chr_name2color.get(row[0], "gray")  # 连接颜色
    circos.link(region1, region2, color=color)

# 添加标题和个性化设置
circos.text("Circos图", deg=320, r=145, size=20, color="red")  # 添加标题
fig = circos.plotfig(dpi=500)  # 绘制图像,设置分辨率
fig.subplots_adjust()  # 调整子图布局
fig.set_edgecolor("gray")
fig.set_linewidth(0.8)
fig.show()

Image

以上构建了一个五层 Circos 图,依次展示 hg38 基因组上的 Cytoband 信息、染色体区域的数值分布(包括散点图、柱状图和折线图),以及不同染色体区域之间的关联关系(和弦图),每一层的含义见代码中。


-END-

本期内容「绘图数据+代码+代码详细解释」已上传(点击图片直达代码):

👉Python matplotlib保姆级教程

Image

Image

Image

Image
Image

Image

Image

Image

Image

Image

Image

Image

Image

Image

Image

Image

Image

Image

Image

Image

Image

Image

Image

Image

Image

交流学习

Image