相关文章推荐
风流倜傥的松鼠  ·  contentEditable,window ...·  2 年前    · 
悲伤的小马驹  ·  node.js搭建http2 ...·  2 年前    · 
严肃的火锅  ·  librosa ...·  2 年前    · 

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 数据准备

  • 第一圈的chromosome.bed 文件:
    共三列,染色体名,start,end。
  • CHR1 0       27139696
    CHR2 0       27139696
     
  • 第二圈和第四圈的gDMR.hyper.txt
    共4列,染色体ID,Start,End,值。
  • CHR1 1482   1487   0.167943
     
  • 基因密度
    根据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=
    pyCircos Circos是用于可视化基因组相似性和特征的最著名的软件之一。 但是,执行需要如此复杂的过程和许多额外的输入文件。 该软件也是基于Perl编写的。 它限制了与其他用于生物学分析的软件的集成。 Python中描述了各种生物数据分析。 但是,没有可以可视化Circospython软件。 已经组织了用于描述基因组注释的文件格式,例如GenBank,GFF。 因此,如果可以将这些格式化的文件用作可视化的输入,则无需准备复杂的额外文件。 在这里,它提供了一个基于python matplotlib的圆形基因组可视化程序PyCircos(化名)。 它使我们能够仅通过Genbank格式文件的输入来表示基因组特征。 此外,通过使用BLAST或LAST输入比较基因组分析结果,用户可以使用简单的python脚本轻松可视化多基因组基因座相似性。 python 3.6.2以后
    一直觉得circos 很好看,最近尝试了一下 对中间关系曲线的 绘制主要利用的数学工具是 贝塞尔曲线 但是对贝塞尔曲线中间的控制点取值 还是不太满意 造成部分曲线看着有点奇怪成品大概是这样代码如下:import matplotlib.pyplot as plt import numpy as np import pandas as pd import random Start1=[0 for ...
    #### 推荐使用的库 为了在 Python 中绘制 Circos ,`PyCirclize` 是一个非常合适的库。此库简化了创建复杂而美观的圆形布局表的过程[^1]。 #### 安装依赖项 首先需要安装 `pycirclize` 及其可能用到的相关: ```bash pip install pycirclize matplotlib pandas seaborn #### 数据准备 对于想要可视化的数据集来说,通常会涉及到多个维度之间的关系表达。例如,在微生物组学研究中,可以使用物种在不同样本中的相对丰度作为输入数据[^4]。这里假设有一个简单的表格形式的数据集,其中每一列代表不同的样本(如 A, B, C),每行则对应特定类别的数值(比如 Acetobacteraceae 科级别的分类单元)。这些数据应该被整理成适合处理的形式以便后续操作。 #### 示例代码:基于给定数据绘制基础版本的 Circos 下面是一个具体的例子来说明如何利用上述提到的技术栈实现这一目标: ```python import numpy as np import pandas as pd from pycirclize import CircosPlotter import matplotlib.pyplot as plt def prepare_data(): """Prepare sample data""" df = pd.DataFrame({ 'Sample_A': [87, 92, 65], 'Sample_B': [73, 88, 70], 'Sample_C': [68, 75, 80] }, index=['Species_X', 'Species_Y', 'Species_Z']) return df[df.max(axis=1)>0.01].T # Filter by abundance threshold and transpose dataframe if __name__ == "__main__": # Prepare the dataset data_df = prepare_data() # Initialize circos plot with sectors corresponding to samples cp = CircosPlotter.from_dataframe(data_df) # Add heatmap track for each species' relative abundances across all samples for i, col in enumerate(data_df.columns): values = data_df[col].values.tolist() colors = ['red' if v >= max(values)*0.8 else 'blue' for v in values] cp.add_heatmap_track( sector_name="all_samples", position=(f"{i*30}deg", f"{(i+1)*30}deg"), heights=values, facecolors=colors, edgecolor='white', linewidth=.5 fig, ax = plt.subplots(figsize=(8, 8)) cp.draw(ax=ax) plt.show() 这段脚本展示了怎样加载并预处理数据,初始化圆圈对象,并向其中添加热力条带以表示各个类别下的测量值分布情况。最终调用了绘函数生成像输出。