diff --git a/README.md b/README.md index 4cf1bbb77..925a7a680 100644 --- a/README.md +++ b/README.md @@ -219,7 +219,7 @@ To learn more about the docker pull rate limits and the open source software pro | [Porechop](https://hub.docker.com/r/staphb/porechop/)
[![docker pulls](https://badgen.net/docker/pulls/staphb/porechop)](https://hub.docker.com/r/staphb/porechop) | | https://github.com/rrwick/Porechop | | [PPanGGOLiN](https://hub.docker.com/r/staphb/ppanggolin/)
[![docker pulls](https://badgen.net/docker/pulls/staphb/ppanggolin)](https://hub.docker.com/r/staphb/ppanggolin) | | https://github.com/labgem/PPanGGOLiN | | [Prokka](https://hub.docker.com/r/staphb/prokka/)
[![docker pulls](https://badgen.net/docker/pulls/staphb/prokka)](https://hub.docker.com/r/staphb/prokka) | | https://github.com/tseemann/prokka | -| [pyCirclize](https://hub.docker.com/r/staphb/pycirclize/)
[![docker pulls](https://badgen.net/docker/pulls/staphb/pycirclize)](https://hub.docker.com/r/staphb/pycirclize) | | https://github.com/moshi4/pyCirclize | +| [pyCirclize](https://hub.docker.com/r/staphb/pycirclize/)
[![docker pulls](https://badgen.net/docker/pulls/staphb/pycirclize)](https://hub.docker.com/r/staphb/pycirclize) | | https://github.com/moshi4/pyCirclize | | [pyGenomeViz](https://hub.docker.com/r/staphb/pygenomeviz/)
[![docker pulls](https://badgen.net/docker/pulls/staphb/pygenomeviz)](https://hub.docker.com/r/staphb/pygenomeviz) | | https://github.com/moshi4/pyGenomeViz | | [QUAST](https://hub.docker.com/r/staphb/quast/)
[![docker pulls](https://badgen.net/docker/pulls/staphb/quast)](https://hub.docker.com/r/staphb/quast) | | https://github.com/ablab/quast | | [QuickSNP](https://hub.docker.com/r/staphb/quicksnp/)
[![docker pulls](https://badgen.net/docker/pulls/staphb/quicksnp)](https://hub.docker.com/r/staphb/quicksnp) | | https://github.com/k-florek/QuickSNP | diff --git a/pycirclize/1.2.0/Dockerfile b/pycirclize/1.2.0/Dockerfile new file mode 100644 index 000000000..ffb4843c4 --- /dev/null +++ b/pycirclize/1.2.0/Dockerfile @@ -0,0 +1,39 @@ +FROM python:3.9.17-slim as app + +ARG PYCIRCLIZE_VER="1.2.0" + +# 'LABEL' instructions tag the image with metadata that might be important to the user +LABEL base.image="python:3.9.17-slim" +LABEL dockerfile.version="1" +LABEL software="pyCirclize" +LABEL software.version="${PYCIRCLIZE_VER}" +LABEL description="Circular visualization in Python" +LABEL website="https://github.com/moshi4/pyCirclize" +LABEL license="https://github.com/moshi4/pyCirclize/blob/main/LICENSE" +LABEL maintainer="Erin Young" +LABEL maintainer.email="eriny@utah.gov" + +RUN apt-get update && apt-get install -y --no-install-recommends \ + procps && \ + apt-get autoclean && rm -rf /var/lib/apt/lists/* + +RUN pip install --no-cache pycirclize==${PYCIRCLIZE_VER} + +ENV PATH=$PATH \ + LC_ALL=C + +CMD pip show pycirclize + +WORKDIR /data + +FROM app as test + +WORKDIR /test + +RUN pip show pycirclize + +COPY /tests/* /test/ + +RUN python example1.py && ls example01.png && \ + python example2.py && ls example02.png && \ + python example3.py && ls example03.png \ No newline at end of file diff --git a/pycirclize/1.2.0/README.md b/pycirclize/1.2.0/README.md new file mode 100644 index 000000000..e574bb7aa --- /dev/null +++ b/pycirclize/1.2.0/README.md @@ -0,0 +1,61 @@ +# pyCirclize container + +Main tool: [pyCirclize](https://pypi.org/project/pyCirclize/) + +Code repository: https://github.com/moshi4/pyCirclize + +Basic information on how to use this tool: +- executable: NA +- help: NA +- version: NA +- description: pyCirclize is a python package for creating visual images of circular genomes (like those of bacteria) + +Full documentation: https://pypi.org/project/pyCirclize/ + +## Example Usage + +This is for running containers with a specific python package, and is not really meant to be run from the command line. Instead, a bioinformatician could create a python script that uses pycirclize. + +example1.py: +```python +from pycirclize import Circos +import numpy as np +np.random.seed(0) + +# Initialize Circos sectors +sectors = {"A": 10, "B": 15, "C": 12, "D": 20, "E": 15} +circos = Circos(sectors, space=5) + +for sector in circos.sectors: + # Plot sector name + sector.text(f"Sector: {sector.name}", r=110, size=15) + # Create x positions & random y values + x = np.arange(sector.start, sector.end) + 0.5 + y = np.random.randint(0, 100, len(x)) + # Plot lines + track1 = sector.add_track((80, 100), r_pad_ratio=0.1) + track1.xticks_by_interval(interval=1) + track1.axis() + track1.line(x, y) + # Plot points + track2 = sector.add_track((55, 75), r_pad_ratio=0.1) + track2.axis() + track2.scatter(x, y) + # Plot bars + track3 = sector.add_track((30, 50), r_pad_ratio=0.1) + track3.axis() + track3.bar(x, y) + +# Plot links +circos.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") +``` + +```bash +python example1.py +``` \ No newline at end of file diff --git a/pycirclize/1.2.0/tests/example1.py b/pycirclize/1.2.0/tests/example1.py new file mode 100755 index 000000000..2833e5532 --- /dev/null +++ b/pycirclize/1.2.0/tests/example1.py @@ -0,0 +1,36 @@ +from pycirclize import Circos +import numpy as np +np.random.seed(0) + +# Initialize Circos sectors +sectors = {"A": 10, "B": 15, "C": 12, "D": 20, "E": 15} +circos = Circos(sectors, space=5) + +for sector in circos.sectors: + # Plot sector name + sector.text(f"Sector: {sector.name}", r=110, size=15) + # Create x positions & random y values + x = np.arange(sector.start, sector.end) + 0.5 + y = np.random.randint(0, 100, len(x)) + # Plot lines + track1 = sector.add_track((80, 100), r_pad_ratio=0.1) + track1.xticks_by_interval(interval=1) + track1.axis() + track1.line(x, y) + # Plot points + track2 = sector.add_track((55, 75), r_pad_ratio=0.1) + track2.axis() + track2.scatter(x, y) + # Plot bars + track3 = sector.add_track((30, 50), r_pad_ratio=0.1) + track3.axis() + track3.bar(x, y) + +# Plot links +circos.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") \ No newline at end of file diff --git a/pycirclize/1.2.0/tests/example2.py b/pycirclize/1.2.0/tests/example2.py new file mode 100755 index 000000000..406b67773 --- /dev/null +++ b/pycirclize/1.2.0/tests/example2.py @@ -0,0 +1,42 @@ +from pycirclize import Circos +from pycirclize.utils import fetch_genbank_by_accid +from pycirclize.parser import Genbank + +# Download `NC_002483` E.coli plasmid genbank +gbk_fetch_data = fetch_genbank_by_accid("NC_002483") +gbk = Genbank(gbk_fetch_data) + +# Initialize Circos instance with genome size +circos = 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 CDS +f_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 CDS +r_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 exists +labels, label_pos_list = [], [] +for feat in gbk.extract_features("CDS"): + start = int(str(feat.location.start)) + end = int(str(feat.location.end)) + label_pos = (start + end) / 2 + gene_name = feat.qualifiers.get("gene", [None])[0] + if gene_name is not None: + 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=lambda v: f"{v/1000:.1f} Kb" +) + +circos.savefig("example02.png") \ No newline at end of file diff --git a/pycirclize/1.2.0/tests/example3.py b/pycirclize/1.2.0/tests/example3.py new file mode 100755 index 000000000..72bd3fcaa --- /dev/null +++ b/pycirclize/1.2.0/tests/example3.py @@ -0,0 +1,23 @@ +from pycirclize import Circos +import pandas as pd + +# 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 Diagram +circos = 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") \ No newline at end of file