pythonic生物人

复现顶刊图,换数据即可用!

本文分享Python实现CNS常见circos。

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

先看一些顶刊案例,

Image
Image

https://circos.ca/


Python实现

Python matplotlib扩展可实现circos图。

这里利用“3.2.16 circos数据集”直观演示,

  • 数据准备
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")
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保姆级教程

👇加入学习(备注:299)

图片

more。。。。。。

👉R可视化教程:28个章节+11w字+数百张图

图片

👉matplotlib教程:20w字+数百张图形+1W行代码+详细代码注释

图片

👉seaborn教程:12.3万字+500多张图形+8000行代码

图片