Lets-Plot Kotlin API Changelog
May 26, 2026 · View on GitHub
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning. All scales should have the 'format' parameter.
[4.14.0] - 2026-05-26
This release is 100% compatible with Lets-Plot v 4.10.1, GeoTools v 33.2
Added
-
ggdeck()— a new function for overlaying multiple independent plots in a single unified view.In a typical scenario, one axis is shared by all plots in the deck, enabling dual-axis effects and multivariate comparisons.
See examples:
-
Datetime:
%fformatting pattern — support for milliseconds when formatting datetime values, zero-padded to 3 digits [#1482].See: example notebook.
-
In legends:
-
Aesthetic overrides in
guideLegend()can now customize filled 2D legend keys:sizecontrols the key border width;widthandheightcontrol the relative key size.
See: example notebook.
-
-
Indication of removed records [LPK-81], [#686].
When records in data are dropped by active sampling or because they contain missing or out-of-bounds values, the user is now informed of the number of dropped records and the reason they were dropped.
The new
naRmparameter in applicablegeomXxx()andstatXxx()functions controls the display of such messages:naRm=false(default) — records are removed and messages are shown;naRm=true— records are removed silently.
See: example notebook.
-
Sampling methods can now be chained with the
+operator.See: example notebook.
-
Alpha (transparency) component:
- Hex colors accept
#RRGGBBAAor#RGBAnotation. - Colors accept an opacity suffix in the form
"named color / opacity", for example"steelblue / 0.35".
See: example notebook.
- Hex colors accept
-
Facet strip labels now honor
angleinelementText()forstripTextXandstripTextY[#1383].Thanks to a contribution by tentrillion.
See: example notebook.
-
In
geomImshow(), new parameters for controlling the colorbar breaks and labels [#1486]:breaks,labels,lablim,format
Changed
- Java Swing: Apache Batik components are deprecated. Use the Swing/AWT components instead.
Fixed
- Add 'synchronized tooltips' feature [#1415].
- Alpha is not supported in
elementText()[#1462]. scaleAlpha(): conflict of constant and mapped values of alpha aesthetic [#706].geomImshow(): should render transparency for NaNs when all other pixel values are identical [#1485].scaleColorGradient():guide = "legend"is rendered as a colorbar [#1489].- Working with new types of data [#184].
[4.13.0] - 2026-03-20
This release is 100% compatible with Lets-Plot v 4.9.0, GeoTools v 33.2
Added
-
Plot Annotations:
-
New
labelsparameter ingeomSmooth()designed to display statistical summaries of the fitted model directly on the plot. This parameter accepts asmoothLabels()object, which provides access to model-specific variables like , the regression equation and others [#1388].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 Diagrams.
-
Plot tags customization parameters in
theme():plotTag- sets the tag style viaelementText().plotTagLocation- specifies the area used for positioning the tag.plotTagPosition- specifies the position of the tag within the selected area.plotTagPrefix- text added before the tag value.plotTagSuffix- text added after the tag value.
See: example notebook.
-
-
Geometries:
-
New
geomBracket(),geomBracketDodge()[#1114].See: example notebook.
-
geomImshow():-
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 withscaleColorManual()orscaleFillManual()to maintain consistent colors across multiple plots [#1444].See: example notebook.
-
New
overflowparameter inscaleColorBrewer()/scaleFillBrewer(): 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
breakWidthparameter that specifies a fixed distance between axis breaks.See examples:
-
Support for axis minor ticks via
axisMinorTicksandaxisMinorTicksLengthparameters intheme()[#1379].See: example notebook.
-
-
gggrid(): interactive pan/zoom now propagates across subplots with shared axes (sharex/sharey) [#1413].See: example notebook.
-
Swing Apps:
Support for plot default interactions and custom toolbar component.
For more details, see Interactions demo in the "lets-plot-mini-apps" repository.
Changed
-
Kotlin: v2.2.20 (was v1.9.25).
-
Artifact changes in the core Lets-Plot library (v4.9.0):
- 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.
The
org.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:org.jetbrains.letsPlot.awt.plot.PlotImageExport. The requiredorg.jetbrains.lets-plot:platf-awtdependency is likely already present in your project.
- New artifact for JVM Swing applications:
-
[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. -
Missing values in
geomAreaRidges()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.
Fixed
- Drop commons-io dependency [#1421].
- Unexpected replacement of double curly brackets with a single curly bracket [#1433].
- 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
geomTextRepel()/geomLabelRepel(): 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.
[4.12.1] - 2025-12-22
This release is 100% compatible with Lets-Plot v 4.8.2, GeoTools v 33.2
Added
- Support for
kotlin.time.Durationandjava.time.Duration[LPK-294].
Fixed
- Horizontal
geom_boxplot()with alpha specified is displayed incorrectly [LPK-295].
[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.
[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 explicitunitspecification.
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")orggsave(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,dpinow affects
only the physical size, not the pixel dimensions as before. - Blocking
SwingUtilities.invokeAndWait()call on plot image export (JVM app)
Internal Memo
Lets-Plot VL spec transformer removed.
[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, 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.
-
-
ggsave():w,handunitparameters support [#281], [#1368]. See: example notebook.
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 newdropparameter, i.e.,drop=false.See: example notebook.
-
Facets Layout:
- Removed extra spacing between facet strips and plot panels in
facetWrap()andfacetGrid().
- Removed extra spacing between facet strips and plot panels in
-
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
geomRectwith discrete scales [#1287] xlim()breaks defaultscaleXDateTime()[#1348]scaleXReversebreaks datetime formatting [#1257]theme(plotTitle="blank")doesn't work withgggrid[#1349]- theme: error parsing color value pen [#1216]
- Incorrect appearance of stacked density plot in polar coordinates [#1375]
[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.ZonedDateTimeandjava.time.OffsetDateTimeobjects.
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()viarelativeLabelsandabsoluteLabelsparameters.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, andaxisTextSpacingYparameters 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);
-
sizeUnitparameter 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/xupperinstead oflower/middle/upper[#1319]. - [BREAKING]
waterfallPlot(): special "flow_type" value forlabel=elementText(color=...)replaced with "inherit". Seelabelin the documentation. - [DEPRECATED] The
positionDodgeV()function and the"dodgev"value for thepositionparameter 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 whenfattenis set to 0, or when there is no mapping for it.geomPointrange(): the midpoint will not be drawn if theyaesthetic is set tonull.geomBand(): thealphaaesthetic 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]
[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
widthUnitingeomErrorBar(),geomBoxplot(),geomCrossbar()[#1288].widthUnitandheightUnitingeomTile()andgeomHex().
See example notebook.
-
Parameters
startanddirectioningeomPie()[#1280].See example notebook.
-
-
Texts and labels:
-
hjustandvjustparameters 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
nudgeposition adjustment - the ability to specify absolute shift values fornudge:unitparameter inpositionNudge().nudgeUnitparameter ingeomText()andgeomLabel()
See example notebook.
-
Theme:
-
Parameters
legendTicksandlegendTicksLengthfor 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
GGBunchis deprecated. Please useggbunch()function instead. - [BREAKING] The
heightparameter 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_boundto -7 andupper_exp_boundto 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 thebinwidthvalue, 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-swingare 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 theexpandparameter [#1285]. - Error when using
stat='summary'if the data contains NaN values [#1301]. - Broken
plotBackgroundingggrid[#1124]. plotBackgroundnot 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].
[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):
gformat 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].
[4.9.2] - 2024-11-19
Same as 4.9.1, added missing Maven artifacts.
[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.
[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
exponentFormatparameter 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
linetypepatterns [#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]. -
baseparameter inwaterfallPlot()[#1159].See example notebook.
-
checkOverlapparameter ingeomText()andgeomLabel().See example notebook.
-
marginalparameter inqqPlot():See example notebook.
-
inheritAesparameter in layers [#1172].
-
-
expandLimits()[#820].See example notebook.
-
Support for 3-character hex color codes
Changed
-
Parameters
labwidthinfacetWrap(),xLabwidth, yLabwidthinfacetGrid(): the maximum label length is applied after splitting at\nseparators, 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
legendBackgroundis 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].
[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]:
manualKeyparameter in plot layerlayerKey()function
See example notebook.
-
In legends:
-
titleparameter inguideLegend()andguideColorbar()functionsSee example notebook.
-
override aesthetics in the
guideLegend()function [#807]:See example notebook.
-
-
plotTitlePositionandplotCaptionPositionparameters intheme()[#1027].See example notebook.
-
thresholdparameter 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
displayin Pane.
[4.7.3] - 2024-05-30
This release is 100% compatible with Lets-Plot v 4.3.3.
Added
- Support for
angleaesthetic ingeomPoint()[#736].
See example notebook.
Fixed
- Undesired vertical scroller when displaying
gggridin 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_titleparameter [#1101].- Improve border line type experience [LPK-220].
[4.7.2] - 2024-04-25
This release is 100% compatible with Lets-Plot v 4.3.2.
Fixed
- LP occasionally crashes when drawing polygons [#1084].
- Regression of issue [#966].
- Linetype doesn't work for
geomTile()[LPK-241].
[4.7.1] - 2024-04-22
This release is 100% compatible with Lets-Plot v 4.3.1.
Added
-
Parameter
labWidthinfacetWrap()andxLabWidth/yLabWidthinfacetGrid()[LPK-237].See: example notebook.
-
Parameter
linetypeinelementLine()andelementRect()intheme()[LPK-235].See: example notebook.
-
Parameter
arrowingeomSpoke()[#986].See: example notebook.
-
Parameter
sizeUnitingeomPoint(),geomText()andgeomLabel().See: example notebook.
-
Auto-detection of
orientation="y"in bar-chart etc. [#558].See: example notebook.
-
Parameter
plotInsetintheme().See: example notebook.
Changed
LetsPlot.themeglobal 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
linetypeparameter 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].
[4.7.0] - 2024-03-15
Added
-
coordPolar()The polar coordinate system is most commonly used for pie charts, but
it can also be used for constructing Spider or Radar charts using theflatoption.See: example notebook.
-
In the
theme()function:-
panelInsetparameter - primarily used for plots with polar coordinates.See: example notebook.
-
panelBorderOntopparameter - enables the drawing of panel border on top of the plot geoms. -
panelGridOntop, panelGridOntopX, panelGridOntopYparameters - enable the drawing of grid lines on top of the plot geoms.
-
-
geomCurve()See: example notebook.
-
[UNIQUE] Visualizing graph-like data with
geomSegment()andgeomCurve().-
Aesthetics
sizeStart, sizeEnd, strokeStartandstrokeEndenable better alignment of
segments/curves with nodes of the graph by considering the size of the nodes. -
The
spacerparameter allows for additional manual fine-tuning.
See: example notebook.
-
-
alphaStrokeparameter ingeomLabel()to enable the applying ofalphatocolor[#1029].See: example notebook.
Changed
- Parameter
axisOntopintheme()is nowtrueby default.
Fixed
- Bug with Tooltips in Swing/Batik [LPK-225].
- coordMap() should distort tiles size to account for different unit size at different latitudes [#331].
- geomErrorbar(): wrong positioning of tooltips [#992].
- geomPath(): tooltip position interpolation [#855].
- Stacked bar-chart annotation: labels go out of the plot when zooming-in using coord_cartesian(xlim, ylim) [#981].
- Facets: "free scales" options are ignored by discrete axis [#955].
- Bar width is too large when x-domain is defined via x-scale limits [#1013].
- How to hide only main tooltip? [LPK-#232].
- Make middle strip in
geomCrossbar()optional [LPK-233]. - Can't set
nullfor coord limit [#486]. - Scale limits don't work for bars/area [LPK-219], [#978].
- No gridlines when axisOntop=True [#1012].
- Displaying tooltips on a multilayer plot [#1030].
- Make segment geometry better suited for graphs visualization [#572].
[4.6.0] - 2024-01-10
Added
-
The
levelsparameter inasDiscrete()function [#931].See: example notebook.
-
Support for superscript for numbers in scientific notation [#743].
See: example notebook.
-
Sharing of X,Y-scale limits between subplots in
gggrid()[#718].See: example notebook.
-
geomSpoke()[#738].See: example notebook.
-
scaleXLog2(), scaleYLog2()[#922]. -
New variables computed by
'count'and'count2d'statistics:'..sumprop..','..sumpct..'[#936].See: example notebook.
-
Support using dictionaries for breaks/labels/values customization in
scaleXxx()functions [#169], [#882].See: example notebook.
-
The
lablimparameter forscaleXxx()functions [#939, #946].See: example notebook.
-
labelTextparameter intheme()for annotation text settings [#930].See: example notebook.
Changed
-
[BREAKING] Function
margin()is deprecated and will be removed in future releases.
Please replace all existing usages, i.e.theme(plotMargin=margin(..))andelementText(margin=margin(..))
with a list or with just a number:- a number or list of one number - the same margin it applied to all four sides;
- a list of two numbers - the first margin applies to the top and bottom, the second - to the left and right;
- a list of three numbers - the first margin applies to the top, the second - to the right and left, the third - to the bottom;
- a list of four numbers - the margins are applied to the top, right, bottom and left in that order.
See: example notebook.
-
Geotools: migrate to v30 [#217].
[BREAKING] GeoTools v30 and up is not backward compatible with v29 and below due to
renaming of all "org.opengis" packages into "org.geotools.api" ones.
See release notes: http://geotoolsnews.blogspot.com/2023/09/geotools-30-rc-released.html -
Upgraded Apache Batik to version 1.17 [#887]
Fixed
- Jitter reproducibility in geomJitter, positionJitter, positionJitterDodge [#911].
- Bug with Tooltips in Swing/Batik [#225].
- Facets: order = 0 doesn't work as expected [#923].
- Enormous CPU / Time/ Memory consumption on some data [#932].
- gggrid: composite plot is not visible if saved with ggsave [#942].
- gggrid doesn't override global theme [#966].
- Marginal box-plots aren't shown when requested on more than 1 plot side.
- Marginal plot: use "pen" as default color for marginal layers.
gggrid()doesn't use global theme settings.- NumberFormat:
gformat doesn't use e-notation for small numbers [#965]. - Tooltips: graphical artifacts and bad performance in multi-line plot in Batik [#967].
- Wrong tooltip position on
geom_segment()with position adjustment [#963]. geomBoxplot(): useoutlierAlphato boxplot outliers (not applyalpha).
[4.5.0] - 2023-11-06
Added
-
Annotations in Barchart.
See: example notebook.
-
Common theme support in subplots (i.e.
gggrid()) [LPK-#197].See: example notebook.
-
HCLandCIELABcolor space for hue color scale and gradient color scales [#876].See: example notebook.
-
New scale transformations:
'log2'and'symlog'.See: example notebook.
-
plotMarginparameter intheme()[#856].See: example notebook.
-
Dual orientation for geometries:
geomErrorBar();geomCrossbar();geomPointRange();geomLineRange();geomRibbon().
See: example notebook.
Fixed
- Husl palette equivalent [#876].
- Tooltips are trimmed and not visible on a very narrow chart [#837].
- Exception label is unresizeble, uncopyable and uncontrollable [#902].
- Flickering during plot downsizing [#888].
- Bad default formatting of numeric values in annotations [#905].
- corr_plot: unexpected whitespace between the "geometry area" and the legend [#877].
- scale_log: an option to generate only breaks which are integer powers of 10 needed [#850].
- Trimmed legend when bounds of the rightmost X-axis tick label exceeds the axis length [#851].
- HTML files exported using ggsave() are missing the encoding specification [#900].
plot_marginparameter intheme()[#856].- Subplot themes not inherited by parent [LPK-#197].
element_blank()has no effect on plot title/subtitle/caption intheme()[#913].- Lollipop in legend is disproportionately large [LPK-216].
- geomBar with fill, produces tooltips artefacts [#895].
- Exception, when trying to build plot with column name containing line breakes [#894].
- Added "grey" spelling for the gray color (earlier - "gray" only).
[4.4.3] - 2023-09-15
Added
geomCount()/statSum()[#821].
See: example notebook.plotMessageparameter intheme(...)[#863].
See: example notebook.- KDocs for the stats.
Changed
-
If layer transparency is set via the alpha-channel in the colors RGBA specification and via the
alphaaesthetic,
then thealphaaesthetic overrides the alpha-channel in the color. Previousely it was the opposite. -
geomPie()defaults:- "stroke" is visible and
strokeSide="both"(wasstrokeSide="outer"). - the "hole" is not created automatically when
strokeSide = "both"/"inner"(was created automatically).
- "stroke" is visible and
-
geomBar()now has solid outline color by default (was transparent). -
geomTile(),geomBin2D()now have solid outline color by default (was transparent).- however, by default the
sizeis 0 (i.e. tiles outline initially is not visible).
- however, by default the
-
[DEPRECATED] Function
statCount2dhas been renamed tostatCount2D. The old name is deprecated.
Fixed
themeVoid()+flavorXxx(): no expected plot background [#858].geomTile(),geomBin2D(): thealphaaesthetic is applied to the tiles outline.scaleXDateTime(): error building plot for early dates [#346].- Inconsistent color in legend when using
paint_a/paint_b/paint_c[#867].
[4.4.2] - 2023-08-23
Added
-
Flavor-aware colors: pen, brush and paper
- By default, all geometries utilize new flavor-aware colors.
- Theme
geomparameter allows redefinition of "geom colors":theme(geom = elementGeom(pen, brush, paper)).
See: example notebook.
-
Support for variadic line width and/or color in
geom_line()andgeom_path()[LP-313].Ses: example notebook.
-
themeVoid(): example notebook -
statECDF(): example notebook. -
geomFunction(): example notebook. -
statSummary(): example notebook. -
statSummaryBin(): example notebook. -
Stat.sum()statistic: example notebook. -
Stat.boxplotOutlier()statistic: example notebook. -
In tooltip customization API:
disableSplitting()function [#189]. -
In
geomPie():strokeandcoloraesthetics - the width and color of pie sector arcs.strokeSideparameter - which arcs to show (inner, outer, both).spacerWidthandspacerColorparameters - lines between sectors.
See: example notebook.
sizeUnitparameter : example notebook.
Changed
Note: Due to major package refactoring in the main Lets-Plot library, this version (4.4.2) of the Kotlin API
is not compatible with versions of Lets-Plot library v3.2.0 and earlier.
-
The default qualitative color palette is now Color Brewer "Set1" (was "Set2")
-
Geometries default colors are now flavor-dependent: example notebook.
-
Geometries default size/line-width is now slightly bigger.
-
Point size is adjusted to match the width of a line of the same "size".
-
[BREAKING] Kotlin/JS LEGACY apps are no longer supported.
-
[BREAKING]
geomPie()no longer supports parameterstrokeColor. -
[BREAKING]
geomBoxplot()no longer support parametersampling. -
[BREAKING]
geomPointRange(): size aesthetic shouldn't affect line width [#751]:
linewidthaesthetic is now used for the line width,size- for mid-point size only. -
geomBoxplot():sizeandstrokeparameters now affect outlier shapes.
Fixed
- ggsave: saving geomImshow() to SVG produces fuzzy picture [#188].
geomCrossbar()aesthetics takemiddleargument instead ofy[#804].geomBoxplot()doesn't apply alpha to outliers [#754].geomBoxplot(): outliers do not show tooltips.geomBoxplot(): some strange outliers drawn here [#143].geomStep(): no tooltips.geomStep(): add 'tooltips' parameter [#195].geomStep(): toggle the behavior of thedirectionparameter when the orientation is changed.geomRibbon(): not all tooltips are shown on a multi-layer plot [#847].- Bug in empty plot: IndexOutOfBoundsException [#194].
- How to remove side tooltips without anchor? [#189].
[4.4.1] - 2023-05-11
Fixed
- Lets-Plot dependency: was 3.2.0-RC1, now 3.2.0.
- ggsave: an error if file does already exist [#187].
[4.4.0] - 2023-05-10
Added
-
geomLollipop().See: example notebook.
-
Aesthetic
strokeand its scalesscaleStroke(),scaleStrokeIdentity().See: example notebook.
-
Aesthetic
linewidth(forgeomLollipop()) and its scalesscaleLinewidth(),scaleLinewidthIdentity().See: example notebook.
-
The 'newline' character (
\n) now works asline breakin legend text.See: example notebook.
-
Horizontal error bars and vertical "dodge".
See: example notebook.
-
"Colorbar" in
geom_imshow(). Parametersshow_legendandcolor_by[#717].
Changed
-
[BREAKING]
geomDotplot()andgeomYDotplot()no longer support parameterstat. -
[BREAKING] Identity scales don't create a legend by default.
Fixed
- Support multiple subdirectories in
ggsavepath [contribution by David Phillips]. scaleXDiscretedoesn't make scale discrete [#165].- Batik:
geom_imshow()fail with an error: "The attribute "xlink:href" of the elementis required"
- Batik: bug with usage of "&" [#713].
- Categorical ordering, it's not respected for Boxplot and violin plot [#746].
- Groups not sorted similarly when using facets [#679].
- HTML export: exclude computation messages from the output [#725].
- Image export not working with
geom_imshow()andgeom_raster()[LPK-175]. geom_segment()doesn't take into account the alpha [#748].geom_density2d: Internal error with None values in data [#702].- DateTime metadata is not applied for scales other than X/Y [LPK-174].
- Quantile should be shown in tooltip if the variable
..quantile..is mapped to geom aesthetic. - Bad default formatting for stat variables [#654].
- The scale name does not apply with
as_discrete()[#653]. - Tooltip is not shown when configured for 'const' value [#610].
- Fix crash when try to add a constant to a tooltip (e.g.
"^size", wheresizeaesthetic is specified with a number). - "Variable not found" error in
ggmarginal[#681]. facet_grid: Internal error [#699].- Tooltips bug [LPK-176].
[4.3.0] - 2023-03-09
Added
-
gggrid()function (docs), as a replacement for earlier variant of gggrid().- plots inner area alignment in grid
- nested grids
- works well with
ggsize()
See: example notebook.
-
jointPlot().See: example notebook.
-
Axis
positionparameter in position scalesscaleX*(), scaleY*().See: example notebook.
-
Drawing quantile lines and filling quantile areas in
geomViolin()andgeomDensity().See: example notebook.
-
angleparameter inelementText()intheme().See: example notebook.
-
Additional "color" aesthetics:
paint_a, paint_b, paint_c.These aesthetics are flexible and can be used as either "color" or "fill" as needed.
See Multiple Color Scales demo.
Also added a set of related "color scale" functions with the "aesthetic" parameter for configuring of additional color scales.
See New "Scale" Functions demo.
-
density2danddensity2dfgeometry types inresidualPlot().
Changed
-
[BREAKING]
geomViolin()no longer supports parameterdrawQuantiles. Use newquantileLinesandquantilesparameters as needed. -
[BREAKING]
stackandfillposition adjustments now stack objects on top of each other only if these objects belong to different groups.If necessary, use
mode="all"inpositionStack()orpositionFill()to stack objects regardless of their group.See: example notebook.
-
[BREAKING] The deprecation level raised to "ERROR" for all API that was deprecated in v. 4.2.0 and earlier.
-
[DEPRECATED] The earlier variant of gggrid().
From now-on please use new variant added in this release: new gggrid().
-
Sampling: drastically increased default N for "pick sampling" and for other types of sampling [#687].
Fixed
- Tooltip does not reflect
..quantile..aesthetic change [#658]. - 'map_join': variable is lost after "stat" [#664].
- Error when tooltip has variable mapped to aesthetic used by stat [#665].
- Groups not sorted similarly when
position='stack'[#673]. - Area ridges: fill overlaps geometry borders when colors are repeated [#674].
- Sampling: increase the default N for "pick sampling" and for other types of sampling [#687].
[4.2.0] - 2022-12-29
Added
-
residualPlot().See: example notebook.
-
geomAreaRidges().See: example notebook.
-
geomPie().See: example notebook.
-
Annotations for pie chart:
See: example notebook.
-
New variables computed by 'count' and 'count2d' statistics: '..sum..', '..prop..', '..proppct..'.
See: example notebook.
-
geomImshow().See: image_101, image_fisher_boat, image_grayscale, image_extent
-
New parameters in
geomViolin():tailsCutoff(example notebook)showHalf(example notebook)
-
Static maps:
-
useCRSparameter with value "provided" forgeomMap()and other geoms, working withSpatialDataset.See: example notebook.
-
Changed
- Upgraded Lets-Plot version to 3.0.0 (was 2.5.1).
- Java/Swing platf.: Apache Batik upgraded to v.1.16 [#624], [LPK #140].
- The default size is increased for the plot title and decreased for the caption.
- Upgraded Kotlin version to 1.7.21 (was 1.7.20).
Fixed
- Themes: can't change plot background after applying a "flavor" [#623].
- Layout: uneven left/right, top/bottom plot margins [#625].
- A plot building error with empty data on various geoms.
- Precision error in gradient [#634].
[4.1.1] - 2022-11-08
Added
-
In
geomText(), geomLabel():- the 'newline' character (
\n) now works asline break lineheightaestheticnudgeX, nudgeYparameters- special text alignments (
vjustandhjust):"inward"and"outward"
See: example notebook.
- the 'newline' character (
-
vjustparameter inpositionStack()andpositionFill().See: example notebook.
Changed
-
Deprecated API:
positionStack, new usage:positionStack()positionFill, new usage:positionFill()
-
geomBoxplot(): default value for parameterwhiskerWidthis 0.5. -
Upgraded Kotlin version to 1.7.20 (was 1.6.21).
-
Upgraded Lets-Plot version to 2.5.1 (was 2.5.0).
See Lets-Plot What is new in 2.5.1 for more details.
Fixed
elementBlank()has no effect in themelegendTitle[#608].- Tooltip: different formats for same aesthetic Y [#579].
- Positioning with "constant" x/y doesn't work on axis with log10 transform [#618].
- Positional "constant" doesn't honor axis limits [#619].
- Several issues leading to crush in Swing/Batik apps. Related to [discussions]
- Text labels got trimmed occasionally, when symbols
-,/,\or|present.
[4.1.0] - 2022-09-30
Added
-
New theme:
themeBW().See: example notebook.
-
Color schemes (flavors) applicable to existing themes:
flavorDarcula()flavorSolarizedLight()flavorSolarizedDark()flavorHighContrastLight()flavorHighContrastDark()
See: example notebook.
-
Viridis color scales:
scaleColorViridis(),scaleFillViridis().See: example notebook.
-
New parameters in theme's
elementText():size, family(example notebook)hjust, vjustfor plot title, subtitle, caption, legend and axis titles (example notebook)marginfor plot title, subtitle, caption, axis titles and tick labels (example notebook)
-
Parameter
whiskerWidthingeomBoxplot().See: example notebook.
-
New geometry
geomLabel().See: example notebook.
Changed
-
New tooltip style after applying
coordFlip()[#580].See: example notebook.
Fixed
- Density and area geoms: preserve the z-order when grouping [#552].
- Boxplot, violin, crossbar: position dodge width=0.95 should be used by default [#553].
- Unclear size unit of width [#589].
- No tooltips for
geomBoxplotwith zero height [#563]. geomText: wrong label alignment withhjust0 and 1 [#592].- Documentation for the
breaksparameter in scales [#507]
[4.0.0] - 2022-07-25
BREAKING CHANGES: Due to refactorings performed in the source code, the v4.0.0 is no longer backward compatible with earlier versions of the Lets-Plot Kotlin API.
Changed
- All previously deprecated API were removed.
- The prefix "org" was added to all package names in the project.
- Some API elements were moved from package
org.jetbrains.letsPlotto a more specific subpackages:- Plot theme elements were moved to subpackage
themes - Coordinate system functions were moved to subpackage
coord - Position adjustment functions were moved to subpackage
pos
- Plot theme elements were moved to subpackage
- Deprecated API:
- Position adjustment constants:
identity, stack, fill, dodge, nudgeandjitterdodge(defined in thePosobject), are now deprecated in favor of the correspondent top level elements defined in the (new)org.jetbrains.letsPlot.pospackage:positionIdentity, positionStack, positionFill, positionDodge(), positionNudge()andpositionJitterDodge().
- Position adjustment constants:
Migrating to 4.0.0
In Kotlin project
- Update all
importstatements:import jetbrains.letsPlot..→import org.jetbrains.letsPlot.. - In all places in your project where the code needs to be updated, IntelliJ will show you a
deprecation WARNINGand will offer to fix this automatically.
In Jupyter notebook
- As soon as you start using 4.0.0 in you notebook, the only thing you will want to do is to manually replace all
deprecated
Pos.abcexpressions with their new equivalents:Pos.identity→positionIdentityPos.stack→positionStackPos.fill→positionFillPos.dodge→positionDodge()Pos.nudge→positionNudge()Pos.jitterdodge→positionJitterDodge()
NOTE: If your notebook also uses another Kotlin library which depends on an older version of Lets-Plot, then the classloader may refuse to load classes from both libraries. If this is the case, then you will want to do NOT update your notebook to Lets-Plot v4.0.0 as yet:
- Make sure your notebook is not using the
%useLatestDescriptorsline magic- Make sure you are using Kotlin Jupyter Kernel version 0.11.0.95 (or earlier), which bundles a previous version of Lets-Plot.
[3.3.0] - 2022-06-27
Added
-
Global theme configuring with
LetsPlot.themeproperty.See: example notebook.
-
Quantile-Quantile (Q-Q) plot:
- geometries:
geomQQ()geomQQLine()geomQQ2()geomQQ2Line()
- stats:
statQQ()statQQLine()statQQ2()statQQ2Line()
- quick Q-Q:
qqPlot()
See: example notebook.
- geometries:
-
Marginal plots: the
ggmarginal()function.See: example notebook.
-
Parameter
orientationin geoms:bar, boxplot, density, histogram, freqpoly, smooth, violin.See: example notebook.
-
New in plot theme:
-
faceparameter inelementText().See: example notebook.
-
panelBorderparameter intheme()[#542].See: example notebook.
-
Tooltip theme options, new parameters in
theme():tooltip- tooltip rectangle options;tooltipText, tooltipTitleText- tooltip text options;axisTooltipText, axisTooltipTextX, axisTooltipTextY- axis tooltip text options.
See: example notebook.
-
-
scaleColorGradientN()andscaleFillGradientN()functions [#504].See: example notebook.
-
kotlinx.datetimesupport. -
arrowparameter ingeomSegment- specification for arrow heads, as created byarrow()function.
Changed
- Potentially breaking change: deprecation level for all deprecated API raised to the ERROR level.
geomImage()removed as it is not yet production ready.- Default sampling type for
geom_violinswitched fromsystematictopick.
Fixed
- Labels out of plot when axisTextY="blank" [#525].
- Outliers are not shown when boxplot' alpha=0.
- JFX rendering issue that causes tooltips to stuck [#539].
- Support trim parameter in
densityandydensitystats [#62]. geom_violin: add missing parameterskernel,bw,adjust,n,fs_maxto signature and docstring.
[3.2.0] - 2022-03-29
Added
-
New geometries:
geomViolin()
See: example notebook.
geomDotplot()
See: example notebook.
geomYDotplot()
See: example notebook.
-
Plot subtitle and caption:
subtitleparameter inggtitle()andlabs(),captionparameter inlabs(),plotSubtitleandplotCaptionparameters intheme().See: example notebook.
-
Multi-line labels: The 'newline' character (
\n) now works asline breakin plot title, subtitle and caption, in legend's title and in tooltips. -
In tooltip customization API: the
title()option defines a tooltip "title" text which will always appear above the rest of the tooltip content.See: example notebook.
-
Parameter
scalesinfacetGrid()/facetWrap()[#451, #479].See: example notebook.
Changed
- New tooltip style: rounded corners, bold label, colored marker inside the tooltip.
- Deprecated tooltip customization API: function
color()will be removed in one of the future releases. - 'Auto shrink': plots automatically shrink when necessary to fit width of the output (notebook) cell [#488].
Fixed
- Automatic detection of DateTime series [#99].
- Too limited mapping options in GenericAesMapping [#82]
- scaleColorManual Divide by Zero with 1 mapping [#506].
- LinearBreaksHelper$Companion.computeNiceBreaks out of memory error [#105].
- CVE-2021-23792 in org.jetbrains.lets-plot:lets-plot-image-export@2.2.1 [#497].
- Fix tooltips for
geom_histogram(stat='density'). - The axis tooltip overlaps the general tooltip [#515].
- The multi-layer tooltip detection strategy will only be used if more than one layer provides tooltips.
[3.1.1] - 2021-12-13
Added
-
scaleXTime()andscaleYTime().See: example notebook.
-
plotBackground, legendBackgroundparameters intheme()[#485]. -
axisOntop, axisOntopX, axisOntopYparameters intheme()
Fixed
- It should automatically stringify enums [#97].
- Coord system limits do not work with x/y scale with transform [#474].
- Provide 0-23 hour formatting [#469].
- No tooltip shown when I'm trying to add an empty line [#382].
coord_fixed()should adjust dimensions of "geom" panel accordingly [#478].- The tooltip dependence on number of factors works separately by layers [#481].
- Tooltip on y-axis looks wrong [#393].
- Is kotlin-reflect really needed for lets-plot? [#471].
[3.1.0] - 2021-11-05
Added
-
coordFlip().See: example notebook .
-
Date-time formatting support:
- using date-time format pattern in tooltip format();
- date/time scales apply date-time formatting to the
breaks.
See
Out[7, 8, 10]in the example notebook . -
Pre-configured themes:
- Standard ggplot2 themes:
themeGrey(), themeLight(), themeClassic(), themeMinimal(); - Other themes:
themeMinimal2()- the default theme,themeNone().
- Standard ggplot2 themes:
-
Theme modification: more parameters were added to the
theme()function.See: example notebook.
Note: fonts size, family and face still can not be configured.
-
CorrPlot()function now also accepts pre-computed correlation coefficients. -
Kotlin/JS IR:
xxx.klibartifacts are now available.
Changed
- The size of fonts on plot was slightly increased all across the board.
- The default plot size was increased by 20%, it's now 600x400 px.
- Deprecated API: all
Theme.xxxBlank()functions. Please use corresponding parameters intheme().
Fixed
- Ordering facets - the "order" value 0 disables facet ordering [#454].
- Tooltips for discrete variables: add the dependence of the tooltip on the number of factors. The X-axis tooltip is always shown for discrete data.
- Unreadable breaks on axis [#430].
[3.0.2] - 2021-06-09
Added
-
Ordering categories:
New parameters added to the
asDiscrete()function:orderBy- name of the variable by which the ordering will be performed;order- ordering direction: 1 for ascending direction and -1 for descending (default).
See: as_discrete.
Changed
- Upgraded dependencies:
- Kotlin: 1.5.21
- Lets-Plot: 2.1.0 (see Lets-Plot CHANGELOG)
- Apache Batik: 1.14 [#398]
[3.0.1] - 2021-06-09
Added
- The 'format' parameter in all scales [76].
Changed
- Upgraded
kotlinx.htmlversion to 0.7.3 (was 0.7.2)
In JVM projects it's no longer necessary to add
https://maven.pkg.jetbrains.space/public/p/kotlinx-html/mavenrepository to the project configuration.
Fixed
[3.0.0] - 2021-06-04
Added
-
In tooltip customization API:
layerTooltips(variables)- the new parametervariablesdefines a list of variable names, which values will be placed in the general multiline tooltip. See: Tooltip Customization.
-
lets-plot-mini-apps GitHub repository containing examples of using the Lets-Plot Kotlin API in JVM and Kotlin/JS projects.
Changed
-
[BREAKING CHANGE]: The CDN for delivering the Lets-Plot JavaScript library is now JSDELIVR (was CDNJS).
New URLs:
-
The project has been converted to a "multiplatform" project targeting JVM and JS platforms.
To use Lets-Plot Kotlin API in your project, include dependencies:
- JVM:
implementation "org.jetbrains.lets-plot:lets-plot-kotlin-jvm:3.0.0" - JS:
implementation "org.jetbrains.lets-plot:lets-plot-kotlin-js:3.0.0"
See USAGE_SWING_JFX_JS.md for more details.
- JVM:
-
[BREAKING CHANGE] The JVM artifact
lets-plot-kotlin-apiis no longer deployed: replaced with the equivalentlets-plot-kotlin-jvm. -
The artifact
lets-plot-kotlin-api-kernelrenamed tolets-plot-kotlin-kernel(this change only concerns Kotlin Jupyter Kernel)
Fixed
- Poor font rendering in Swing/Batik. Related to: [#364]
- Exclude slf4j implementation from lets-plot-common [#374]
- geom_boxplot: should be possible to create boxplot without specifying x-series [#325]
- geom_hline: graph plotted outside of coordinate plane visible part [#334]
- Draw geometry only once if layer has no aes mapping specified [#73]
- Can't build plot: "Uncaught SyntaxError: Unexpected string" in a console [#371]
[2.0.1] - 2021-04-19
Changed
- [BREAKING CHANGE]: The groupId of all maven artifacts is now "org.jetbrains.lets-plot" (was " org.jetbrains.lets-plot-kotlin")
- Built with Lets-Plot v2.0.2 (was v2.0.2).
- All snake_case symbols were deprecated and replaced with equivalent camelCase symbols [#53].
- Maven artifacts published to Maven Central (due to shutting down of Bintray, JCenter)
[1.3.0] - 2021-03-22
Added
-
facet_wrap()function. -
in
facet_grid()function:- Ascending/descending ordering of faceting values.
- Formatting of faceting values.
See: Facets demo
-
The
formatparameter in positional scales: formatting tick labels on X/Y axis. Supported types arenumberanddate/time.Example:
scale_x_datetime(format="%b %Y") scale_x_continuous(format="is {.2f}")Demo: Formatting demo
See also: Formatting
-
The
guides()function [#52]. -
In tooltip customization API:
- option
coloroverrides the default tooltip color:geom_xxx(tooltips=layer_tooltips().color("red"))
See: Tooltip Customization.
- option
Changed
- Built with Lets-Plot v2.0.1 (was v1.5.6).
- All Java Swing demos were updated to use new
plot components(new in Lets-Plot v2.0.1). - The "Minimal demo" was updated:
Fixed
The majority of fixes in the core Lets-Plot vv 2.0.0, 2.0.1 are also applicable to this release.
See the Lets-Plot CHANGELOG.md.
[1.2.0] - 2021-01-15
Added
-
Correlation plot builder.
Example: correlation_plot.ipynb
-
The
gggrid()plot layout utilityExample: correlation_plot.ipynb
-
In tooltip customization API:
- options:
centerandmiddle(anchor). - option 'minWidth'.
Example: tooltip_config.ipynb
- options:
-
The
naTextparameter ingeom_text()
Changed
-
Built with Lets-Plot v1.5.6 (was v1.5.4).
See Lets-Plot CHANGELOG.md for changes and fixes in 1.5.5, 1.5.6.
[1.1.0] - 2020-11-20
Added
- GeoTools support (see geotools.md).
- API for tooltip customization ( see tooltips.md).
geom_map().labelFormatparameter ingeom_text().reverseparameter inscale_x/y_discrete().scale_x_discrete_reversed(),scale_y_discrete_reversed()
Changed
-
Built with Lets-Plot v1.5.4 (was v1.5.2).
See Lets-Plot CHANGELOG.md for changes and fixes in 1.5.3, 1.5.4.
Fixed
ggsave()ignores raster format file extension.as_discrete(): if more than one is used in the same mapping block, then all but one of them are ignored.
[1.0.0] - 2020-08-13
Added
- The first public release.
Changed
- Maven artifact group id has changed.
- was before:
org.jetbrains.lets-plot - since now :
org.jetbrains.lets-plot-kotlin
- was before: