Skip to content

v4.12.0

Latest

Choose a tag to compare

@alshan alshan released this 02 Dec 19:23
· 3 commits to master since this release

[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 (parameter breaks) [#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 (parameter guides).

      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 for themeGrey().

    • New theme functions for setting legend justification: legendJustificationTop(), legendJustificationRight(),

      legendJustificationBottom(), and legendJustificationLeft().

      See: example notebook.

    • Support for inward axis ticks.

      See: example notebook.

  • Markdown:

    • Support for target attribute for links.
    • Links now open in a new tab by default [#1397].
  • ggtb(): sizeZoomin and sizeBasis parameters for geometry scaling [#1369].

    See: example notebook.

  • New output parameter 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+JS
    • ktnb - Kotlin Notebook Swing-based rendering
    • svg - Static SVG output
    • png - Static PNG output

    Default: "js, ktnb, svg"

    Note: Static images (SVG/PNG) are hidden when js or ktnb outputs 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.

  • CenteredPlotPanel helper class for displaying plots centered in Swing applications.

Changed

  • [BREAKING] Explicit group aesthetic 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(), and geomArea() create gaps in geometries instead of being interpolated over [LPK-269],[#818], [#1406].

    See: example notebook.

  • theme: the exponentFormat default 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].
  • geomPie on geospatial plot with mapJoin failes to render without explicit group aesthetic.
  • 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 option face="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.