moshi4
pyGenomeViz
Python

A genome visualization python package for comparative genomics

Last updated Jun 24, 2026
412
Stars
25
Forks
3
Issues
0
Stars/day
Attention Score
90
Language breakdown
Python 90.7%
HTML 4.7%
JavaScript 4.5%
Dockerfile 0.1%
Files click to expand
README

pyGenomeViz

Python3 OS License Latest PyPI version conda-forge CI

Table of contents

Overview

pyGenomeViz is a genome visualization python package for comparative genomics implemented based on matplotlib. This package is developed for the purpose of easily and beautifully plotting genomic features and sequence similarity comparison links between multiple genomes. It supports genome visualization of Genbank/GFF format file and can be saved figure in various formats (JPG/PNG/SVG/PDF/HTML). User can use pyGenomeViz for interactive genome visualization figure plotting on jupyter notebook, or automatic genome visualization figure plotting in genome analysis scripts/workflow.

For more information, please see full documentation here.

pygenomeviz</em>gallery.png Fig.1 pyGenomeViz example plot gallery

pygenomeviz</em>gui.gif Fig.2 pyGenomeViz web application example (Demo Page)

Installation

Python 3.10 or later is required for installation.

Install PyPI package:

pip install pygenomeviz

Install conda-forge package:

conda install -c conda-forge pygenomeviz

Use Docker (Image Registry):

docker run -it --rm -p 8501:8501 ghcr.io/moshi4/pygenomeviz:latest pgv-gui -h

API Examples

Jupyter notebooks containing code examples below is available here.

Features

from pygenomeviz import GenomeViz

gv = GenomeViz() gv.setscalexticks(ymargin=0.5)

track = gv.addfeaturetrack("track", 1000) track.add_sublabel()

Add features to track

track.add_feature(50, 200, 1) track.add_feature(250, 460, -1, fc="blue") track.add_feature(500, 710, 1, fc="lime", lw=1.0) track.add_feature(750, 960, 1, fc="magenta", lw=1.0, ec="grey", hatch="//")

gv.savefig("features.png")

features.png

Styled Features

from pygenomeviz import GenomeViz

gv = GenomeViz() gv.setscalebar(ymargin=0.5)

track = gv.addfeaturetrack("track", (1000, 2000)) track.add_sublabel()

Add styled features

track.add_feature(1000, 1100, 1, label="arrow") track.add_feature(1120, 1220, -1, plotstyle="bigarrow", label="bigarrow", fc="red", lw=1) track.add_feature(1240, 1340, 1, plotstyle="box", label="box", fc="blue") track.add_feature(1360, 1480, 1, plotstyle="bigbox", label="bigbox", fc="limegreen") track.add_feature(1500, 1620, -1, plotstyle="rbox", label="rbox", fc="magenta", ec="blue", lw=1) track.add_feature(1640, 1740, -1, plotstyle="bigrbox", label="bigrbox", fc="grey") track.addfeature(1760, 1860, 1, fc="lime", hatch="o", arrowshaft_ratio=0.2, label="arrow shaft = 0.2") track.addfeature(1880, 1980, 1, fc="lime", hatch="/", arrowshaft_ratio=1.0, label="arrow shaft = 1.0")

gv.savefig("styled_features.png")

styled</em>features.png

Tracks & Links

from pygenomeviz import GenomeViz

genome_list = [ ("genome 01", 1000, [(150, 300, 1), (500, 700, -1), (750, 950, 1)]), ("genome 02", 1300, [(50, 200, 1), (350, 450, 1), (700, 900, -1), (950, 1150, -1)]), ("genome 03", 1200, [(150, 300, 1), (350, 450, -1), (500, 700, -1), (700, 900, -1)]), ]

gv = GenomeViz(figtrackheight=0.7, trackaligntype="center") gv.setscalebar()

Set tracks & features

for genome in genome_list: name, size, features = genome[0], genome[1], genome[2] track = gv.addfeaturetrack(name, size) track.add_sublabel() for idx, feature in enumerate(features, 1): start, end, strand = feature track.addfeature(start, end, strand, plotstyle="bigarrow", lw=1, label=f"gene{idx:02d}", textkws=dict(rotation=0, vpos="top", hpos="center"))

Add links between "genome 01" and "genome 02"

gv.add_link(("genome 01", 150, 300), ("genome 02", 50, 200)) gv.add_link(("genome 01", 700, 500), ("genome 02", 900, 700)) gv.add_link(("genome 01", 750, 950), ("genome 02", 1150, 950))

Add links between "genome 02" and "genome 03"

