Package: pyCirclize
pyCirclize: Circular visualization in PythonTable of contentsOverviewInstallationAPI UsageCode ExampleNot Implemented FeaturesStar HistoryOverviewpyCirclize is a circular visualization python package implemented based on matplotlib.
This package is developed for the purpose of easily and beautifully plotting circular figure such as Circos Plot and Chord Diagram in Python.
In addition, useful genome and phylogenetic tree visualization methods for the bioinformatics field are also implemented.
pyCirclize was inspired bycirclizeandpyCircos.
More detailed documentation is availablehere.Fig.1 pyCirclize example plot galleryInstallationPython 3.8 or lateris required for installation.Install PyPI package:pip install pycirclizeInstall conda-forge package:conda install -c conda-forge pycirclizeAPI UsageAPI usage is described in each of the following sections in thedocument.Getting StartedPlot API ExampleChord DiagramCircos Plot (Genomics)Phylogenetic TreePlot TipsCode Example1. Circos PlotfrompycirclizeimportCircosimportnumpyasnpnp.random.seed(0)# Initialize Circos sectorssectors={"A":10,"B":15,"C":12,"D":20,"E":15}circos=Circos(sectors,space=5)forsectorincircos.sectors:# Plot sector namesector.text(f"Sector:{sector.name}",r=110,size=15)# Create x positions & random y valuesx=np.arange(sector.start,sector.end)+0.5y=np.random.randint(0,100,len(x))# Plot linestrack1=sector.add_track((80,100),r_pad_ratio=0.1)track1.xticks_by_interval(interval=1)track1.axis()track1.line(x,y)# Plot pointstrack2=sector.add_track((55,75),r_pad_ratio=0.1)track2.axis()track2.scatter(x,y)# Plot barstrack3=sector.add_track((30,50),r_pad_ratio=0.1)track3.axis()track3.bar(x,y)# Plot linkscircos.link(("A",0,3),("B",15,12))circos.link(("B",0,3),("C",7,11),color="skyblue")circos.link(("C",2,5),("E",15,12),color="chocolate",direction=1)circos.link(("D",3,5),("D",18,15),color="lime",ec="black",lw=0.5,hatch="//",direction=2)circos.link(("D",8,10),("E",2,8),color="violet",ec="red",lw=1.0,ls="dashed")circos.savefig("example01.png")2. Circos Plot (Genomics)frompycirclizeimportCircosfrompycirclize.utilsimportfetch_genbank_by_accidfrompycirclize.parserimportGenbank# Download `NC_002483` E.coli plasmid genbankgbk_fetch_data=fetch_genbank_by_accid("NC_002483")gbk=Genbank(gbk_fetch_data)# Initialize Circos instance with genome sizecircos=Circos(sectors={gbk.name:gbk.range_size})circos.text(f"Escherichia coli K-12 plasmid F\n\n{gbk.name}",size=14)circos.rect(r_lim=(90,100),fc="lightgrey",ec="none",alpha=0.5)sector=circos.sectors[0]# Plot forward strand CDSf_cds_track=sector.add_track((95,100))f_cds_feats=gbk.extract_features("CDS",target_strand=1)f_cds_track.genomic_features(f_cds_feats,plotstyle="arrow",fc="salmon",lw=0.5)# Plot reverse strand CDSr_cds_track=sector.add_track((90,95))r_cds_feats=gbk.extract_features("CDS",target_strand=-1)r_cds_track.genomic_features(r_cds_feats,plotstyle="arrow",fc="skyblue",lw=0.5)# Plot 'gene' qualifier label if existslabels,label_pos_list=[],[]forfeatingbk.extract_features("CDS"):start=int(str(feat.location.start))end=int(str(feat.location.end))label_pos=(start+end)/2gene_name=feat.qualifiers.get("gene",[None])[0]ifgene_nameisnotNone:labels.append(gene_name)label_pos_list.append(label_pos)f_cds_track.xticks(label_pos_list,labels,label_size=6,label_orientation="vertical")# Plot xticks (interval = 10 Kb)r_cds_track.xticks_by_interval(10000,outer=False,label_formatter=lambdav:f"{v/1000:.1f}Kb")circos.savefig("example02.png")3. Chord DiagramfrompycirclizeimportCircosimportpandasaspd# Create matrix dataframe (3 x 6)row_names=["F1","F2","F3"]col_names=["T1","T2","T3","T4","T5","T6"]matrix_data=[[10,16,7,7,10,8],[4,9,10,12,12,7],[17,13,7,4,20,4],]matrix_df=pd.DataFrame(matrix_data,index=row_names,columns=col_names)# Initialize Circos from matrix for plotting Chord Diagramcircos=Circos.initialize_from_matrix(matrix_df,space=5,cmap="tab10",label_kws=dict(size=12),link_kws=dict(ec="black",lw=0.5,direction=1),)circos.savefig("example03.png")4. Phylogenetic TreefrompycirclizeimportCircosfrompycirclize.utilsimportload_example_tree_file,ColorCyclerfrommatplotlib.linesimportLine2D# Initialize Circos from phylogenetic treetree_file=load_example_tree_file("large_example.nwk")circos,tv=Circos.initialize_from_tree(tree_file,r_lim=(30,100),leaf_label_size=5,line_kws=dict(color="lightgrey",lw=1.0),)# Define group-species dict for tree annotation# In this example, set minimum species list to specify group's MRCA nodegroup_name2species_list=dict(Monotremata=["Tachyglossus_aculeatus","Ornithorhynchus_anatinus"],Marsupialia=["Monodelphis_domestica","Vombatus_ursinus"],Xenarthra=["Choloepus_didactylus","Dasypus_novemcinctus"],Afrotheria=["Trichechus_manatus","Chrysochloris_asiatica"],Euarchontes=["Galeopterus_variegatus","Theropithecus_gelada"],Glires=["Oryctolagus_cuniculus","Microtus_oregoni"],Laurasiatheria=["Talpa_occidentalis","Mirounga_leonina"],)# Set tree line color & label colorColorCycler.set_cmap("tab10")group_name2color={name:ColorCycler()fornameingroup_name2species_list.keys()}forgroup_name,species_listingroup_name2species_list.items():color=group_name2color[group_name]tv.set_node_line_props(species_list,color=color,apply_label_color=True)# Plot figure & set legend on centerfig=circos.plotfig()_=circos.ax.legend(handles=[Line2D([],[],label=n,color=c)forn,cingroup_name2color.items()],labelcolor=group_name2color.values(),fontsize=6,loc="center",bbox_to_anchor=(0.5,0.5),)fig.savefig("example04.png")Not Implemented FeaturesList of features implemented in other Circos plotting tools but not yet implemented in pyCirclize.
I may implement them when I feel like it.Plot histogramPlot boxplotPlot violinLabel position auto adjustmentStar History