Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
50f7de3
feat: add pycirclize plot wrappers
cvanelteren Jan 18, 2026
0a4d1e8
build: add pycirclize optional extras
cvanelteren Jan 18, 2026
07aabcb
test: add pycirclize wrapper smoke tests
cvanelteren Jan 18, 2026
6fb6d96
docs: add pycirclize plot type examples
cvanelteren Jan 18, 2026
e326c56
feat: integrate circos axes behavior
cvanelteren Jan 18, 2026
5f48425
test: cover circos delegation and sharing
cvanelteren Jan 18, 2026
bd57153
ci: add unit test coverage job
cvanelteren Jan 23, 2026
3fc94f7
test: add pycirclize integration coverage
cvanelteren Jan 24, 2026
d1f651d
test: expand pycirclize wrapper coverage
cvanelteren Jan 24, 2026
64e415c
test: deepen pycirclize coverage
cvanelteren Jan 24, 2026
c96a3ed
Add all to RTD build
cvanelteren Jan 24, 2026
7df7fb1
Add to env.yml
cvanelteren Jan 24, 2026
a3da046
feat: add pycirclize plot wrappers
cvanelteren Jan 18, 2026
4b3020b
test: add pycirclize wrapper smoke tests
cvanelteren Jan 18, 2026
e0a3d1c
Update circlize
cvanelteren Jan 24, 2026
adca8bb
Fix dirty branch
cvanelteren Jan 24, 2026
b753fca
Black formatting
cvanelteren Jan 24, 2026
b958569
Check if cache is causing visual diff
cvanelteren Jan 24, 2026
f2d7840
Use indexed version
cvanelteren Jan 24, 2026
02de644
ci: disable workflow caches for verification
cvanelteren Jan 24, 2026
7c4ec72
ci: restore workflow caches
cvanelteren Jan 24, 2026
fa5df3f
restore build to main
cvanelteren Jan 24, 2026
0f1d345
restore build to main
cvanelteren Jan 24, 2026
1652c51
ci: restore workflows from main
cvanelteren Jan 24, 2026
44d356e
docs: document optional all extra
cvanelteren Jan 24, 2026
121469d
packaging: include pycirclize by default and add minimal requirements
cvanelteren Jan 24, 2026
a2afa17
docs: note minimal install path
cvanelteren Jan 24, 2026
c6125d3
docs: add minimal install note to INSTALL
cvanelteren Jan 24, 2026
576580d
Merge branch 'main' into add-chord-diagram
cvanelteren Jan 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .readthedocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,5 @@ python:
install:
- method: pip
path: .
extra_requirements:
- all
8 changes: 8 additions & 0 deletions INSTALL.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@ with ``pip`` or ``conda`` as follows:
pip install ultraplot
conda install -c conda-forge ultraplot

The default install includes optional features (for example, pyCirclize-based plots).
For a minimal install, use ``--no-deps`` and install the core requirements:

.. code-block:: bash

pip install ultraplot --no-deps
pip install -r requirements-minimal.txt

Likewise, an existing installation of ultraplot can be upgraded to the latest version with:

.. code-block:: bash
Expand Down
8 changes: 8 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,14 @@ UltraPlot is published on `PyPi <https://pypi.org/project/ultraplot/>`__ and
pip install ultraplot
conda install -c conda-forge ultraplot

The default install includes optional features (for example, pyCirclize-based plots).
For a minimal install, use ``--no-deps`` and install the core requirements:

.. code-block:: bash

pip install ultraplot --no-deps
pip install -r requirements-minimal.txt

Likewise, an existing installation of UltraPlot can be upgraded
to the latest version with:

Expand Down
3 changes: 3 additions & 0 deletions docs/contributing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@ To build the documentation locally, use the following commands:
# ...or create a new conda environment
# conda env create -n ultraplot-dev --file docs/environment.yml
# source activate ultraplot-dev
# Minimal install (no optional dependencies)
# pip install ultraplot --no-deps
# pip install -r ../requirements-minimal.txt
# Create HTML documentation
make html

Expand Down
32 changes: 32 additions & 0 deletions docs/examples/plot_types/07_radar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""
Radar chart
===========

UltraPlot wrapper around pyCirclize's radar chart helper.
"""

import pandas as pd

import ultraplot as uplt

data = pd.DataFrame(
{
"Design": [3.5, 4.0],
"Speed": [4.2, 3.1],
"Reliability": [4.6, 4.1],
"Support": [3.2, 4.4],
},
index=["Model A", "Model B"],
)

fig, ax = uplt.subplots(proj="polar", refwidth=3.6)
ax.radar_chart(
data,
vmin=0,
vmax=5,
fill=True,
marker_size=4,
grid_interval_ratio=0.2,
)
ax.format(title="Product radar")
fig.show()
21 changes: 21 additions & 0 deletions docs/examples/plot_types/08_chord_diagram.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
"""
Chord diagram
=============

UltraPlot wrapper around pyCirclize chord diagrams.
"""

import pandas as pd

import ultraplot as uplt

matrix = pd.DataFrame(
[[10, 6, 2], [6, 12, 4], [2, 4, 8]],
index=["A", "B", "C"],
columns=["A", "B", "C"],
)

fig, ax = uplt.subplots(proj="polar", refwidth=3.6)
ax.chord_diagram(matrix, ticks_interval=None, space=4)
ax.format(title="Chord diagram")
fig.show()
15 changes: 15 additions & 0 deletions docs/examples/plot_types/09_phylogeny.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
"""
Phylogeny
=========

UltraPlot wrapper around pyCirclize phylogeny plots.
"""

import ultraplot as uplt

newick = "((A,B),C);"

fig, ax = uplt.subplots(proj="polar", refwidth=3.2)
ax.phylogeny(newick, leaf_label_size=10)
ax.format(title="Phylogeny")
fig.show()
34 changes: 34 additions & 0 deletions docs/examples/plot_types/10_circos_bed.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
"""
Circos from BED
===============

Build sectors from a BED file and render on UltraPlot polar axes.
"""

import tempfile
from pathlib import Path

import numpy as np

import ultraplot as uplt

bed_text = "chr1\t0\t100\nchr2\t0\t140\n"

with tempfile.TemporaryDirectory() as tmpdir:
bed_path = Path(tmpdir) / "mini.bed"
bed_path.write_text(bed_text, encoding="utf-8")

fig, ax = uplt.subplots(proj="polar", refwidth=3.6)
ax = ax[0] # pycirclize expects a PolarAxes, not a SubplotGrid wrapper
circos = ax.circos_bed(bed_path, plot=False)

for sector in circos.sectors:
x = np.linspace(sector.start, sector.end, 8)
y = np.linspace(0, 50, 8)
track = sector.add_track((60, 90), r_pad_ratio=0.1)
track.axis()
track.line(x, y)

circos.plotfig(ax=ax)
ax.format(title="BED sectors")
fig.show()
1 change: 1 addition & 0 deletions environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,4 @@ dependencies:
- lxml-html-clean
- pip:
- git+https://github.com/ultraplot/UltraTheme.git
- pycirclize
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ classifiers = [
dependencies= [
"numpy>=1.26.0",
"matplotlib>=3.9,<3.11",
"pycirclize>=1.10.1",
"typing-extensions; python_version < '3.12'",
]
dynamic = ["version"]
Expand Down
3 changes: 3 additions & 0 deletions requirements-minimal.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
numpy>=1.26.0
matplotlib>=3.9,<3.11
typing-extensions; python_version < "3.12"
Loading
Loading