Package: pyryotype
pyryotypeTable of ContentspyryotypeAcknowledgementsInstallationExample usageYou want vertical? We got verticalCoverage plottingPAF plottingCNV from bamBandage friendly CSVLicenseCytoband dataAcknowledgementsHuge shout out to Ryan Dale (@daler) for the original work on the Ideograms -https://gist.github.com/daler/c98fc410282d7570efc3And @alexomics for the ground work on the coverage plotting and ideograms.Installationpip install ideogramExample usagefrompyryotypeimportGENOME,plot_ideogramfrommatplotlibimportpyplotaspltfig,axes=plt.subplots(ncols=1,nrows=22,figsize=(11,11),facecolor="white",)genome=GENOME.CHM13forax,contig_nameinzip(axes,range(1,23)):chromosome=f"chr{contig_name}"plot_ideogram(ax,target=chromosome,genome=genome)fig.savefig("ideogram.png",dpi=300)Will output:You want vertical? We got verticalWith Regions highlighted on Chromosome 1 - Optional! See the following testing code snippet for an exampledef test_23_vertical_chm13_regions()Will outputCoverage plottingCoverage plotting is designed to be used with the output ofMosdepth. The following example uses the output ofmosdepthto plot the coverage of chromosome 1. The region representing the first 100Mb of the chromosome is highlighted in black.frompathlibimportPathfrommatplotlibimportpyplotaspltfrommatplotlib.tickerimportEngFormatterimportpandasaspdfrompyryotype.coverageimportplot_coveragetest_cov_file=Path(__file__).parent/"static"/"chr1_cov.regions.bed.gz"fig,ax=plt.subplots(ncols=1,nrows=1,figsize=(11,2),)df=pd.read_csv(test_cov_file,sep="\t",names=["chromosome","start","end","value"])ax=plot_coverage(ax,df,"chr1",regions=[(0,100000000)],ylabel="Coverage",color="black")ax.set_xlabel("Genomic Position (bp)")# ax.yaxis.set_visible(False)ax.set_yticks([])ax.set_yticklabels([])forsidein("right","top","left"):ax.spines[side].set_visible(False)formatter=EngFormatter(unit='b',places=1)# Set formatter for the x-axisax.xaxis.set_major_formatter(formatter)fig.savefig("example_outputs/test_coverage.png",dpi=300,bbox_inches="tight")Will output something like:PAF plottingDesigned primarily to plot the alignment of assemblies to a reference genome. Must provide a valid PAF file.frommatplotlibimportpyplotaspltfromreadpafimportparse_paffrompathlibimportPathfrompyryotype.paf_plottingimportPAFProtocol,PlotMode,plot_paf_alignmentstest_paf=Path(__file__).parent/"static"/"test.paf"fig,ax=plt.subplots(ncols=1,nrows=1,figsize=(11,1),)ax=plot_paf_alignments(ax,parse_paf(test_paf.open()),target="chr1",mapq_filter=0,strict=PlotMode.STRICT,contig_colours=PlotMode.UNIQUE_COLOURS,)ax.set_xlabel("")# ax.yaxis.set_visible(False)ax.set_yticks([])ax.set_yticklabels([])forsidein("right","top","left"):ax.spines[side].set_visible(False)fig.savefig("tests/test_paf_plotting.png",dpi=300,bbox_inches="tight")Will output the following image:The colours assigned to each alignment can be changed to either be based on the Alignment Strand, or unique for each record. See the PlotModedocstringfor the options that can be applied.Supplementary mappings on the same chromosome/strand for a given sequence can be collapsed into a single line by settingstrict=PlotMode.STRICT.
This can be seen in the above mappings, where the large block is comprised of 3 separate alignments, from the same read. IFstrict=PlotMode.CHILLthen each alignment will be plotted separately, even if these alignments are from the same read. This looks like:There are now more options!
Chevrons representing the alignment strand can be added by settingchevron=PlotMode.CHEVRONSin theplot_paf_alignmentsfunction. Chevrons will only be drawn if the rendered alignment block is wide enough. The fontsize of the chevron can be set withkwargchevron_fontsize. An example image be seen in the following example:We can now expand multiple alignments that overlap onto separate tracks (a la IGV.)
This can be down by settingexpand=PlotMode.EXPANDandstrict=PlotMode.STRICT. This will expand overlapping alignments onto separate "tracks" on an axis. The number of tracks for a given axis can be set by thekwargargumentmax_tracks. If there are more overlapping alignments that there are tracks, the track with the smalles overlap will be chosen. This can be seen in the following example (which also has chevrons enabled):CNV from bamA separate repo calculates CNV from BAM files by binning alignment mapping starts and returning CNV by a dynamically calculated bin width.
See here for more detail -https://github.com/Adoni5/cnv_from_bamBandage friendly CSVFor visualising Genomes that provide GFA, we can take a PAF file of the genome aligned to a suitable reference,a nd output a
CSV for labelling the sequence nodes in bandage.
Seehttps://github.com/Adoni5/pyryotype/blob/ec2239cd0fac6ff57e3129cc52ac860d729c94e5/src/pyryotype/paf_tools.py#L114for more.[!NOTE]Note: For alignments with many supplementary alignments, the alignment is collapsed to the alignment that covers the largest area of a single contig on the reference.Licensepyryotypeis distributed under the terms of theMITlicense.Cytoband dataHG38 - Nushell, will have to be adapted for bashcurl -L "https://hgdownload.cse.ucsc.edu/goldenpath/hg38/database/cytoBand.txt.gz" | gzip -d - | rg -Ne "^chr\\d+\t" | save cytoBand_HG38.tsvCHM13 - bash yaycurl -L http://t2t.gi.ucsc.edu/chm13/hub/t2t-chm13-v2.0/download/chm13v2.0_cytobands_allchrs.bed.gz | gzip -d - > cytobands_chm13.bed