Releases: JetBrains/lets-plot
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
v4.8.2rc1
Updated version v4.8.2rc1
v4.8.1
v4.8.1rc1
Updated version v4.8.1rc1
v4.8.0
[4.8.0] - 2025-11-05
Added
-
Geometries:
-
geom_pointdensity()[#1370].See: example notebook.
-
Geoms with 1-to-1 statistics (such as
geom_qq(),geom_sina()) preserve the mapping to original data after statistical transformation.See: example notebook.
-
geom_histogram(): custom bin bounds (parameterbreaks) [#1382].See: example notebook.
-
-
Plot Layout:
-
The legend automatically wraps to prevent overlap - up to 15 rows for vertical legends and 5 columns for horizontal ones [#1235].
See: example notebook.
-
gggrid(): support for shared legends (parameterguides).See: example notebook.
-
-
Plot Theme:
-
flavor_standard()sets the theme's default color scheme [#1277].
Use to override other flavors or make defaults explicit.See: example notebook.
-
theme_gray()as an alias fortheme_grey(). -
legend_justificationparameter oftheme()accepts additional string values:'left','right','top', and'bottom'.See: example notebook.
-
Support for inward axis ticks.
See: example notebook.
-
-
Markdown:
- Support for
targetattribute for links. - Links now open in a new tab by default [#1397].
- Support for
-
ggtb():size_zoominandsize_basisparameters for geometry scaling [#1369].See: example notebook.
Changed
-
[BREAKING] Explicit
groupaesthetic now overrides default grouping behavior instead of combining with it [#1401].See: example notebook.
Important
Previously, setting group='variable' would group by both the explicit variable AND any discrete
aesthetics (color, shape, etc.).
Now it groups ONLY by the explicit variable, matching ggplot2 behavior.
Use group=[var1, var2, ...] to group by multiple variables explicitly,
and group=[] to disable any grouping.
-
Missing values in
geom_line(), geom_path(), geom_ribbon(), andgeom_area()create gaps in geometries instead of being interpolated over [#818], [#1406].See: example notebook.
-
theme: theexponent_formatdefault value changed to'pow'- superscript powers of 10 (was e-notation). -
The multi-layer line plot now shows tooltips for each series simultaneously, in the same way that a single-layer plot with color mapped to series does.
Fixed
geom_pieon geospatioal plot withmap_joinfailes to render without explicitgroupaesthetic.- geom_density2d: NullPointerException when weight aesthetic contains None values [#1399].
- Tooltip shows duplicate lines when as_discrete is applied twice to the same var [#1400].
- geom_sina: incorrect shape in legend [#1403].
- geom_density2d: Incorrect processing of weighted statistics when None value occurs in the x or y column.
- facet_wrap: indescriptive error when the specified facet variable is not present in the dataset [#1409].
- Integer numbers in facet strip titles are displayed as float [#1386].
- Error when using scale_identity(aesthetic="shape") [#1212].
- ggsave: theme option face="italic" doesn't work [#1391].
- Fail early if string format is incorrect [#1410].
v4.8.0rc1
Updated version v4.8.0rc1
v4.7.3
[4.7.3] - 2025-09-12
Changed
ggsave(): Large plot dimensions without units now require explicit unit specification.
When plot size exceeds 20 without specifying units (e.g.,ggsave(p, 300, 400)),
we ask to specify units explicitly:
ggsave(p, 300, 400, unit='px')orggsave(p, 3, 4, unit='in').
Fixed
ggtb()support in Swing/Batik frontend.- Multiline support for axis labels in polar coordinates.
- When the plot size in
ggsave()is specified in pixels,dpinow affects
only the physical size, not the pixel dimensions as before. - Blocking
SwingUtilities.invokeAndWait()call in plot image export (AWT backend)
v4.7.2
[4.7.2] - 2025-09-01
Added
-
Plot Layout:
- New
strip_spacing,strip_spacing_x, andstrip_spacing_yparameters intheme()to control spacing between the facet strip (title bar) and the plot panel. - New
panel_spacing,panel_spacing_x, andpanel_spacing_yparameters intheme()to control spacing between plot panels in faceted plots, [#1380].
See: example notebook.
- New
-
Image resolution is saved in the metadata of PNG files created with
ggsave().
Changed
- plot-image-export: switched from Batik to Graphics2D API
Fixed
- ggsave(): memory leak when using
geom_raster(). - Incorrect physical image size when exporting PDF with
ggsave()without specifyingdpi.