[4.12.0] - 2025-12-02
This release is 100% compatible with Lets-Plot v 4.8.1,
GeoTools v 33.2
Added
-
Geometries:
-
geomPointDensity()[#1370].See: example notebook.
-
Geoms with 1-to-1 statistics (such as
geomQQ(),geomSina()) preserve the mapping to original data after statistical transformation.See: example notebook.
-
geomHistogram(): 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:
-
flavorStandard()sets the theme's default color scheme [#1277].
Use to override other flavors or to make defaults explicit.See: example notebook.
-
themeGray()as an alias forthemeGrey(). -
New
themefunctions for setting legend justification:legendJustificationTop(),legendJustificationRight(),
legendJustificationBottom(), andlegendJustificationLeft().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():sizeZoominandsizeBasisparameters for geometry scaling [#1369].See: example notebook.
-
New
outputparameter for the library descriptor to control output types stored in notebook cells [LPK-277].
Thanks to AndreiKingsley for the contribution!%use lets-plot(output="js, png")Available output types:
js- Classic Web output: HTML+JSktnb- Kotlin Notebook Swing-based renderingsvg- Static SVG outputpng- Static PNG output
Default:
"js, ktnb, svg"Note: Static images (SVG/PNG) are hidden when
jsorktnboutputs are present, and only displayed in environments where JavaScript is not executed (e.g., GitHub).This option can be helpful when a Kotlin Notebook file size becomes a problem.
For example, when working with large datasets where plot interactivity is not a priority, storing only static output (SVG or PNG) can significantly reduce file size. -
CenteredPlotPanelhelper class for displaying plots centered in Swing applications.
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=listOf(var1, var2, ...) to group by multiple variables explicitly,
and group=emptyList<Any>() to disable any grouping.
-
Missing values in
geomLine(), geomPath(), geomRibbon(), andgeomArea()create gaps in geometries instead of being interpolated over [LPK-269],[#818], [#1406].See: example notebook.
-
theme: theexponentFormatdefault 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
- Group by multiple columns [LPK-136].
geomPieon geospatial plot withmapJoinfailes to render without explicitgroupaesthetic.geomDensity2D: NullPointerException when weight aesthetic contains None values [#1399].- Tooltip shows duplicate lines when as_discrete is applied twice to the same var [#1400].
geomSina: incorrect shape in legend [#1403].geomDensity2D: Incorrect processing of weighted statistics when None value occurs in the x or y column.facetWrap: 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
scaleIdentity(aesthetic="shape")[#1212]. ggsave: theme optionface="italic"doesn't work [#1391].- Fail early if string format is incorrect [#1410].
statECDF()takes a very long time for even moderately sized datasets [#1424].- inconsistencies in theme/flavor inheritance in
gggrid()subplots.