gv.addlink(("genome 02", 50, 200), ("genome 03", 150, 300), color="skyblue", invertedcolor="lime", curve=True) gv.addlink(("genome 02", 350, 450), ("genome 03", 450, 350), color="skyblue", invertedcolor="lime", curve=True) gv.addlink(("genome 02", 900, 700), ("genome 03", 700, 500), color="skyblue", invertedcolor="lime", curve=True) gv.addlink(("genome 03", 900, 700), ("genome 02", 1150, 950), color="skyblue", invertedcolor="lime", curve=True)

gv.savefig("tracksandlinks.png")

tracks<em>and</em>links.png

Exon Features

from pygenomeviz import GenomeViz

exon_regions1 = [(0, 210), (300, 480), (590, 800), (850, 1000), (1030, 1300)] exon_regions2 = [(1500, 1710), (2000, 2480), (2590, 2800)] exon_regions3 = [(3000, 3300), (3400, 3690), (3800, 4100), (4200, 4620)]

gv = GenomeViz() track = gv.addfeaturetrack("track", 5000)

Add exon features

track.addexonfeature(exonregions1, strand=1, plotstyle="box", label="box", textkws=dict(rotation=0, hpos="center")) track.addexonfeature(exonregions2, strand=-1, plotstyle="arrow", label="arrow", textkws=dict(rotation=0, vpos="bottom", hpos="center"), patchkws=dict(fc="darkgrey"), intronpatch_kws=dict(ec="red")) track.addexonfeature(exonregions3, strand=1, plotstyle="bigarrow", label="bigarrow", textkws=dict(rotation=0, hpos="center"), patch_kws=dict(fc="lime", lw=1))

gv.savefig("exon_features.png")

exon</em>features.png

Genbank Features

from pygenomeviz import GenomeViz
from pygenomeviz.parser import Genbank
from pygenomeviz.utils import loadexamplegenbank_dataset

Parse Genbank file

gbkfiles = loadexamplegenbankdataset("yersinia_phage") gbk = Genbank(gbk_files[0])

gv = GenomeViz(figtrackheight=0.7) gv.setscalebar(ymargin=0.5)

track = gv.addfeaturetrack(gbk.name, gbk.get_seqid2size())

for seg in track.segments: # Plot CDS features features = gbk.get_seqid2features()[seg.name] seg.add_features(features, lw=0.5) seg.add_sublabel()

gv.savefig("genbank_features.png")

genbank</em>features.png

GFF Features

from pygenomeviz import GenomeViz
from pygenomeviz.parser import Gff
from pygenomeviz.utils import loadexamplegff_file

gfffile = loadexamplegfffile("escherichia_coli.gff.gz") gff = Gff(gff_file)

gv = GenomeViz() gv.setscalebar(ymargin=0.5)

target_ranges = ((215000, 230000), (300000, 320000)) track = gv.addfeaturetrack(name=gff.name, segments=target_ranges) track.setsegmentsep()

for segment in track.segments: segment.add_sublabel() features = gff.extractfeatures(featuretype=None, target_range=segment.range) for feature in features: if feature.type == "CDS": segment.addfeatures(feature, labeltype="gene", fc="skyblue", lw=1.0, annotation=True, text_kws=dict(bbox=dict(boxstyle="round", fc="skyblue"))) elif feature.type == "rRNA": segment.addfeatures(feature, labeltype="product", fc="lime", lw=1.0, hatch="//", annotation=True, text_kws=dict(bbox=dict(boxstyle="round", fc="lime")))

gv.savefig("gff_features.png")

gff</em>features.png

GFF Contigs

from pygenomeviz import GenomeViz
from pygenomeviz.parser import Gff
from pygenomeviz.utils import loadexamplegfffile, ispseudo_feature

gfffile = loadexamplegfffile("mycoplasma_mycoides.gff") gff = Gff(gff_file)

gv = GenomeViz(figtrackheight=0.5, featuretrackratio=0.5) gv.setscalexticks(labelsize=10)

Plot CDS, rRNA features for each contig to tracks

for seqid, size in gff.get_seqid2size().items(): track = gv.addfeaturetrack(seqid, size, labelsize=15) track.add_sublabel(size=10, color="grey") cdsfeatures = gff.getseqid2features(feature_type="CDS")[seqid] # CDS: blue, CDS(pseudo): grey for cdsfeature in cdsfeatures: color = "grey" if ispseudofeature(cds_feature) else "blue" track.addfeatures(cdsfeature, color=color) # rRNA: lime rrnafeatures = gff.getseqid2features(feature_type="rRNA")[seqid] track.addfeatures(rrnafeatures, color="lime")

gv.savefig("gff_contigs.png")

