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.
This release is 100% compatible with Lets-Plot v 4.5.2, GeoTools v 32.1
- 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.
- 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].
Same as 4.9.1, added missing Maven artifacts.
This release is 100% compatible with Lets-Plot v 4.5.1, GeoTools v 32.1
- Migrated to new Kotlin Jupyter integration.
This release is 100% compatible with Lets-Plot v 4.5.1.
-
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
-
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".
- 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].
This release is 100% compatible with Lets-Plot v 4.4.0, v 4.4.1.
-
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.
- The triangular point shape is now anchored to the data point via the centroid
- 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.
This release is 100% compatible with Lets-Plot v 4.3.3.
- Support for
angle
aesthetic ingeomPoint()
[#736].
See example notebook.
- 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].
This release is 100% compatible with Lets-Plot v 4.3.2.
- LP occasionally crashes when drawing polygons [#1084].
- Regression of issue [#966].
- Linetype doesn't work for
geomTile()
[LPK-241].
This release is 100% compatible with Lets-Plot v 4.3.1.
-
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.
LetsPlot.theme
global property now accepts a sum of theme/flavor features [#657].
- 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].
-
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 theflat
option.See: example notebook.
-
In the
theme()
function:-
panelInset
parameter - primarily used for plots with polar coordinates.See: example notebook.
-
panelBorderOntop
parameter - enables the drawing of panel border on top of the plot geoms. -
panelGridOntop, panelGridOntopX, panelGridOntopY
parameters - 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, strokeStart
andstrokeEnd
enable better alignment of
segments/curves with nodes of the graph by considering the size of the nodes. -
The
spacer
parameter allows for additional manual fine-tuning.
See: example notebook.
-
-
alphaStroke
parameter ingeomLabel()
to enable the applying ofalpha
tocolor
[#1029].See: example notebook.
- Parameter
axisOntop
intheme()
is nowtrue
by default.
- 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
null
for 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].
-
The
levels
parameter 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
lablim
parameter forscaleXxx()
functions [#939, #946].See: example notebook.
-
labelText
parameter intheme()
for annotation text settings [#930].See: example notebook.
-
[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]
- 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:
g
format 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()
: useoutlierAlpha
to boxplot outliers (not applyalpha
).
-
Annotations in Barchart.
See: example notebook.
-
Common theme support in subplots (i.e.
gggrid()
) [LPK-#197].See: example notebook.
-
HCL
andCIELAB
color space for hue color scale and gradient color scales [#876].See: example notebook.
-
New scale transformations:
'log2'
and'symlog'
.See: example notebook.
-
plotMargin
parameter intheme()
[#856].See: example notebook.
-
Dual orientation for geometries:
geomErrorBar()
;geomCrossbar()
;geomPointRange()
;geomLineRange()
;geomRibbon()
.
See: example notebook.
- 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_margin
parameter 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).
geomCount()
/statSum()
[#821].
See: example notebook.plotMessage
parameter intheme(...)
[#863].
See: example notebook.- KDocs for the stats.
-
If layer transparency is set via the alpha-channel in the colors RGBA specification and via the
alpha
aesthetic,
then thealpha
aesthetic 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
size
is 0 (i.e. tiles outline initially is not visible).
- however, by default the
-
[DEPRECATED] Function
statCount2d
has been renamed tostatCount2D
. The old name is deprecated.
themeVoid()
+flavorXxx()
: no expected plot background [#858].geomTile()
,geomBin2D()
: thealpha
aesthetic 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].
-
Flavor-aware colors: pen, brush and paper
- By default, all geometries utilize new flavor-aware colors.
- Theme
geom
parameter 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()
:stroke
andcolor
aesthetics - the width and color of pie sector arcs.strokeSide
parameter - which arcs to show (inner, outer, both).spacerWidth
andspacerColor
parameters - lines between sectors.
See: example notebook.
sizeUnit
parameter : example notebook.
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]:
linewidth
aesthetic is now used for the line width,size
- for mid-point size only. -
geomBoxplot()
:size
andstroke
parameters now affect outlier shapes.
- ggsave: saving geomImshow() to SVG produces fuzzy picture [#188].
geomCrossbar()
aesthetics takemiddle
argument 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 thedirection
parameter 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].
- Lets-Plot dependency: was 3.2.0-RC1, now 3.2.0.
- ggsave: an error if file does already exist [#187].
-
geomLollipop()
.See: example notebook.
-
Aesthetic
stroke
and its scalesscaleStroke()
,scaleStrokeIdentity()
.See: example notebook.
-
Aesthetic
linewidth
(forgeomLollipop()
) and its scalesscaleLinewidth()
,scaleLinewidthIdentity()
.See: example notebook.
-
The 'newline' character (
\n
) now works asline break
in legend text.See: example notebook.
-
Horizontal error bars and vertical "dodge".
See: example notebook.
-
"Colorbar" in
geom_imshow()
. Parametersshow_legend
andcolor_by
[#717].
-
[BREAKING]
geomDotplot()
andgeomYDotplot()
no longer support parameterstat
. -
[BREAKING] Identity scales don't create a legend by default.
- Support multiple subdirectories in
ggsave
path [contribution by David Phillips]. scaleXDiscrete
doesn't make scale discrete [#165].- Batik:
geom_imshow()
fail with an error: "The attribute "xlink:href" of the element is 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"
, wheresize
aesthetic is specified with a number). - "Variable not found" error in
ggmarginal
[#681]. facet_grid
: Internal error [#699].- Tooltips bug [LPK-176].
-
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
position
parameter in position scalesscaleX*(), scaleY*()
.See: example notebook.
-
Drawing quantile lines and filling quantile areas in
geomViolin()
andgeomDensity()
.See: example notebook.
-
angle
parameter 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.
-
density2d
anddensity2df
geometry types inresidualPlot()
.
-
[BREAKING]
geomViolin()
no longer supports parameterdrawQuantiles
. Use newquantileLines
andquantiles
parameters as needed. -
[BREAKING]
stack
andfill
position 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].
- 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].
-
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:
-
useCRS
parameter with value "provided" forgeomMap()
and other geoms, working withSpatialDataset
.See: example notebook.
-
- 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).
- 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].
-
In
geomText(), geomLabel()
:- the 'newline' character (
\n
) now works asline break
lineheight
aestheticnudgeX, nudgeY
parameters- special text alignments (
vjust
andhjust
):"inward"
and"outward"
See: example notebook.
- the 'newline' character (
-
vjust
parameter inpositionStack()
andpositionFill()
.See: example notebook.
-
Deprecated API:
positionStack
, new usage:positionStack()
positionFill
, new usage:positionFill()
-
geomBoxplot()
: default value for parameterwhiskerWidth
is 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.
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.
-
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, vjust
for plot title, subtitle, caption, legend and axis titles (example notebook)margin
for plot title, subtitle, caption, axis titles and tick labels (example notebook)
-
Parameter
whiskerWidth
ingeomBoxplot()
.See: example notebook.
-
New geometry
geomLabel()
.See: example notebook.
-
New tooltip style after applying
coordFlip()
[#580].See: example notebook.
- 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
geomBoxplot
with zero height [#563]. geomText
: wrong label alignment withhjust
0 and 1 [#592].- Documentation for the
breaks
parameter in scales [#507]
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.
- 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.letsPlot
to 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, nudge
andjitterdodge
(defined in thePos
object), are now deprecated in favor of the correspondent top level elements defined in the (new)org.jetbrains.letsPlot.pos
package:positionIdentity, positionStack, positionFill, positionDodge(), positionNudge()
andpositionJitterDodge()
.
- Position adjustment constants:
In Kotlin project
- Update all
import
statements: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 WARNING
and 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.abc
expressions with their new equivalents:Pos.identity
→positionIdentity
Pos.stack
→positionStack
Pos.fill
→positionFill
Pos.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
%useLatestDescriptors
line magic- Make sure you are using Kotlin Jupyter Kernel version 0.11.0.95 (or earlier), which bundles a previous version of Lets-Plot.
-
Global theme configuring with
LetsPlot.theme
property.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
orientation
in geoms:bar, boxplot, density, histogram, freqpoly, smooth, violin
.See: example notebook.
-
New in plot theme:
-
face
parameter inelementText()
.See: example notebook.
-
panelBorder
parameter 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.datetime
support. -
arrow
parameter ingeomSegment
- specification for arrow heads, as created byarrow()
function.
- 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_violin
switched fromsystematic
topick
.
- 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
density
andydensity
stats [#62]. geom_violin
: add missing parameterskernel
,bw
,adjust
,n
,fs_max
to signature and docstring.
-
New geometries:
geomViolin()
See: example notebook.
geomDotplot()
See: example notebook.
geomYDotplot()
See: example notebook.
-
Plot subtitle and caption:
subtitle
parameter inggtitle()
andlabs()
,caption
parameter inlabs()
,plotSubtitle
andplotCaption
parameters intheme()
.See: example notebook.
-
Multi-line labels: The 'newline' character (
\n
) now works asline break
in 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
scales
infacetGrid()/facetWrap()
[#451, #479].See: example notebook.
- 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].
- 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:[email protected] [#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.
-
scaleXTime()
andscaleYTime()
.See: example notebook.
-
plotBackground, legendBackground
parameters intheme()
[#485]. -
axisOntop, axisOntopX, axisOntopY
parameters intheme()
- 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].
-
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.klib
artifacts are now available.
- 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()
.
- 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].
-
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.
- Upgraded dependencies:
- Kotlin: 1.5.21
- Lets-Plot: 2.1.0 (see Lets-Plot CHANGELOG)
- Apache Batik: 1.14 [#398]
- The 'format' parameter in all scales [76].
- Upgraded
kotlinx.html
version 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/maven
repository to the project configuration.
-
In tooltip customization API:
layerTooltips(variables)
- the new parametervariables
defines 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.
-
[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-api
is no longer deployed: replaced with the equivalentlets-plot-kotlin-jvm
. -
The artifact
lets-plot-kotlin-api-kernel
renamed tolets-plot-kotlin-kernel
(this change only concerns Kotlin Jupyter Kernel)
- 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]
- [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)
-
facet_wrap()
function. -
in
facet_grid()
function:- Ascending/descending ordering of faceting values.
- Formatting of faceting values.
See: Facets demo
-
The
format
parameter in positional scales: formatting tick labels on X/Y axis. Supported types arenumber
anddate/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
color
overrides the default tooltip color:geom_xxx(tooltips=layer_tooltips().color("red"))
See: Tooltip Customization.
- option
- 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:
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.
-
Correlation plot builder.
Example: correlation_plot.ipynb
-
The
gggrid()
plot layout utilityExample: correlation_plot.ipynb
-
In tooltip customization API:
- options:
center
andmiddle
(anchor). - option 'minWidth'.
Example: tooltip_config.ipynb
- options:
-
The
naText
parameter ingeom_text()
-
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.
- GeoTools support (see geotools.md).
- API for tooltip customization ( see tooltips.md).
geom_map()
.labelFormat
parameter ingeom_text()
.reverse
parameter inscale_x/y_discrete()
.scale_x_discrete_reversed()
,scale_y_discrete_reversed()
-
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.
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.
- The first public release.
- Maven artifact group id has changed.
- was before:
org.jetbrains.lets-plot
- since now :
org.jetbrains.lets-plot-kotlin
- was before: