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 newoverflowparameter 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
colorbarguide when used with continuous data.
Previously they produced alegendguide 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.