Skip to content

Releases: JetBrains/lets-plot-kotlin

v4.11.2

12 Sep 20:58
Compare
Choose a tag to compare

[4.11.2] - 2025-09-12

This release is 100% compatible with Lets-Plot v 4.7.3,
GeoTools v 33.2

Changed

  • ggsave(): large plot dimensions without units now require explicit unit specification.

    When plot size exceeds 20 without specifying units (e.g., ggsave(p, w=300, h=400)),

    we ask to specify units explicitly:

    ggsave(p, w=300, h=400, unit="px") or ggsave(p, w=3, h=4, unit="in").

Fixed

  • ggtb() support in Swing/Batik frontend [LPK-265].
  • Multiline support for axis labels in polar coordinates.
  • When the plot size in ggsave() is specified in pixels, dpi now affects

    only the physical size, not the pixel dimensions as before.
  • Blocking SwingUtilities.invokeAndWait() call on plot image export (JVM app)

v4.11.1

02 Sep 21:21
Compare
Choose a tag to compare

[4.11.1] - 2025-09-02

This release is 100% compatible with Lets-Plot v 4.7.2,
GeoTools v 33.2

Added

  • Facets Layout:

    • New strip_spacing, strip_spacing_x, and strip_spacing_y parameters in theme() to control spacing between the facet strip (title bar) and the plot panel.

    • New panel_spacing, panel_spacing_x, and panel_spacing_y parameters in theme() to control spacing between plot panels in faceted plots, [#1380].

      See: example notebook.

  • ggsave():

Changed

  • facetWrap() now drops factor levels that do not appear in the data (i.e., empty panels) by default [#1322].

    To keep unused factor levels, use the new drop parameter, i.e., drop=false.

    See: example notebook.

  • Facets Layout:

    • Removed extra spacing between facet strips and plot panels in facetWrap() and facetGrid().
  • ggsave(): removed Batik dependency (now uses lets-plot's built-in rasterizer).

Fixed

  • Tooltip for a line have higher priority than points, even if the point is specified first in the layer list [#1060].
  • geomRibbon(): tooltip appears in the wrong place on flipped ribbon [#1334].
  • Coordinate limits do not work on reversed scales [#1365]
  • Misaligned axis labels and ticks in polar coordinates.
  • Display order of fill categories not being set correctly in stacked plots? [#1367]
  • Unclear error when using geomRect with discrete scales [#1287]
  • xlim() breaks default scaleXDateTime() [#1348]
  • scaleXReverse breaks datetime formatting [#1257]
  • theme(plotTitle="blank") doesn't work with gggrid [#1349]
  • theme: error parsing color value pen [#1216]
  • Incorrect appearance of stacked density plot in polar coordinates [#1375]

v4.11.0

25 Jul 20:29
Compare
Choose a tag to compare

[4.11.0] - 2025-07-25

This release is 100% compatible with Lets-Plot v 4.7.0,
GeoTools v 33.2

Added

  • Time Series Plotting [#278],
    [discussion],
    [#678],
    [LPK-129]:

    • Support temporal data types from kotlinx.datetime, java.time, and java.util.
    • Support for timezone-aware java.time.ZonedDateTime and java.time.OffsetDateTime objects.

    See examples:

  • Geometries:

  • Layer Labels (Annotations):

    • Support in geomCrossbar()

      See: example notebook.

    • Support in waterfallPlot() via relativeLabels and absoluteLabels parameters.

      See: example notebook.

    • New inheritColor() option in annotations' configuration (see example notebooks above)

  • waterfallPlot() - support for combining waterfall bars with other geometry layers [#1344].

    See: example notebook.

  • Plot Layout:

    • New axisTextSpacing, axisTextSpacingX, and axisTextSpacingY parameters in theme() to control spacing between axis ticks and labels.
    • See new Plot Layout Diagrams showing various layout options and their effects on plot appearance.
  • More variants to specify a color by name:

    • all HTML/CSS colors;
    • various naming styles, e.g., "dark-gray", "darkgrey", "dark_grey", "DARKGRAY", etc.;
    • grayscale colors from "gray0" (black) to "gray100" (white);

    See the complete list of named colors.

  • sizeUnit parameter in geomPoint(), geomText/Label() and geomPie() accepts two new values: "min" and "max" [#260].

    "min" sets the size unit to the smaller of the unit steps along the x and y axes, while "max" sets it to the larger.

    This allows for more flexible relative sizing of points, pies and text in plots.

    See: example notebook.

Changed

  • Continuous data on discrete scales:

    Continuous data when used with discrete positional scales is no longer transformed to discrete data.

    Instead, it remains continuous, allowing for precise positioning of continuous elements relative to discrete ones.

    This resolves issues where combining discrete and continuous data in the same plot was difficult or impossible: [#1279].

    See: example notebook.

Tip

New way of handling continuous data on discrete scales could potentially break existing plots.
If you want to restore a broken plot to its original form, you can use the asDiscrete() function to annotate continuous data as discrete.

  • [BREAKING] geomBoxplot(): when y-oriented, it now uses aesthetics xlower/xmiddle/xupper instead of lower/middle/upper [#1319].
  • [BREAKING] waterfallPlot(): special "flow_type" value for label=elementText(color=...) replaced with "inherit". See label in the documentation.
  • [DEPRECATED] The positionDodgeV() function and the "dodgev" value for the position parameter are deprecated and will be removed in future releases.
  • Plot layout: reduced margins and spacing for title, caption, axes, and legend.
  • Updated RGB values for "lightgray" and "green". To restore the previous colors, use "gray75" and "lime", respectively.
  • waterfallPlot(): the appearance of the legend has been improved.
  • geomViolin(): tooltips are not shown in the centerline of the violin if showHalf != 0.
  • geomCrossbar(): the midline is not shown in the legend when fatten is set to 0, or when there is no mapping for it.
  • geomPointrange(): the midpoint will not be drawn if the y aesthetic is set to null.
  • geomBand(): the alpha aesthetic only affects the inner part of the geometry, as in geomRect().
  • geomBand(): show tooltip over the whole band, not just at the edges.

Fixed

  • AWT: plot prevents wheel events from bubbling up to the parent component.
  • geomBoxplot: unable to draw a y-oriented plot with stat = Stat.identity [#1319].
  • Can't add a layer which uses continuous data to a plot where other layers use discrete input [#1323].
  • Multiline legend labels were not vertically centered with their keys [#1331].
  • Poor alignment in legend between columns [#1332].
  • Ordered data was re-ordered by geomBoxplot [#1342].
  • Sec: CVE-2024-47554 (commons-io) [#1231]
  • java.util.zip.ZipException: duplicate entry: letsPlotKotlinAPI/version.properties [#279]

v4.10.0

20 Mar 21:17
Compare
Choose a tag to compare

[4.10.0] - 2025-03-20

This release is 100% compatible with Lets-Plot v 4.6.1,
GeoTools v 32.1

Added

  • Grouping plots:

  • Geometries:

  • Texts and labels:

  • In the nudge position adjustment -
    the ability to specify absolute shift values for nudge:

    • unit parameter in positionNudge().
    • nudgeUnit parameter in geomText() and geomLabel()

    See example notebook.

  • Theme:

    • Parameters legendTicks and legendTicksLength for fine-grained control over colorbar tick marks [#1262].

      See: example notebook.

  • Aliases for transparent color: "" (blank string), "blank" and "transparent" color [#1281].

Changed

  • [DEPRECATED] class GGBunch is deprecated. Please use ggbunch() function instead.
  • [BREAKING] The height parameter has been deprecated for the geomErrorBar.
  • Axis breaks: the minimum distance between axis labels was reduced to avoid unsuitable layouts.
  • Axis breaks: changed default lower_exp_bound to -7 and upper_exp_bound to 6 (same as in theme(...)).
  • Axis labels: changed default justification for rotated labels.
  • Axis labels: changed orientation of automatic vertical labels.
  • [BREAKING] geoms tile, bin2d, contour, contourf, density2d, density2df : default coordinate system changed from 'fixed' to 'cartesian'.
  • [BREAKING] tiles in geomBin2d() are sized according to the binwidth value, not the maximum possible.
  • [BREAKING] In Lets-Plot JS API v 4.6.0 (only Lets-Plot/JS users): signature of "buildPlotFromXXX" functions changed, see current Kotlin/JS declarations:
  • [BREAKING] In Lets-Plot v 4.6.0, Maven artifacts:
    • artifacts platf-awt, platf-batik, platf-jfx-swing are no longer published with a "-jvm" suffix.
      Before, these artifacts could be used in dependencies either with or without the "-jvm" suffix. Now only without suffix.
    • artifact "org.jetbrains.lets-plot:deprecated-in-v4-jvm" is removed.

Fixed

  • Incorrectly rendered Area chart [#1295].
  • Tooltip should not cover and hide the geometry that it provides info for [#1275].
  • General purpose scaleContinuous: can't use the expand parameter [#1285].
  • Error when using stat='summary' if the data contains NaN values [#1301].
  • Broken plotBackground in gggrid [#1124].
  • plotBackground not inheriting from rect [#1278]
  • gggrid: allow title and other labels for the entire figure [#715].
  • ggbunch: overall title [#321].
  • Expand discrete axis according to tile size with geomTile [#1284].

v4.9.3

16 Dec 22:36
Compare
Choose a tag to compare

[4.9.3] - 2024-12-16

This release is 100% compatible with Lets-Plot v 4.5.2,
GeoTools v 32.1

Changed

  • Number formatting:
    • We have aligned our specifications with D3.js (rather than Python): g format type with ~ (e.g. ~g) now truncates trailing zeros, and without ~ it doesn't.
    • The default number formatter now respects theme(exponent_format=...) settings and does not use 's' format type for large numbers.
  • Legends with more than 200 items are now not rendered.

Fixed

  • Bad precision in the default tooltip format when using coord limits [#1134].
  • Display integer values without fractional part in tooltips [#1186].
  • Suboptimal tooltip positioning in facets [#1187].
  • Incorrect Y-axis layout with facets and panel_inset [#1194].
  • Grouped plot hits the limit of 1000 and doesn't render with not-friendly exception [#1224].
  • Kandy toPNG reports NullPointerException [#1228]
  • Wrong formatting when type='g' for small values [#1238].
  • Formatting when type='g' for large values throws exception [#1239].
  • Wrong formatting when type='s' with explicit precision [#1240].
  • Extra trim in formatted number when type='g' [#1241].
  • Axis breaks are badly formatted if explicitly set [#1245].
  • Badly formatted zero break for the "~g" format [#1246].
  • How to adjust the vertical position of geom_text when using position_dodge [#1248].
  • Incorrect result for format(9.999, ".2f") [#1251].
  • Tooltips overlapping when not enough vertical space for them [#1254].
  • Plot limited to 1000 lines (Internal error: IllegalStateException : Too many groups: 1099) [#1261].
  • Nice to have tooltip to inherit formatting configured for axis [LPK-229].

v4.9.2

19 Nov 18:36
Compare
Choose a tag to compare

[4.9.2] - 2024-11-19

Same as 4.9.1, added missing Maven artifacts.

v4.9.1

18 Nov 22:04
Compare
Choose a tag to compare

[4.9.1] - 2024-11-18

This release is 100% compatible with Lets-Plot v 4.5.1,
GeoTools v 32.1

Changed

  • Migrated to new Kotlin Jupyter integration.

v4.9.0

01 Nov 19:24
Compare
Choose a tag to compare

[4.9.0] - 2024-11-01

This release is 100% compatible with Lets-Plot v 4.5.1.

Added

  • ggtb(): enable zoom/pan interactivity on plot [#38],[#983],[#1019]

    See example notebook.

  • Interactive links in tooltips/labels/texts [#1091].

    See example notebook.

  • Formatting:

    • LaTeX support: superscript, subscript ([#861]) and Greek letters ([#960]).

      See example notebook.

    • Scientific notation: compact form. Enable the compact form using the exponentFormat parameter in theme() [#1071].

      See example notebook.

  • In theme():

    • parameters legendMargin, legendSpacing, legendSpacingX, legendSpacingY, legendBoxSpacing,

      and functions legendBoxHorizontal/Vertical(), legendBoxJustificationLeft/Right/Top/Bottom/Center() [#1180].

      See example notebook.

    • parameters legendKey, legendKeySize/Width/Height/Spacing/SpacingX/SpacingY[#1181].

      See example notebook.

    • parameters stripBackgroundX/Y, stripTextX/Y [#1195].

      See example notebook.

  • Custom linetype patterns [#1198]:

    • a list specifying the pattern of dashes and gaps used to draw the line: listOf(dash, gap, dash, gap, ...);
    • a list with a specified offset: listOf(offset, listOf(dash, gap, dash, gap, ...));
    • a string of an even number (up to eight) of hexadecimal digits specifying the lengths in consecutive positions in the string.

    See example notebook.

  • Geometries:

  • expandLimits() [#820].

    See example notebook.

  • Support for 3-character hex color codes

Changed

  • Parameters labwidth in facetWrap(), xLabwidth, yLabwidth in facetGrid(): the maximum label length is applied after splitting at \n separators, if present.

  • themeLight() is now the default theme in qqPlot().

  • [BREAKING] For API deprecated in v4.0 the deprecation level raised to "Error".

Fixed

  • waterfallPlot: faceting doesn't work without a measure mapping [#1152].
  • waterfallPlot: tooltips don't work with column names from original dataset [#1153].
  • Legend icon background is not transparent when legendBackground is set to "blank" in theme [#1167].
  • Unable to display or save graph when using geomPath [#1168].
  • Legend icon background should inherit the fill color of the plot panel (i.e. grey when themeGrey() is used).
  • Vertex sampling uses different tolerances for objects within the same plot [#1174].
  • samplingVertexVW() doesn't work as expected [#1175].
  • samplingVertexDP() may break rings [#1176].
  • ggmarginal: bottom boxplot is broken [#1189].
  • Offscreen cells are sometimes not rendered in JupyterLab.
  • legendJustification() doesn't work if legendPositionTop() [#1031].
  • coordPolar: geomPoint tooltips should take in account point size [#1214].

v4.8.0

20 Aug 21:39
Compare
Choose a tag to compare

[4.8.0] - 2024-08-20

This release is 100% compatible with Lets-Plot v 4.4.0, v 4.4.1.

Added

Changed

  • The triangular point shape is now anchored to the data point via the centroid

Fixed

  • ggsave (.svg) transforms geom_text integer to float [#626].
  • Int DataFrame column names are being converted to float string representation [#901].
  • linetype = 0 ("blank") should make lines invisible [#712].
  • geomDensity2D, geomDensity2DFilled: support weight aesthetic [#791].
  • Discrete axis labels unnecessarily rotate 90 degrees when applying coord system limits.
  • Axis title via labs() breaks the date-time scale [#1113].
  • JavaFX IllegalArgumentException: Unsupported attribute display in Pane.

v4.7.3

30 May 17:47
Compare
Choose a tag to compare

[4.7.3] - 2024-05-30

This release is 100% compatible with Lets-Plot v 4.3.3.

Added

Fixed

  • Undesired vertical scroller when displaying gggrid in Jupyter notebook.
  • Memory leak in SVG observable model (thanks to contribution by Ilya Muradyan).
  • GeoJson structure breaks if the ring start label occurs several times [#1086].
  • theme: left margin doesn't work for the plot_title parameter [#1101].
  • Improve border line type experience [LPK-220].