You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- The legend automatically wraps to prevent overlap - up to 15 rows for vertical legends and 5 columns for horizontal ones [[#1235](https://github.com/JetBrains/lets-plot/issues/1235)].
- New `output` parameter for the library descriptor to control output types stored in notebook cells [[LPK-277](https://github.com/JetBrains/lets-plot-kotlin/issues/277)].\
63
+
Thanks to [AndreiKingsley](https://github.com/AndreiKingsley) for the contribution!
64
+
```
65
+
%use lets-plot(output="js, png")
66
+
```
67
+
68
+
Available output types:
69
+
-`js` - Classic Web output: HTML+JS
70
+
-`ktnb` - Kotlin Notebook Swing-based rendering
71
+
-`svg` - Static SVG output
72
+
-`png` - Static PNG output
73
+
74
+
Default: `"js, ktnb, svg"`
75
+
76
+
**Note:** Static images (SVG/PNG) are hidden when `js` or `ktnb` outputs are present, and only displayed in environments where JavaScript is not executed (e.g., GitHub).
77
+
78
+
This option can be helpful when a Kotlin Notebook file size becomes a problem. \
79
+
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.
80
+
81
+
-[`CenteredPlotPanel`](https://github.com/JetBrains/lets-plot/blob/master/platf-awt/src/main/kotlin/org/jetbrains/letsPlot/awt/plot/component/CenteredPlotPanel.kt) helper class for displaying plots centered in Swing applications.
82
+
83
+
### Changed
84
+
85
+
-[**BREAKING**] Explicit `group` aesthetic now overrides default grouping behavior instead of combining with it [[#1401](https://github.com/JetBrains/lets-plot/issues/1401)].
> Previously, setting `group="variable"` would group by both the explicit variable AND any discrete
91
+
> aesthetics (color, shape, etc.). \
92
+
> Now it groups ONLY by the explicit variable, matching `ggplot2` behavior. \
93
+
> Use `group=listOf(var1, var2, ...)` to group by multiple variables explicitly, \
94
+
> and `group=emptyList<Any>()` to disable any grouping.
95
+
96
+
- Missing values in `geomLine(), geomPath(), geomRibbon()`, and `geomArea()` create gaps in geometries instead of being interpolated over [[LPK-269](https://github.com/JetBrains/lets-plot-kotlin/issues/269)],[[#818](https://github.com/JetBrains/lets-plot/issues/818)], [[#1406](https://github.com/JetBrains/lets-plot/issues/1406)].
-`theme`: the `exponentFormat` default value changed to `"pow"` - superscript powers of 10 (was e-notation).
101
+
102
+
- 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.
103
+
104
+
105
+
### Fixed
106
+
107
+
- Group by multiple columns [[LPK-136](https://github.com/JetBrains/lets-plot-kotlin/issues/136)].
108
+
-`geomPie` on geospatial plot with `mapJoin` failes to render without explicit `group` aesthetic.
109
+
-`geomDensity2D`: NullPointerException when weight aesthetic contains None values [[#1399](https://github.com/JetBrains/lets-plot/issues/1399)].
110
+
- Tooltip shows duplicate lines when as_discrete is applied twice to the same var [[#1400](https://github.com/JetBrains/lets-plot/issues/1400)].
111
+
-`geomSina`: incorrect shape in legend [[#1403](https://github.com/JetBrains/lets-plot/issues/1403)].
112
+
-`geomDensity2D`: Incorrect processing of weighted statistics when None value occurs in the x or y column.
113
+
-`facetWrap`: indescriptive error when the specified facet variable is not present in the dataset [[#1409](https://github.com/JetBrains/lets-plot/issues/1409)].
114
+
- Integer numbers in facet strip titles are displayed as float [[#1386](https://github.com/JetBrains/lets-plot/issues/1386)].
115
+
- Error when using `scaleIdentity(aesthetic="shape")`[[#1212](https://github.com/JetBrains/lets-plot/issues/1212)].
116
+
-`ggsave`: theme option `face="italic"` doesn't work [[#1391](https://github.com/JetBrains/lets-plot/issues/1391)].
117
+
- Fail early if string format is incorrect [[#1410](https://github.com/JetBrains/lets-plot/issues/1410)].
118
+
-`statECDF()` takes a very long time for even moderately sized datasets [[#1424](https://github.com/JetBrains/lets-plot/issues/1424)].
119
+
- inconsistencies in theme/flavor inheritance in `gggrid()` subplots.
120
+
121
+
8
122
## [4.11.2] - 2025-09-12
9
123
10
124
This release is 100% compatible with Lets-Plot [v 4.7.3](https://github.com/JetBrains/lets-plot/releases/tag/v4.7.3),
-`isolatedFrame` - If `false`: load JS just once per notebook (default in Jupyter).
109
+
-`isolatedFrame` - If `false`: load JS just once per notebook (default in Jupyter).
110
110
If `true`: include Lets-Plot JS in each output (default in [Datalore](https://datalore.jetbrains.com/) notebooks).
111
+
-`output` - comma-separated list of output types to store in notebook cells (default: `"js, ktnb, svg"`). \
112
+
Available types:
113
+
-`js` - Classic Web output: HTML+JS
114
+
-`ktnb` - Kotlin Notebook Swing-based rendering
115
+
-`svg` - Static SVG output
116
+
-`png` - Static PNG output
111
117
118
+
**Note:** Static images (SVG/PNG) are hidden when `js` or `ktnb` outputs are present, and only displayed in environments where JavaScript is not executed (e.g., GitHub).
119
+
120
+
This option can be helpful when file size becomes a problem. For example, storing only static output (SVG or PNG) can significantly reduce file size when working with large datasets where plot interactivity is not a priority.
112
121
113
122
<aid="in-compose-multiplatform"></a>
114
123
### Compose Multiplatform
@@ -132,68 +141,61 @@ Examples of using the Lets-Plot Kotlin API in JVM and Kotlin/JS applications are
See [Date-time](https://nbviewer.org/github/JetBrains/lets-plot-kotlin/blob/master/docs/examples/jupyter-notebooks/f-4.11.0/time_date_datetime.ipynb) cookbook.
> New way of handling continuous data on discrete scales could potentially break existing plots.
187
-
> If you want to restore a broken plot to its original form, you can use the [`asDiscrete()`](https://lets-plot.org/kotlin/as-discrete.html) function to annotate continuous data as discrete.
-#### `ggtb()`: Added `sizeZoomin` and `sizeBasis` parameters to control point size scaling behavior when zooming (works with `geomPoint` and related layers).
195
197
196
-
See new [Plot Layout Diagrams](https://lets-plot.org/kotlin/presentation-options.html#plot-layout-diagrams) showing various layout options and their effects on plot appearance.
0 commit comments