复现顶刊图,换数据即可用!
本文分享Python实现CNS常见circos。
先看一些顶刊案例,
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()
以上构建了一个五层Circos图,依次展示hg38基因组上的Cytoband 信息、染色体区域的数值分布(包括散点图、柱状图和折线图),以及不同染色体区域之间的关联关系(和弦图)。
-END-
本期内容「绘图数据+代码+代码详细解释」已上传👉Python matplotlib保姆级教程
👇加入学习(备注:299)
more。。。。。。