Skip to content

Releases: Ultraplot/UltraPlot

Bug fixes for Geo dms coordinates and reverse colors/colormaps

02 Jul 14:30
9a1f616
Compare
Choose a tag to compare

What's Changed

Full Changelog: v1.57.1...v1.57.2

Zenodo release

24 Jun 21:37
253dd7f
Compare
Choose a tag to compare

This PR integrates Zenodo with the UltraPlot repository to enable citation via DOI.

From now on, every GitHub release will be archived by Zenodo and assigned a unique DOI, allowing researchers and users to cite UltraPlot in a standardized, persistent way.

We’ve also added a citation file and BibTeX entry for convenience. Please refer to the GitHub “Cite this repository” section or use the provided BibTeX in your work.

This marks an important step in making UltraPlot more visible and citable in academic and scientific publications.

🔗 DOI: https://doi.org/10.5281/zenodo.15733565

Cite as

@software{vanElteren2025,
  author       = {Casper van Elteren and Matthew R. Becker},
  title        = {UltraPlot: A succinct wrapper for Matplotlib},
  year         = {2025},
  version      = {1.57.1},
  publisher    = {GitHub},
  url          = {https://github.com/Ultraplot/UltraPlot}
}

What's Changed

Full Changelog: v1.57...v1.57.1

v1.57 Support matplotlib 3.10 and python 3.13

16 Jun 14:40
5e837ba
Compare
Choose a tag to compare

What's Changed

Full Changelog: v1.56...v1.57

v1.56 🐝 Feature addition: Beeswarm plot

13 Jun 10:04
44df33a
Compare
Choose a tag to compare

We are introducing a new plot type with this release: a beeswarm plot. A beeswarm plot is a data visualization technique that displays individual data points in a way that prevents overlap while maintaining their relationship to categorical groups, creating a distinctive "swarm" pattern that resembles bees clustering around a hive.

Unlike traditional box plots or violin plots that aggregate data, beeswarm plots show every individual observation, making them ideal for datasets with moderate sample sizes where you want to see both individual points and overall distribution patterns, identify outliers clearly, and compare distributions across multiple categories without losing any information through statistical summaries.

This plot mimics the beeswarm from SHAP library, but lacks the more sophisticated patterns they apply such as inline group clustering. UltraPlot does not aim to add these features but instead provide an interface that is simpler that users can tweak to their hearts desires.

tmp

snippet
import ultraplot as uplt, numpy as np

# Create mock data
n_points, n_features = 50, 4
features = np.arange(n_features)
data = np.empty((n_points, n_features))
feature_values = np.repeat(
    features,
    n_points,
).reshape(data.shape)

for feature in features:
    data[:, feature] = np.random.normal(feature * 1.5, 0.6, n_points)

cmap = uplt.Colormap(uplt.rc["cmap.diverging"])

# Create plot and style
fig, (left, right) = uplt.subplots(ncols=2, share=0)
left.beeswarm(
    data,
    orientation="vertical",
    alpha=0.7,
    cmap=cmap,
)
left.format(
    title="Traditional Beeswarm Plot",
    xlabel="Category",
    ylabel="Value",
    xticks=features,
    xticklabels=["Group A", "Group B", "Group C", "Group D"],
)
right.beeswarm(
    data,
    feature_values=feature_values,
    cmap=cmap,
    colorbar="right",
)
right.format(
    title="Feature Value Beeswarm Plot",
    xlabel="SHAP Value",
    yticks=features,
    yticklabels=["A", "B", "C", "D"],
    ylabel="Feature",
)
uplt.show(block=1)

What's Changed

Full Changelog: V1.55...v1.56

V1.55. Bug fixes.

04 Jun 13:42
3c6b0fa
Compare
Choose a tag to compare

This release continues our ongoing mission to squash pesky bugs and make your plotting experience smoother and more intuitive.

✨ New Features

  • Centered Labels for pcolormesh
    You can now enable center_labels when using pcolormesh, making it easier to annotate discrete diverging colormaps—especially when including zero among the label values. Ideal for visualizing data with meaningful central thresholds.

  • Direct Bar Labels for bar and hbar
    Bar labels can now be added directly via the bar and hbar commands. No more extra steps—just call the method and get your labeled bars out of the box.

🐞 Bug Fixes

Various internal improvements and minor bug fixes aimed at ensuring a more robust and predictable plotting experience.

As always, thank you for using UltraPlot! Feedback, issues, and contributions are welcome.

What's Changed

Full Changelog: v1.50.2...V1.55

v1.50.2

20 May 11:31
d9d13bd
Compare
Choose a tag to compare

What's Changed

Full Changelog: v1.50.1...v1.50.2

v1.50.1

12 May 13:03
680800f
Compare
Choose a tag to compare

What's Changed

  • fix: specify import exception type and add typing-extensions to deps by @beckermr in #212

Full Changelog: v1.50...v1.50.1

v1.50: Networks, lollipops and sharing

11 May 21:33
e6b1bc6
Compare
Choose a tag to compare

UltraPlot v1.50

Version v1.50 is a major milestone for UltraPlot. As we become more familiar with the codebase, we’ve opened the door to new features—balancing innovation with continuous backend improvements and bug fixes.


🌍 GeoAxes Sharing

You can now share axes between subplots using GeoAxes, as long as they use the same rectilinear projection. This enables cleaner, more consistent layouts when working with geographical data.


🕸️ Network Graphs

UltraPlot now supports network visualizations out of the box. With smart defaults and simple customization options, creating beautiful network plots is easier than ever.

Network plotting code
import networkx as nx, ultraplot as uplt
n = 100
g = nx.random_geometric_graph(n, radius=0.2)
c = uplt.colormaps.get_cmap("viko")
c = c(np.linspace(0, 1, n))
node = dict(
    node_size=np.random.rand(n) * 100,
    node_color=c,
)
fig, ax = uplt.subplots()
ax.graph(g, layout="kamada_kawai", node_kw=node)
fig.show()

🍭 Lollipop Graphs

A sleek alternative to bar charts, lollipop graphs are now available directly through UltraPlot. They shine when visualizing datasets with many bars, reducing visual clutter while retaining clarity.

Lollipop example code
import ultraplot as uplt, pandas as pd, numpy as np
data = np.random.rand(5, 5).cumsum(axis=0).cumsum(axis=1)[:, ::-1]
data = pd.DataFrame(
    data,
    columns=pd.Index(np.arange(1, 6), name="column"),
    index=pd.Index(["a", "b", "c", "d", "e"], name="row idx"),
)
fig, ax = uplt.subplots(ncols=2, share=0)
ax[0].lollipop(
    data,
    stemcolor="green",
    stemwidth=2,
    marker="d",
    edgecolor="k",
)
ax[1].lollipoph(data, linestyle="solid")

What's Changed

Full Changelog: v1.11...v1.5

Various bug fixes

25 Apr 07:40
Compare
Choose a tag to compare

What's Changed

Full Changelog: v1.10.0...v1.11

v1.10.0 Ticks for Geoaxes

20 Mar 07:23
2085c2f
Compare
Choose a tag to compare

This release marks a newly added feature: ticks on GeoAxes
image
This allows for users to set ticks for the x and or y axis. These can be controlled by lonticklen, latticklen or ticklen for controlling the x, y or both axis at the same time. This works independently to the major and minor gridlines allow for optimal control over the look and feel of your plots.

What's Changed

New Contributors

Full Changelog: v1.0.9...v1.10.0