Releases: JetBrains/lets-plot
Release list
v4.11.0
[4.11.0] - 2026-06-30
Added
-
theme(): newtooltip_mergeandtooltip_max_countparameters to combine the general tooltips of multiple targets into a single tooltip.See: example notebook.
-
Text halos improve readability on varied backgrounds. New
halo_widthandhalo_colorparameters are supported ingeom_text()/geom_text_repel()and by labels incorr_plot().See: example notebook.
Fixed
- Incorrect
hjust/vjust/anglejustification of vertical-axis tick labels (theme(axis_text_y=element_text(...))) - Rotated vertical-axis tick labels could be wrongly dropped or kept by overlap-based break filtering
- Misaligned or mismatched axis tick labels when some breaks are dropped after layout
v4.11.0rc1
Updated version v4.11.0rc1
v4.10.1
[4.10.1] - 2026-05-20
Fixed
- facet_wrap(), error when
ncolornrowparameter not specified: 'ncol' must be positive, was null
v4.10.0
[4.10.0] - 2026-05-20
Added
-
ggdeck()— a new function for overlaying multiple independent plots in a single unified view.In a typical scenario, one axis is shared by all plots in the deck, enabling dual-axis effects and multivariate comparisons.
See examples:
-
Datetime:
%fformatting pattern — support for milliseconds when formatting datetime values, zero-padded to 3 digits [#1482].See: example notebook.
-
In legends:
-
override_aesinguide_legend()can now customize filled 2D legend keys:sizecontrols the key border width;widthandheightcontrol the relative key size.
See: example notebook.
-
-
Indication of removed records [LPK-81], [#686].
When records in data are dropped by active sampling or because they contain missing or out-of-bounds values, the user is now informed of the number of dropped records and the reason they were dropped.
The new
na_rmparameter ingeom_xxx()andstat_xxx()functions controls the display of such messages:na_rm=false(default) — records are removed and messages are shown;na_rm=true— records are removed silently.
See: example notebook.
-
Alpha (transparency) component:
- Hex colors accept
#RRGGBBAAor#RGBAnotation. - Colors accept an opacity suffix in the form
"named color / opacity", for example"steelblue / 0.35".
See: example notebook.
- Hex colors accept
-
Facet strip labels now honor
angleinelement_text()forstrip_text_*[#1383].Thanks to a contribution by tentrillion.
See: example notebook.
-
In
geom_imshow(), new parameters for controlling the colorbar breaks and labels [#1486]:breaks,labels,lablim,format
-
geom_livemap(): the newinteractiveparameter controls map interactivity. Setinteractive=Falseto disable panning and zooming and hide map controls.See: example notebook.
-
Memo for Kotlin API users:
Changed
-
[BREAKING] Dropped support for Python 3.9 as it is in the "end-of-life" of its release cycle. The minimum supported Python version is now 3.10.
-
Swing-Batik components are deprecated. Use the Swing/AWT components instead (doesn't affect Python users).
Fixed
- Add 'synchronized tooltips' feature [#1415].
- Alpha is not supported in element_text() [#1462].
- scale_alpha: conflict of constant and mapped values of alpha aesthetic [#706].
- geom_imshow(): should render transparency for NaNs when all other pixel values are identical [#1485].
scale_color_gradient():guide='legend'is rendered as a colorbar [#1489].
v4.10.0rc1
Updated version v4.10.0rc1
v4.9.0
[4.9.0] - 2026-03-11
Added
-
Python 3.14 support.
-
Python 3.14 free-threading support [#1454].
-
Plot Annotations:
-
New
labelsparameter ingeom_smooth()designed to display statistical summaries of the fitted model directly on the plot.
This parameter accepts asmooth_labels()object, which provides access to model-specific variables like$R^2$ , the regression equation and others.See: example notebook.
-
Plot tags. A tag can be specified via
labs(tag=...)and styled using theme parameters [#1407].See: example notebook and updated plot layout scheme.
-
Plot tags customization parameters in
theme():-
plot_tag- sets the tag style viaelement_text(). -
plot_tag_location- specifies the area used for positioning the tag. -
plot_tag_position- specifies the position of the tag within the selected area. -
plot_tag_prefix- text added before the tag value. -
plot_tag_suffix- text added after the tag value.
See: example notebook.
-
-
-
Geometries:
-
New
geom_bracket(),geom_bracket_dodge()[#1114].See: example notebook.
-
geom_imshow():-
Support for custom colormaps [#780].
-
New
cguideparameter: use to customize the colorbar for grayscale images.See: example notebook.
-
-
-
Color Scales:
-
New
palette()method for color scales: generates a list of hex color codes that can be used withscale_color_manual()to maintain consistent colors across multiple plots [#1444].See: example notebook.
-
New
overflowparameter inscale_color_brewer()/scale_fill_brewer(): controls how colors are generated when more colors are needed than the palette provides.
Options:'interpolate'('i'),'cycle'('c'),'generate'('g').See: example notebook.
-
-
Positional Scales:
-
New
break_widthparameter that specifies a fixed distance between axis breaks.See examples:
-
Support for axis minor ticks via
axis_minor_ticksandaxis_minor_ticks_lengthparameters intheme()[#1379].See: example notebook.
-
-
gggrid(): interactive pan/zoom now propagates across subplots with shared axes (sharex/sharey) [#1413].See: example notebook.
Changed
-
[BREAKING]: ColorBrewer palettes: changed default behavior when the requested number of colors exceeds the palette's maximum size.
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:
- Upgraded the Kotlin version to 2.2.20 (was 1.9.25).
- New artifact for JVM Swing applications:
org.jetbrains.lets-plot:lets-plot-swing.
This artifact provides theSwingPlotPanelclass, which can be used to display plots in Swing applications instead of the now-obsoleteDefaultPlotPanelBatik.
For details, see the jvm-swing-app example in the "lets-plot-mini-apps" repository. - [BREAKING]: Removed JavaFX artifacts.
Theorg.jetbrains.lets-plot:lets-plot-jfxartifact is no longer available.
Replace it with neworg.jetbrains.lets-plot:lets-plot-swingdependency and useSwingPlotPanelinstead ofDefaultPlotPanelJfx.
For details, see the jvm-javafx-app example in the "lets-plot-mini-apps" repository. - [BREAKING]: Removed
plot-image-exportmodule.
Theorg.jetbrains.lets-plot:lets-plot-image-exportartifact is no longer available.
ThePlotImageExportutility has been moved to theplatf-awtmodule.
The requiredorg.jetbrains.lets-plot:platf-awtdependency is likely already present in your project.
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.
v4.9.0rc1
Updated version v4.9.0rc1
v4.8.2
[4.8.2] - 2026-12-19
Fixed
- Hyperlinks support for lets-plot-compose.
- Colab no longer rendering lets-plot with empty setup HTML [#1436]
v4.8.2rc1
Updated version v4.8.2rc1