gff</em>contigs.png

Genbank Comparison by BLAST

from pygenomeviz import GenomeViz
from pygenomeviz.parser import Genbank
from pygenomeviz.utils import loadexamplegenbank_dataset
from pygenomeviz.align import Blast, AlignCoord

gbkfiles = loadexamplegenbankdataset("yersinia_phage") gbklist = list(map(Genbank, gbkfiles))

gv = GenomeViz(trackaligntype="center") gv.setscalebar()

Plot CDS features

for gbk in gbk_list: track = gv.addfeaturetrack(gbk.name, gbk.getseqid2size(), alignlabel=False) for seqid, features in gbk.get_seqid2features("CDS").items(): segment = track.get_segment(seqid) segment.add_features(features, plotstyle="bigarrow", fc="limegreen", lw=0.5)

Run BLAST alignment & filter by user-defined threshold

aligncoords = Blast(gbklist, seqtype="protein").run() aligncoords = AlignCoord.filter(aligncoords, lengththr=100, identitythr=30)

Plot BLAST alignment links

if len(align_coords) > 0: minident = int(min([ac.identity for ac in aligncoords if ac.identity])) color, inverted_color = "grey", "red" for ac in align_coords: gv.addlink(ac.querylink, ac.reflink, color=color, invertedcolor=invertedcolor, v=ac.identity, vmin=minident) gv.setcolorbar([color, invertedcolor], vmin=min_ident)

gv.savefig("genbankcomparisonby_blast.png")

genbank</em>comparison<em>by</em>blast.png

CLI Examples

pyGenomeViz provides CLI workflows for genome alignment result visualization of Genbank genomes using BLAST / MUMmer / MMseqs / progressiveMauve, respectively.

BLAST CLI Workflow

See pgv-blast document for details.

# Download example dataset
pgv-download yersinia_phage

Run BLAST CLI workflow

pgv-blast NC070914.gbk NC070915.gbk NC070916.gbk NC070918.gbk \ -o pgv-blastexample --seqtype protein --showscale_bar --curve \ --featurelinewidth 0.3 --lengththr 100 --identity_thr 30

pgv-blast</em>example2.png

MUMmer CLI Workflow

See pgv-mummer document for details.

# Download example dataset
pgv-download mycoplasma_mycoides

Run MUMmer CLI workflow

pgv-mummer GCF000023685.1.gbff GCF000800785.1.gbff GCF000959055.1.gbff GCF000959065.1.gbff \ -o pgv-mummerexample --showscale_bar --curve \ --feature_type2color CDS:blue rRNA:lime tRNA:magenta

pgv-mummer</em>example3.png

MMseqs CLI Workflow

See pgv-mmseqs document for details.

# Download example dataset
pgv-download enterobacteria_phage

Run MMseqs CLI workflow

pgv-mmseqs NC013600.gbk NC016566.gbk NC019724.gbk NC024783.gbk NC028901.gbk NC031081.gbk \ -o pgv-mmseqsexample --showscalebar --curve --featurelinewidth 0.3 \ --featuretype2color CDS:skyblue --normallinkcolor chocolate --invertedlink_color limegreen

pgv-mmseqs</em>example2.png

progressiveMauve CLI Workflow

See pgv-pmauve document for details.

# Download example dataset
pgv-download escherichia_coli

Run progressiveMauve CLI workflow

pgv-pmauve NC000913.gbk.gz NC002695.gbk.gz NC011751.gbk.gz NC011750.gbk.gz \ -o pgv-pmauveexample --showscale_bar

pgv-pmauve</em>example1.png

GUI (Web Application)

pyGenomeViz implements GUI (Web Application) functionality using streamlit as an option. Users can easily visualize the genomic features in Genbank files and their comparison results with GUI (Demo Page). See pgv-gui document for details.

pygenomeviz</em>gui.gif

HTML Viewer

pyGenomeViz implements HTML viewer output functionality for interactive data visualization. In API, HTML file can be output using savefig_html method. In CLI, user can select HTML file output option. As shown below, pan/zoom, tooltip display, object color change, text change, etc are available in HTML viewer (Demo Page1, Demo Page2).

pgv-viewer-demo.gif

Following libraries were used to implement HTML viewer.

Inspiration

pyGenomeViz was inspired by

Circular Genome Visualization

pyGenomeViz is a python package designed for linear genome visualization. If you are interested in circular genome visualization, check out my other python package pyCirclize.

pycirclize</em>example.png Fig. pyCirclize example plot gallery

Star History

Star History Chart

🔗 More in this category

© 2026 GitRepoTrend · moshi4/pyGenomeViz · Updated daily from GitHub