Lets-Plot v4.9.0 Release Notes

Release Date: 2026-03-11 // 12 days ago
  • [4.9.0] - 2026-03-11

    ➕ Added

    • 👍 Python 3.14 support.

    • 👍 Python 3.14 free-threading support [#1454].

    • Plot Annotations:

    • Geometries:

    • Color Scales:

    • Positional Scales:

    • gggrid(): interactive pan/zoom now propagates across subplots with shared axes (sharex/sharey) [#1413].

    🔄 Changed

    • 💥 [BREAKING]: ColorBrewer palettes: changed default behavior when the requested number of colors exceeds the palette's maximum size.
      0️⃣ Now defaults to 'interpolate' for sequential/diverging palettes and 'generate' for qualitative palettes.
      Previously, depending on the palette type, this either resulted in duplicate colors or random additional colors.
      👉 Use the new overflow parameter to explicitly control this behavior.

    • ⬇️ Reduced import overhead by nearly two orders of magnitude (from ~1.2s down to ~0.02s) [#1469].

    • Missing values in geom_area_ridges() create gaps in geometries instead of being interpolated over.

    • Discrete color scales (Brewer, Manual) now produce a colorbar guide when used with continuous data.
      Previously they produced a legend guide regardless of the data type.

    • 🔄 Changes affecting users on the JVM platform:

    🛠 Fixed

    • ⬇️ Drop commons-io dependency [#1421].
    • Unexpected replacement of double curly brackets with a single curly bracket [#1433].
    • ⬆️ Upgrade to a newer version of ws [#1150].
    • geom_imshow: unclear error message when mixing transparencies [#1088].
    • geom_imshow and scale_y_reverse [#1210].
    • Nice to be able to get a list of colors from a color scale object [#1444].
    • 👍 Allow tooltips param to accept list [#1455].
    • 👍 Allow grouped tooltips for plots with multiple univariate geoms [#1460].
    • Fixed a regression in geom_text_repel() / geom_label_repel(): points with empty labels were incorrectly skipped
      🏗 before building the repel obstacle set, so they were not included in collision avoidance and labels could overlap
      dense point clusters.

Previous changes from v4.9.0.rc1