Skip to content

Repository files navigation

igvplot

IGV-style BAM read pileup, coverage, gene features, sashimi junctions and epigenetic base modifications in matplotlib — built on pysam and dna_features_viewer.

Reads, coverage and genes are stacked on shared x-axes so genomic positions line up exactly, with per-base mismatch / insertion / deletion detail, IGV colouring, and base-resolution zoom.

Contents


Install

pip install -e .
# optional: GFF/GTF feature support
pip install -e ".[gff]"

Requires pysam, matplotlib, numpy, dna-features-viewer, biopython.

Quick start

import igvplot

view = igvplot.plot_view(
    bam_path="sample.bam",
    region="chr1:1,000-2,000",        # 1-based inclusive
    features="annotation.gb",
    reference="genome.fa",
    sites={1050: "m6A"},
    sashimi=True,
    out_path="locus.png",             # fig = view.render() to keep it in memory
)

Or stack tracks fluently with the IGV builder (IGV == GenomeView == AlignmentView):

from igvplot import IGV

igv = (
    IGV("chr1:1,000-2,000", reference="genome.fa", dpi=150)
    .add_sashimi("rna.bam")
    .add_coverage("rna.bam")
    .add_reads("rna.bam", color_by="pairOrientation", group_by="strand",
               link_mates=True, view_as_pairs=True, show_soft_clips=True)
    .add_features("annotation.gb")
    .add_sequence("genome.fa")
    .add_sites({1050: "m6A"})
    .add_base_mods({1050: (1, "m6A")})
    .add_highlight_regions([(1050, 1080)])
)
igv.savefig("locus.png")

Gallery

Every figure below is produced by examples/generate_gallery.py from the synthetic data in data/.

Default view

Sashimi arcs → gene arrows → coverage (+ variant pile) → aligned reads → reference sequence.

default view

Alignment & colouring

Base-level zoom — every read base as a letter, aligned to a colour-coded reference row, so SNPs, insertions (+) and deletions () are read position by position.

base-level zoom

Colour and cluster reads by attribute via color_by / group_by; link_mates draws a mate connector and view_as_pairs joins a fragment on one row (IGV "view as pairs").

pair orientation + strand read group mapping quality
pair orientation read group mapq

Epigenetics

Strand-aware m6A / m5C / … markers (add_base_mods), reads coloured by the modification they span (color_by="basemod"), per-base variant fraction, modification stoichiometry and IUPAC motif (DRACH) tracks.

The m6A example below uses GLORI (a negative method): the reagent converts every unmodified A→G (and its reverse-strand complement T→C), but an m6A keeps its own base. The per-base conversion track dips to ~0% exactly at the m6A sites, and reads are coloured by strand with the converted bases in red.

m6A GLORI: converted reads + per-base A→G / T→C conversion

Base-resolution zoom at the forward-gene m6A sites — the A→G conversions are readable letter-by-letter while the m6A sites (chrM6A:250 & 350) keep their A:

m6A GLORI zoom: A→G conversions around m6A sites

per-base VAF / mod stoichiometry / motifs

Multi-sample comparison

Overlay coverage, comparison sashimi (add_sashimi_overlay), strand-specific coverage (add_coverage_strands) and reads (add_reads_overlay) from several samples on shared axes, then shade regions of interest.

multi-sample overlay

multi-sample comparison

Hi-C & domains

Scale bar + contact heatmap + TAD boundaries + genes + coverage + reads.

Hi-C multi-track

Variants

One centred plot per variant, with the variant allele fraction in the title and the base change called out at the site.

variant VAF

Utility tracks

A generic signal (.add_signal), GC content (.add_gc), interaction arcs (.add_arc), variants (.add_variants) and a fully custom track (.add_track).

signal / GC / loops / variants / custom

Python API

  • plot_view(...) — one-call convenience (see Quick start).
  • IGV / GenomeView / AlignmentView — fluent builder; every add_* returns self, and call order = top-to-bottom track order.
  • summary(bam, region, reference) — region QC stats.
  • set_font_size(n) / apply_theme() — styling.

Full signature reference: docs/api.md.

Command line

igvplot sample.bam chr1:1,000-2,000 -o locus.png \
    --features annotation.gb -r genome.fa \
    --sites sites.bed --sashimi --link-mates --view-as-pairs \
    --color-by pairOrientation --group-by strand --show-sequence \
    --coverage-strand --variants variants.vcf --gc

Variant batch (one figure per VCF/BED site, with VAF):

igvplot sample.bam --vcf variants.vcf -r genome.fa --window 100 \
    --prefix variant --sort-by-variant --vaf

Other flags: --insert-length/--read-length were removed as non-track QC plots; --fontSize N, --display-mode, --sort-by, --basemod, --highlight-regions, --bigwig, --version are available.

Reference

Region chr1:1,000-2,000 (1-based inclusive), (chrom, start, end) tuple, or Region. Internal coords are 0-based, half-open.
Read modes color_by: strand · firstOfPairStrand · pairOrientation · readgroup · mapq · insert/tlen · unexpectedPair · proper · mate · basemod · tag:NAME (any BAM tag, e.g. tag:CB for single-cell barcodes) · none. group_by clusters reads vertically (also tag:NAME); sort_by: start · strand · mapq · insert · mate_start · name.
Display display_mode: expanded · squished · full. show_all_bases for base resolution, show_soft_clips, link_mates, view_as_pairs (IGV "view as pairs"), highlight={...}.
Tracks .add_reads · .add_reads_overlay · .add_coverage · .add_coverage_strands · .add_coverage_overlay · .add_sashimi · .add_sashimi_overlay · .add_junctions_bed (junction BED or STAR SJ.out.tab) · .add_bedpe (SV/loop arcs) · .add_signal · .add_gc · .add_variants · .add_variant_fraction · .add_mod_fraction · .add_motifs · .add_arc · .add_track · .add_features · .add_sequence · .add_bed_features · .add_hic · .add_tads · .add_scale_bar · .add_sites · .add_base_mods · .add_highlight_regions
Stats igvplot.summary(bam, region, reference) → reads, depth, variant/indel/junction counts, insert-size median.
Styling set_font_size(n) / --fontSize n scales every label; set_title, set_legend, figsize, dpi.

MIT — see LICENSE.

Regenerate the gallery

python examples/generate_gallery.py     # or: make gallery

Docs and development

  • docs/api.md — full API reference (regions, every track method, stats, CLI).
  • CONTRIBUTING.md — setup, style, module map.
  • CHANGELOG.md — release history.
  • CI runs ruff lint + tests (warnings-as-errors) + a wheel build on every push (.github/workflows/ci.yml).
pip install -e ".[dev]"        # build, pytest, pytest-cov
python -m pytest -q            # run the test suite
# or: make test / make lint / make gallery / make build

Releases

python scripts/bump_version.py --patch   # bump to v0.1.1 (update pyproject + __init__)
python scripts/bump_version.py --patch --tag   # bump, commit, tag v0.1.1
git push && git push --tags             # tag triggers .github/workflows/release.yml

Pushing a v* tag builds the wheel + sdist, verifies the wheel imports, and uploads the artifacts to a GitHub Release.

About

No description, website, or topics provided.

Resources

Contributing

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages