Releases: JetBrains/lets-plot-kotlin
v4.11.0
[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
, andjava.util
. - Support for timezone-aware
java.time.ZonedDateTime
andjava.time.OffsetDateTime
objects.
See examples:
- Support temporal data types from
-
Geometries:
-
geomSina()
[#1298].See: example notebook.
-
geomTextRepel()
andgeomLabelRepel()
[#1092].See: example notebook.
-
-
Layer Labels (Annotations):
-
Support in
geomCrossbar()
See: example notebook.
-
Support in
waterfallPlot()
viarelativeLabels
andabsoluteLabels
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
, andaxisTextSpacingY
parameters intheme()
to control spacing between axis ticks and labels. - See new Plot Layout Diagrams showing various layout options and their effects on plot appearance.
- New
-
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);
-
sizeUnit
parameter ingeomPoint()
,geomText/Label()
andgeomPie()
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 aestheticsxlower
/xmiddle
/xupper
instead oflower
/middle
/upper
[#1319]. - [BREAKING]
waterfallPlot()
: special "flow_type" value forlabel=elementText(color=...)
replaced with "inherit". Seelabel
in the documentation. - [DEPRECATED] The
positionDodgeV()
function and the"dodgev"
value for theposition
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 ifshowHalf != 0
.geomCrossbar()
: the midline is not shown in the legend whenfatten
is set to 0, or when there is no mapping for it.geomPointrange()
: the midpoint will not be drawn if they
aesthetic is set tonull
.geomBand()
: thealpha
aesthetic only affects the inner part of the geometry, as ingeomRect()
.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 withstat = 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
[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:
-
ggbunch()
function: combining plots with custom layout.See demos:
-
Support for plot title, subtitle, caption, margins and insets in
gggrid()
andggbunch()
.
-
-
Geometries:
-
geomHex()
[#556].See example notebook.
-
Parameters
widthUnit
ingeomErrorBar()
,geomBoxplot()
,geomCrossbar()
[#1288].widthUnit
andheightUnit
ingeomTile()
andgeomHex()
.
See example notebook.
-
Parameters
start
anddirection
ingeomPie()
[#1280].See example notebook.
-
-
Texts and labels:
-
hjust
andvjust
parameters for axis labels [#1227],[#1230].See: example notebook.
-
Multiline support for axis labels [#948].
See: example notebook.
-
Markdown support for plot title, subtitle, caption, and axis labels [#1256].
See example notebook.
-
-
In the
nudge
position adjustment -
the ability to specify absolute shift values fornudge
:unit
parameter inpositionNudge()
.nudgeUnit
parameter ingeomText()
andgeomLabel()
See example notebook.
-
Theme:
-
Parameters
legendTicks
andlegendTicksLength
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 useggbunch()
function instead. - [BREAKING] The
height
parameter has been deprecated for thegeomErrorBar
. - Axis breaks: the minimum distance between axis labels was reduced to avoid unsuitable layouts.
- Axis breaks: changed default
lower_exp_bound
to -7 andupper_exp_bound
to 6 (same as intheme(...)
). - 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 thebinwidth
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.
- artifacts
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 theexpand
parameter [#1285]. - Error when using
stat='summary'
if the data contains NaN values [#1301]. - Broken
plotBackground
ingggrid
[#1124]. plotBackground
not inheriting fromrect
[#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
[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.
- We have aligned our specifications with D3.js (rather than Python):
- 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
v4.9.1
v4.9.0
[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 intheme()
[#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.
- a list specifying the pattern of dashes and gaps used to draw the line:
-
Geometries:
-
geomBlank()
[#831]. -
base
parameter inwaterfallPlot()
[#1159].See example notebook.
-
checkOverlap
parameter ingeomText()
andgeomLabel()
.See example notebook.
-
marginal
parameter inqqPlot()
:See example notebook.
-
inheritAes
parameter in layers [#1172].
-
-
expandLimits()
[#820].See example notebook.
-
Support for 3-character hex color codes
Changed
-
Parameters
labwidth
infacetWrap()
,xLabwidth, yLabwidth
infacetGrid()
: the maximum label length is applied after splitting at\n
separators, if present. -
themeLight()
is now the default theme inqqPlot()
. -
[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" intheme
[#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 iflegendPositionTop()
[#1031].- coordPolar: geomPoint tooltips should take in account point size [#1214].
v4.8.0
[4.8.0] - 2024-08-20
This release is 100% compatible with Lets-Plot v 4.4.0, v 4.4.1.
Added
-
Waterfall plot [#975]:
See example notebook.
-
geomBand()
[#733]:See example notebook.
-
Custom legends [#774]:
manualKey
parameter in plot layerlayerKey()
function
See example notebook.
-
In legends:
-
title
parameter inguideLegend()
andguideColorbar()
functionsSee example notebook.
-
override aesthetics in the
guideLegend()
function [#807]:See example notebook.
-
-
plotTitlePosition
andplotCaptionPosition
parameters intheme()
[#1027].See example notebook.
-
threshold
parameter ingeomHistogram()
[#1122].See example notebook.
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
[4.7.3] - 2024-05-30
This release is 100% compatible with Lets-Plot v 4.3.3.
Added
- Support for
angle
aesthetic ingeomPoint()
[#736].
See example notebook.
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 theplot_title
parameter [#1101].- Improve border line type experience [LPK-220].
v4.7.2
v4.7.1
[4.7.1] - 2024-04-22
This release is 100% compatible with Lets-Plot v 4.3.1.
Added
-
Parameter
labWidth
infacetWrap()
andxLabWidth/yLabWidth
infacetGrid()
[LPK-237].See: example notebook.
-
Parameter
linetype
inelementLine()
andelementRect()
intheme()
[LPK-235].See: example notebook.
-
Parameter
arrow
ingeomSpoke()
[#986].See: example notebook.
-
Parameter
sizeUnit
ingeomPoint()
,geomText()
andgeomLabel()
.See: example notebook.
-
Auto-detection of
orientation="y"
in bar-chart etc. [#558].See: example notebook.
-
Parameter
plotInset
intheme()
.See: example notebook.
Changed
LetsPlot.theme
global property now accepts a sum of theme/flavor features [#657].
Fixed
- ggmarginal(): broken coloring [#760].
- Incorrect 'plot_background' area (with empty space capture) [#918].
- geom_density2df: uneven borders [#941].
- Line segments in geom_density2df() do not get interpolated when used with coord_polar() [#1037].
- arrow on segment: reduce arrow size for short segments [#1040].
- arrow on curve sometimes looks weird [#1041].
- Error when build geom_smooth() with se=False [#1050].
- Add tooltips for
geom_curve()
[#1053]. - Incorrect position for bar annotations when specifying
scale_x_reverse()/scale_y_reverse()
[#1057]. - Missing outer bar annotations when specifying
scale_x_reverse()/scale_y_reverse()
[#1058]. - Plot layout breaks when marginal layers are used [#1074].
- Discrete scale doesn't work for datetime data [LPK-231].
- Add
linetype
parameter inelementLine()
andelementRect()
[LPK-235]. - Any way to line-wrap facet labels? [LPK-237].
- Missing marginal gridlines.
- Cryptic error message on geom_boxplot with orientation="y" [#600].