Skip to content

Latest commit

 

History

History
2157 lines (1410 loc) · 118 KB

File metadata and controls

2157 lines (1410 loc) · 118 KB

Lets-Plot Changelog

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.

[4.9.0] - 2026-03-11

Added

  • Python 3.14 support.

  • Python 3.14 free-threading support [#1454].

  • Plot Annotations:

    • New labels parameter in geom_smooth() designed to display statistical summaries of the fitted model directly on the plot.
      This parameter accepts a smooth_labels() object, which provides access to model-specific variables like $R^2$, the regression equation and others.

      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 scheme.

    • Plot tags customization parameters in theme():

      • plot_tag - sets the tag style via element_text().
      • plot_tag_location - specifies the area used for positioning the tag.
      • plot_tag_position - specifies the position of the tag within the selected area.
      • plot_tag_prefix - text added before the tag value.
      • plot_tag_suffix - text added after the tag value.

      See: example notebook.

  • Geometries:

    • New geom_bracket(), geom_bracket_dodge() [#1114].

      See: example notebook.

    • geom_imshow():

      • Support for custom colormaps [#780].

      • New cguide parameter: 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 with scale_color_manual() to maintain consistent colors across multiple plots [#1444].

      See: example notebook.

    • New overflow parameter in scale_color_brewer() / scale_fill_brewer(): 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:

  • gggrid(): interactive pan/zoom now propagates across subplots with shared axes (sharex/sharey) [#1413].

    See: example notebook.

Changed

  • [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 new overflow parameter to explicitly control this behavior.

  • Reduced import overhead by nearly two orders of magnitude (from ~1.2s down to ~0.02s) [#1469].

  • Missing values in geom_area_ridges() create gaps in geometries instead of being interpolated over.

  • Discrete color scales (Brewer, Manual) now produce a colorbar guide when used with continuous data.
    Previously they produced a legend guide regardless of the data type.

  • Changes affecting users on the JVM platform:

    • Upgraded the Kotlin version to 2.2.20 (was 1.9.25).
    • New artifact for JVM Swing applications: org.jetbrains.lets-plot:lets-plot-swing.
      This artifact provides the SwingPlotPanel class, which can be used to display plots in Swing applications instead of the now-obsolete DefaultPlotPanelBatik.
      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-jfx artifact is no longer available.
      Replace it with new org.jetbrains.lets-plot:lets-plot-swing dependency and use SwingPlotPanel instead of DefaultPlotPanelJfx.
      For details, see the jvm-javafx-app example in the "lets-plot-mini-apps" repository.
    • [BREAKING]: Removed plot-image-export module.
      The org.jetbrains.lets-plot:lets-plot-image-export artifact is no longer available.
      The PlotImageExport utility has been moved to the platf-awt module.
      The required org.jetbrains.lets-plot:platf-awt dependency is likely already present in your project.

Fixed

  • Drop commons-io dependency [#1421].
  • Unexpected replacement of double curly brackets with a single curly bracket [#1433].
  • Upgrade to a newer version of ws [#1150].
  • 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 geom_text_repel() / geom_label_repel(): 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.8.2] - 2026-12-19

Fixed

  • Hyperlinks support for lets-plot-compose.
  • Colab no longer rendering lets-plot with empty setup HTML [#1436]

[4.8.1] - 2025-12-01

Fixed

  • saving plots as png takes a very long time [#1423].
  • stat_ecdf() takes a very long time for even moderately sized datasets [#1424].
  • lets-plot plots are not displayed in plots pane [PST-8170].
  • inconsistencies in theme/flavor inheritance in gggrid() subplots.

[4.8.0] - 2025-11-05

Added

  • Geometries:

    • geom_pointdensity() [#1370].

      See: example notebook.

    • Geoms with 1-to-1 statistics (such as geom_qq(), geom_sina()) preserve the mapping to original data after statistical transformation.

      See: example notebook.

    • geom_histogram(): custom bin bounds (parameter breaks) [#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 (parameter guides).

      See: example notebook.

  • Plot Theme:

    • flavor_standard() sets the theme's default color scheme [#1277].
      Use to override other flavors or make defaults explicit.

      See: example notebook.

    • theme_gray() as an alias for theme_grey().

    • legend_justification parameter of theme() accepts additional string values: 'left', 'right', 'top', and 'bottom'.

      See: example notebook.

    • Support for inward axis ticks.

      See: example notebook.

  • Markdown:

    • Support for target attribute for links.
    • Links now open in a new tab by default [#1397].
  • ggtb(): size_zoomin and size_basis parameters for geometry scaling [#1369].

    See: example notebook.

Changed

  • [BREAKING] Explicit group aesthetic 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=[var1, var2, ...] to group by multiple variables explicitly,
and group=[] to disable any grouping.

  • Missing values in geom_line(), geom_path(), geom_ribbon(), and geom_area() create gaps in geometries instead of being interpolated over [#818], [#1406].

    See: example notebook.

  • theme: the exponent_format default 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

  • geom_pie on geospatioal plot with map_join failes to render without explicit group aesthetic.
  • geom_density2d: NullPointerException when weight aesthetic contains None values [#1399].
  • Tooltip shows duplicate lines when as_discrete is applied twice to the same var [#1400].
  • geom_sina: incorrect shape in legend [#1403].
  • geom_density2d: Incorrect processing of weighted statistics when None value occurs in the x or y column.
  • facet_wrap: 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 scale_identity(aesthetic="shape") [#1212].
  • ggsave: theme option face="italic" doesn't work [#1391].
  • Fail early if string format is incorrect [#1410].

[4.7.3] - 2025-09-12

Changed

  • ggsave(): Large plot dimensions without units now require explicit unit specification.
    When plot size exceeds 20 without specifying units (e.g., ggsave(p, 300, 400)),
    we ask to specify units explicitly:
    ggsave(p, 300, 400, unit='px') or ggsave(p, 3, 4, unit='in').

Fixed

  • ggtb() support in Swing/Batik frontend.
  • Multiline support for axis labels in polar coordinates.
  • When the plot size in ggsave() is specified in pixels, dpi now affects
    only the physical size, not the pixel dimensions as before.
  • Blocking SwingUtilities.invokeAndWait() call in plot image export (AWT backend)

Internal Memo

Lets-Plot VL spec transformer removed—relocated to another repository

[4.7.2] - 2025-09-01

Added

  • Plot Layout:

    • New strip_spacing, strip_spacing_x, and strip_spacing_y parameters in theme() to control spacing between the facet strip (title bar) and the plot panel.
    • New panel_spacing, panel_spacing_x, and panel_spacing_y parameters in theme() to control spacing between plot panels in faceted plots, [#1380].

    See: example notebook.

  • Image resolution is saved in the metadata of PNG files created with ggsave().

Changed

  • plot-image-export: switched from Batik to Graphics2D API

Fixed

  • ggsave(): memory leak when using geom_raster().
  • Incorrect physical image size when exporting PDF with ggsave() without specifying dpi.

[4.7.1] - 2025-08-13

Added

  • ggsave():
    • support font synthesis for italic and bold styles.
    • px unit support for PNG and PDF formats.
    • w, h and unit parameters support for SVG [#1368].

Changed

  • facet_wrap() now drops factor levels that do not appear in the data (i.e., empty panels) by default [#1322].
    To keep unused factor levels, use the new drop parameter, i.e., drop=False.

    See: example notebook.

  • Removed extra spacing between facet strips and plot panels in facet_wrap() and facet_grid().

Fixed

  • geom_livemap: can't draw a path crossing the antimeridian [#649].
  • Tooltip for a line have higher priority than points, even if the point is specified first in the layer list [#1060].
  • geom_ribbon(): tooltip appears in the wrong place on flipped ribbon [#1334].
  • Arrow crossing -180 longitude is split into two arrows [#1364].
  • 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]
  • Polars: add handling for Enum values [#1373]
  • Unclear error when using geom_rect with discrete scales [#1287]
  • xlim() breaks default scale_x_datetime() [#1348]
  • scale_x_reverse breaks datetime formatting [#1257]
  • theme(plot_title="blank") doesn't work with gggrid [#1349]
  • theme: error parsing color value pen [#1216]
  • Incorrect appearance of stacked density plot in polar coordinates [#1375]

[4.7.0] - 2025-07-17

Added

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

    • Support for Python time and date objects.
    • Support for timezone-aware datetime objects and Pandas/Polars Series.

    See: example notebook.

  • Geometries:

  • Layer Labels (Annotations):

    • Support in geom_crossbar()

      See: example notebook.

    • Support in waterfall_plot() via relative_labels and absolute_labels parameters.

      See: example notebook.

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

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

    See: example notebook.

  • Plot Layout:

    • New axis_text_spacing, axis_text_spacing_x, and axis_text_spacing_y parameters in theme() to control spacing between axis ticks and labels.
    • See new plot layout diagram notebook showing various layout options and their effects on plot appearance.
  • More variants to specify a color by name:

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

    See the complete list of named colors.

  • size_unit parameter in geom_point(), geom_text/label() and geom_pie() 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

  • Native support for PNG and PDF exports [#1268]:

    Exporting to PNG and PDF formats now uses the ImageMagick library bundled with Lets-Plot Python wheels and available out-of-the-box.
    This replaces the previous dependency on the CairoSVG library and comes with improved support for LaTeX labels rasterization.
    Related changes:

    • ggsave: the w and h parameters override plot size, allowing to specify the output image size independently of the plot size.
    • ggsave: the dpi default value changed to 300.
    • ggsave: the unit default value changed to in (inches).
  • 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 as_discrete() function to annotate continuous data as discrete.

  • [BREAKING] Dropped support for Python 3.8 as it is in the "end-of-life" of its release cycle.
  • [BREAKING] geom_boxplot(): when y-oriented, it now uses aesthetics xlower/xmiddle/xupper instead of lower/middle/upper [#1319].
  • [BREAKING] waterfall_plot(): special flow_type value for label=element_text(color=...) replaced with inherit. See label in the documentation.
  • [DEPRECATED] The position_dodgev() function and the 'dodgev' value for the position parameter are deprecated and will be removed in future releases.
  • Plot layout: reduced margins and spacing for title, caption, axes, and legend.
  • Updated RGB values for lightgray and green. To restore the previous colors, use gray75 and lime, respectively.
  • waterfall_plot(): the appearance of the legend has been improved.
  • geom_violin(): tooltips are not shown in the centerline of the violin if show_half != 0.
  • geom_crossbar(): the midline is not shown in the legend when fatten is set to 0, or when there is no mapping for it.
  • geom_pointrange(): the midpoint will not be drawn if the y aesthetic is set to None.
  • geom_band(): the alpha aesthetic only affects the inner part of the geometry, as in geom_rect().
  • geom_band(): show tooltip over the whole band, not just at the edges.

Fixed

  • AWT: plot prevents wheel events from bubbling up to the parent component.
  • Added tooltip for geom_hline and geom_vline on geom_livemap [#1056].
  • geom_boxplot: unable to draw a y-oriented plot with stat='identity' [#1319].
  • Can't add 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 geom_boxplot [#1342].
  • geom_rect: fixed data conversion for geom_livemap [#1347].
  • ggsave: incorrect output when exporting markdown demo to PNG [#1362].
  • as_discrete() does not work with aes addition [#1363].
  • Sec: CVE-2024-47554 (commons-io) [#1231]

[4.6.2] - 2025-03-28

Fixed

  • macOS: incorrect system libraries linkage that may lead to Lets-Plot import failure:
    libc++abi: Terminating due to typed operator new being invoked before its static initializer in libcxx has been executed.

  • geom_livemap(): map zoom freezes after multiple rapid clicks on +/- buttons [#1315].

  • Misleading warnings when using CARTO 'base-midnight', 'base-antique' and 'base-flatblue' tilesets in livemap.

[4.6.1] - 2025-03-07

Changed

  • [BREAKING] the height and height_unit parameters have been deprecated for the geom_errorbar.

  • the minimum distance between axis labels was reduced to avoid unsuitable layouts.

Fixed

  • geom_errorbar(): the plot domain is always stretched to zero, regardless of the data.

  • overlapped axis labels when using hjust/vjust or multiline text.

[4.6.0] - 2025-03-03

Added

  • Grouping plots:

  • Geometries:

  • Texts and labels:

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

    • unit parameter in position_nudge().

    • nudge_unit parameter in geom_text() and geom_label()

      See example notebook.

  • Theme:

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

      See: example notebook.

  • Parameter spacer in image_matrix() function.

  • transparent/blank/'' color [#1281].

Changed

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

Fixed

  • Incorrectly rendered Area chart [#1295].
  • Tooltip should not cover and hide the geometry that it provides info for [#1275].
  • General purpose scale_continuous: can't use the expand parameter [#1285].
  • Error when using stat='summary' if the data contains NaN values [#1301].
  • Broken plot_background in gggrid [#1124].
  • plot_background not inheriting from rect [#1278]
  • gggrid: allow title and other labels for the entire figure [#715].
  • ggbunch: overall title [#321].
  • Expand discrete axis according to tile size with geom_tile [#1284].
  • geom_bin2d implodes when the disparity in axes units is large [#1303].
  • Livemap: parameters nudge_x and nudge_y have no effect on geom_text or geom_label [#1048].
  • Livemap: Add zooming-in for geom_text()/geom_label() [#1059].

[4.5.2] - 2024-12-13

Changed

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

Fixed

  • Bad precision in the default tooltip format when using coord limits [#1134].
  • Display integer values without fractional part in tooltips [#1186].
  • Suboptimal tooltip positioning in facets [#1187].
  • Incorrect Y-axis layout with facets and panel_inset [#1194].
  • Grouped plot hits the limit of 1000 and doesn't render with not-friendly exception [#1224].
  • Kandy toPNG reports NullPointerException [#1228]
  • lets_plot_kotlin_bridge is unable to locate libc++.1.dylib, I am using Mac m2 [#1234].
  • 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.5.1] - 2024-10-25

Changed

  • Interact refinement:
    • Dragging the plot or Livemap disables the pinned tooltip mode.
    • Double-clicking the plot or Livemap disables the pinned tooltip mode.
    • Ctrl + double-clicking the Livemap zooms in without the blinking fade-in effect.

Fixed

  • Buttons alignment in the toolbar.
  • Wheel zooming-out a plot with log positional scales crashes fast.

[4.5.0] - 2024-10-23

Added

  • Python 3.13 support

  • ggtb(): enable zoom/pan interactivity on plot [#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 exponent_format parameter in theme() [#1071].

      See example notebook.

    [WARNING] Subscripts and superscripts are not supported in PDF and PNG exports.

  • In theme():

    • legend_margin, legend_spacing, legend_spacing_x, legend_spacing_y, legend_box, legend_box_just, legend_box_spacing parameters [#1180].

      See example notebook.

    • legend_key, legend_key_size, legend_key_width, legend_key_height, legend_key_spacing, legend_key_spacing_x, legend_key_spacing_y parameters [#1181].

      See example notebook.

    • strip_background_x, strip_background_y, strip_text_x, strip_text_y parameters [#1195].

      See example notebook.

  • Custom linetype patterns [#1198]:

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

    See example notebook.

  • Geometries:

  • expand_limits() [#820].

    See example notebook.

  • Support for 3-character hex color codes

Changed

  • Parameters labwidth in facet_wrap(), x_labwidth, y_labwidth in facet_grid(): the maximum label length is applied after splitting at \n separators, if present.

  • Use theme_light() as the default theme in qq_plot().

  • [BREAKING] For API deprecated in v4.0 the deprecation level raised to "Error" (only relevant for Kotlin clients).

  • [BREAKING] The 'base-midnight', 'base-antique' and 'base-flatblue' tilesets are deprecated (no longer served by CARTO) and will be removed in future releases.

Fixed

  • Better Marimo Support (via PR-2084) [#1018].
  • Support layering aes() multiple times [#822].
  • waterfall_plot: faceting doesn't work without a measure mapping [#1152].
  • waterfall_plot: tooltips don't work with column names from original dataset [#1153].
  • Legend icon background is not transparent when legend_background is set to "blank" in theme [#1167].
  • Unable to display or save graph when using geom_path [#1168].
  • Legend icon background should inherit the fill color of the plot panel (i.e. grey when theme_grey is used).
  • Vertex sampling uses different tolerances for objects within the same plot [#1174].
  • sampling_vertex_vw doesn't work as expected [#1175].
  • sampling_vertex_dp may break rings [#1176].
  • ggmarginal: bottom boxplot is broken [#1189].
  • Offscreen cells are sometimes not rendered in JupyterLab.
  • The legend_justification parameter doesn't work if the legend_position='top' [#1031].
  • coord_polar: geom_point tooltips should take in account point size [#1214].

[4.4.1] - 2024-08-21

Added

Fixed

  • "cmapmpl" color scale doesn't show the entire range of colors in continuous cmap. [#1149].
  • geom_histogram: wrong plot area when y='..density..' [#1157].

[4.4.0] - 2024-08-02

Added

Changed

  • [breaking change] guide_legend()/guide_colorbar() require keyword arguments for 'nrow'/'barwidth' and other parameters except 'title'.
  • The triangular point shape is now anchored to the data point via the centroid
  • as_discrete() is added to lets-plot wildcard import (i.e. when using from lets-plot import *)

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].
  • geom_density2d: 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.

[4.3.3] - 2024-05-29

Added

Changed

  • [BREAKING] Dropped support for Python 3.7 as it is in the "end-of-life" of its release cycle.

Fixed

  • Livemap: improve "tiles" documentation [#1093].
  • Undesired vertical scroller when displaying gggrid in Jupyter notebook.
  • GeoJson structure breaks if the ring start label occurs several times [#1086].
  • theme: left margin doesn't work for the plot_title parameter [#1101].
  • Improve border line type experience [LPK-220].

[4.3.2] - 2024-04-25

Changed

  • to_svg(), to_html(): return the content as string if no "path" is given [#1067].

Fixed

  • LP occasionally crashes when drawing polygons [#1084].
  • Regression of issue [#966].
  • Livemap: labels on the map look blurry [#1045].
  • Linetype doesn't work for geom_tile() [LPK-241].

[4.3.1] - 2024-04-16

Added

Fixed

  • ggmarginal(): broken coloring [#760].
  • Incorrect 'plot_background' area (with empty space capture) [#918].
  • geom_density2df: uneven borders [#941].
  • DateTime is not recognised in polars.DataFrame [#961].
  • Support geom_spoke() in geom_livemap() [#988].
  • NASA BlueMarble tiles have become blank [#1000].
  • 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].
  • livemap: when release the mouse button from outside the map, it gets stuck in panning mode [#1044].
  • Improve documentation for parameter position [#1047].
  • Error when build geom_smooth() with se=False [#1050].
  • Livemap: vjust implemented incorrectly [#1051].
  • 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].
  • geom_density2d: the doc missing some 'computed' variables [#1062].
  • Weird and problematic behavior : lets-plot does not respect x and y. Sizing problem ?[#1068].
  • Plot layout breaks when marginal layers are used #1074 [#1074].
  • Discrete scale doesn't work for datetime data [LPK-231].
  • Add linetype parameter in elementLine() and elementRect() [LPK-235].
  • Any way to line-wrap facet labels? [LPK-237].
  • Missing marginal gridlines.
  • Cryptic error message on geom_boxplot with orientation="y" [#600].
  • set_theme() should accept "feature list" [#657].

[4.3.0] - 2024-03-07

Added

  • coord_polar()

    The polar coordinate system is most commonly used for pie charts, but
    it can also be used for constructing Spider or Radar charts using the flat option [#452].

    See: example notebook.

  • In the theme() function:

    • panel_inset parameter - primarily used for plots with polar coordinates.

      See: example notebook.

    • panel_border_ontop parameter - enables the drawing of panel border on top of the plot geoms.

    • panel_grid_ontop, panel_grid_ontop_x, panel_grid_ontop_y parameters - enable the drawing of grid lines on top of the plot geoms.

  • geom_curve()

    See: example notebook.

  • [UNIQUE] Visualizing graph-like data with geom_segment() and geom_curve().

    • Aesthetics size_start, size_end, stroke_start and stroke_end 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:

  • alpha_stroke parameter in geom_label() to enable the applying of alpha to color [#1029].

    See: example notebook.

  • Showing plots in external browser

    The setup_show_ext() directive allows plots to be displayed in an external browser window.

Changed

  • [BREAKING] Function geom_image() is removed. Please use geom_imshow() instead.
  • Parameter axis_ontop in theme() is now True by default.

Fixed

  • coord_map() should distort tiles size to account for different unit size at different latitudes [#331].
  • geom_errorbar(): wrong positioning of tooltips [#992].
  • geom_path(): 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 None for coord limit [#486].
  • Scale limits don't work for bars/area [LPK-219], [#978].
  • No gridlines when axis_ontop=True [#1012].
  • bar-plot: do not draw bar border adjacent to the axis [#845].
  • Displaying tooltips on a multilayer plot [#1030].
  • Make segment geometry better suited for graphs visualization [#572].

[4.2.0] - 2023-12-28

Added

  • Support for Categoricals:

    • Support for pandas.Categorical data type [#914].
    • The levels parameter in as_discrete() function [#931].

    See: example notebook.

  • Support for superscript for numbers in scientific notation [#743].

    Warning!

    Do NOT(!) use exponent_format='pow' if you are planning to export plot to a raster format (PNG,PDF).

    The CairoSVG library (which is under the hood of our ggsave() function) does not handle tspan element properly and breaks superscript notation when transforming SVG to PNG/PDF.

    More details: Kozea/CairoSVG#317

    See: example notebook.

  • Support exporting plot to a file-like object.
    Convenience methods: to_svg(), to_html(), to_png(), to_pdf() [#885], [#590].

    See: example notebook.

  • Sharing of X,Y-scale limits between subplots in gggrid() [#718].

    See: example notebook.

  • geom_spoke() [#738].

    See: example notebook.

  • scale_x_log2(), scale_y_log2() [#922].

  • High-contrast tileset "BW" for geom_livemap().

    See: example notebook.

  • New variables computed by 'count' and 'count2d' statistics: '..sumprop..', '..sumpct..' [#936].

    See: example notebook.

  • Support using dictionaries for breaks/labels/values customization in scale_xxx() functions [#169], [#882].

    See: example notebook.

  • The lablim parameter in scale_xxx() functions [#939, #946].

    See: example notebook.

  • label_text parameter in theme() for annotation text settings [#930].

    See: example notebook.

  • NumberFormat: new flag ~ to trim trailing zeros.

Changed

  • [BREAKING] Function margin() is deprecated and will be removed in future releases.
    Please replace all existing usages, i.e. theme(plot_margin=margin(..)) and element_text(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.

  • Upgraded Apache Batik to version 1.17 [#887]

Fixed

  • Jitter reproducibility in geom_jitter, position_jitter, position_jitterdodge [#911].
  • Facets: order = 0 doesn't work as expected [#923].
  • geom_livemap: fix missing styles (e.g. road outline on high zooms) [#926].
  • geom_livemap: freeze at zoom 10 [#892].
  • 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].
  • scale_continuous() fails with non-color aesthetics [#953].
  • 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].

[4.1.0] - 2023-11-03

Added

Changed

  • [BREAKING] stat_summary() and stat_summary_bin no longer supports computing of additional variables specified in mappings.

Fixed

  • Husl palette equivalent [#876].
  • Tooltips are trimmed and not visible on a very narrow chart [#837].
  • geom_crossbar: an error occurs if the mapped values of aesthetics are not populated [#886].
  • 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 in theme() [#856].
  • Subplot themes not inherited by parent [LPK-#197].
  • Saving plots in PDF format using ggsave() [#710].
  • element_blank() has no effect on plot title/subtitle/caption in theme() [#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.0.1] - 2023-09-13

Added

Changed

  • If layer transparency is set via the alpha-channel in the colors RGBA specification and via the alpha aesthetic,
    then the alpha aesthetic overrides the alpha-channel in the color. Previousely it was the opposite.

  • geom_pie() defaults:

    • "stroke" is visible and stroke_side='both' (was stroke_side='outer').
    • the "hole" is not created automatically when stroke_side = 'both'/'inner' (was created automatically).
  • geom_bar() now has solid outline color by default (was transparent).

  • geom_tile(), geom_bin2d() now have solid outline color by default (was transparent).

    • however, by default the size is 0 (i.e. tiles outline initially is not visible).

Fixed

  • geom_tile(), geom_bin2d() : the alpha aesthetic is applied to the tiles outline.
  • scale_x_datetime(): error building plot for early dates [#346].
  • geom_livemap(): theme/flavor plot background is not shown [#857].
  • geom_livemap(): in AWT dragging a map in a facet moves maps in all facets.
  • geom_livemap(): support rectangle 'linetype' [#307].
  • theme_void() + flavor_xxx(): no expected plot background [#858].
  • Inconsistent color in legend when using paint_a/paint_b/paint_c [#867].

[4.0.0] - 2023-08-17

Added

Changed

  • 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] geom_pie() no longer supports parameter stroke_color.

  • [BREAKING] geom_boxplot() no longer support parameter sampling.

  • [BREAKING] geom_pointrange(): size aesthetic shouldn't affect line width [#751]:

    linewidth aesthetic is used for line width, size - for mid-point size only.

  • geom_boxplot(): size and stroke parameters now affect outlier shapes.

  • [BREAKING, only affects users of Lets-Plot Kotlin API]
    The entire project has undergone package refactoring.
    As a result of package names changed, Lets-Plot v4.0.0 is partially incompatible
    with Lets-Plot Kotlin API versions 4.4.1 and earlier.

Fixed

  • ggsave() doesn't save geom_raster() layer to a file [#778].
  • ggsave(): saving geomImshow() to SVG produces fuzzy picture [LPK-188].
  • ggsave(): saving geomImshow() to raster format produces fuzzy picture.
  • geom_crossbar() aesthetics take middle argument instead of y [#804].
  • geom_boxplot() doesn't apply alpha to outliers [#754].
  • geom_boxplot() outliers do not show tooltips.
  • geom_step() no tooltips.
  • geom_step(): toggle the behavior of the direction parameter when the orientation is changed.
  • geom_livemap(): memory leak when re-run cells without reloading a page.
  • geom_ribbon(): not all tooltips are shown on a multi-layer plot [#847].
  • Bug in empty plot: IndexOutOfBoundsException [#194].
  • Weird tooltip/legend in case of extremely long value [#315].
  • panning on interactive map should be more responsive [#336].
  • Offline mode doesn't work with manylinux wheels [#808].

[3.2.0] - 2023-05-09

Added

  • geom_lollipop().

    See: example notebook.

  • Aesthetic stroke [#320] and its scales scale_stroke(), scale_stroke_identity().

    See: example notebook.

  • Aesthetic linewidth (for geom_lollipop()) and its scales scale_linewidth(), scale_linewidth_identity().

    See: example notebook.

  • The 'newline' character (\n) now works as line break in legend text ([#726])

    See: example notebook.

  • Horizontal error bars and vertical "dodge" ([#735]).

    See: example notebook.

  • Colorbar in geom_imshow(). Parameters show_legend and color_by [#717].

Changed

  • [BREAKING] geom_dotplot() and geom_ydotplot() no longer support parameter stat.

  • Position adjustment settings:

    • width, height parameters of geom_jitter() have priority over the width, height parameters of position_jitter() function;
    • nudge_x, nudge_y parameters of geom_text(), geom_label() have priority over x, y parameters of position_nudge() function.
  • geom_text(), geom_label() use stat='identity' by default.

  • JVM/Batik: improved "paint manager" which now has better performance and fixes issues with artifacts that could appear beyond the plot component.

Fixed

  • 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() and geom_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", where size aesthetic is specified with a number).
  • "Variable not found" error in ggmarginal [#681].
  • facet_grid: Internal error [#699].
  • Export to SVG fails if breaks are given by integers [#763].
  • Remove hard IPython dependency [#749].
  • Tooltips bug [LPK-176].
  • livemap: doesn't work well with gggrid [#750].
  • livemap: memory leak caused by a document event handler.
  • livemap: flickering when zooming with the buttons.
  • livemap: tooltip text doesn't reflect data under the cursor [#709].

[3.1.0] - 2023-03-07

Added

  • gggrid() function.

    See: example notebook.

  • joint_plot()

    See: example notebook.

  • Export to PNG files in ggsave().

    Note: export to PNG file requires the CairoSVG library.

    See: example notebook.

  • Axis position parameter in position scales scale_x_*(), scale_y_*().

    See: example notebook.

  • angle parameter in element_text() in theme().

    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.

  • Drawing quantile lines and filling quantile areas in geom_violin() and geom_density()

    See: example notebook.

  • geodesic parameter for geom_segment() and geom_path().

    See: example notebook.

  • density2d and density2df geometry types in residual_plot().

Changed

  • The MinGW toolchain is no longer required for installing of Lets-Plot on Windows.

  • [BREAKING] geom_violin() no longer supports parameter draw_quantiles. Use new quantile_lines and quantiles parameters as needed.

  • [BREAKING] stack and fill position adjustments now stack objects on top of each other only if these objects belong to different groups. If necessary, use mode="all"" in position_stack() or position_fill() to stack objects regardless of their group.

    See: example notebook.

Fixed

  • Tooltip does not reflect ..quantile.. aesthetic change [#658].
  • color_by parameter of the residual_plot() should group the data points [#662].
  • '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].
  • livemap: hide tooltips when user is zooming-in by double-clicks [#659].
  • livemap: wrong position when path goes through the antimeridian [#682].
  • livemap: wrong position if path is on a circle of latitude [#683].
  • livemap: tooltip may show wrong data on density2df [#684].
  • livemap: geom_text vjust="center" is a bit off [#132].
  • livemap: segment that goes through the antimeridian should be straight [#692].
  • livemap: apply alpha to the pie chart and to its tooltip color marker.
  • Layout: uneven plot margins for the horizontal axis [#705].
  • Sampling: increase the default N for "pick sampling" and for other types of sampling [#687].

[3.0.0] - 2022-12-15

Added

Changed

  • [BREAKING] Dropped support for Python 3.6 as it is in the "end-of-life" of its release cycle.
  • [BREAKING] geom_livemap() itself no longer draws geometries, so the following options are no longer supported: symbol, data, mapping, map, map_join, ontop, stat, position, show_legend, sampling, tooltips. To draw point and pie markers on map, please, use the geom_point() and geom_pie() geometry layers.
  • 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].
  • geom_livemap: wrong position when datapoints geodesic line goes close to the N.P. [#645].

[2.5.1] - 2022-11-03

Added

  • geom_text(), geom_label():

    • the 'newline' character (\n) now works as line break ([#605])
    • lineheight aesthetic ([#324])
    • nudge_x, nudge_y parameters ([#324])
    • special text alignments (vjust and hjust): "inward" and "outward" ([#324])

    See: example notebook.

  • vjust parameter in position_stack() and position_fill() [#323].

    See: example notebook.

  • use_crs parameter in geom_map() and other geoms, working with GeoDataFrame

    See: example notebook.

  • geom_imshow() (former geom_image()):

  • image_matrix():

Changed

  • geom_image() renamed to geom_imshow()

    See updated examples: image 101, Fisher's boat.

  • geom_boxplot(): default value for parameter whisker_width is 0.5.

  • Upgraded Kotlin version to 1.7.20 (was 1.6.21).

Fixed

  • element_blank() has no effect in theme legend_title [#608].
  • geom_livemap(): add support of geom_label parameters [#601].
  • 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].
  • Parameter norm in geom_imshow().
  • Several issues leading to crush in Swing/Batik apps. Related to [discussions]
  • Text labels got trimmed occasionally, when symbols -, /, \ or | present.
  • geom_livemap() doesn't load vector tiles inside iframe with certain security policies.

[2.5.0] - 2022-09-29

Added

  • New theme: theme_bw() [#554].

    See: example notebook.

  • Color schemes (flavors) applicable to existing themes:

    • flavor_darcula()
    • flavor_solarized_light()
    • flavor_solarized_dark()
    • flavor_high_contrast_light()
    • flavor_high_contrast_dark()

    See: example notebook.

  • Viridis color scales: scale_color_viridis(), scale_fill_viridis().

    See: example notebook.

  • New parameters in element_text() [#562]:

  • The 'newline' character (\n) now works as line break in axis title.

    See: example notebook.

  • Parameter whisker_width in geom_boxplot() [#549].

    See: example notebook.

  • New geometry geom_label() [#557].

    See: example notebook.

  • Auto-detection of Databricks and NextJournal environments [#602].

  • Python wheels for manylinux arm64 architecture [#581].

Changed

  • New tooltip style after applying coord_flip() [#580].

    See: example notebook.

  • In Lets-Plot for Java/Swing, Apache Batik upgraded to v.1.15 [#604]

Fixed

  • Density and area geoms: preserve the z-order when grouping [#552].
  • Allow to import all 'bistro' functions just by '*' [#551].
  • Boxplot, violin, crossbar: position dodge width=0.95 should be used by default [#553].
  • Tooltip is shown not for the nearest object [#574].
  • Tooltip is not displayed for the object on the plots border [#575].
  • The plot caption overlaps with the legend [#587].
  • Unclear size unit of width [#589].
  • Specify size units in docstrings [#597].
  • No tooltips for geom_boxplot with zero height [#563].
  • geom_text: wrong label alignment with hjust 0 and 1 [#592].
  • Error when using lets-plot in streamlit [#595].
  • Documentation for the breaks parameter in scales [#507].

[2.4.0] - 2022-06-20

Added

  • Python 3.10 support [#505].

  • Python 3.9: a Python wheel for macOS arm64 architecture (Apple Silicon).

  • LetsPlot.set_theme() - configuring a default plot theme.

    See: example notebook.

  • Quantile-Quantile (Q-Q) plot:

    • geometries:
      • geom_qq()
      • geom_qq_line()
      • geom_qq2()
      • geom_qq2_line()
    • quick Q-Q : the qq_plot() function in the bistro module.

    See: example notebook.

  • Marginal plots: the ggmarginal() function [#200], [#384].

    See: example notebook.

  • Parameter orientation in geoms: bar, boxplot, density, histogram, freqpoly, smooth, violin.

    See: example notebook.

  • New in plot theme:

    • face parameter in element_text().

      See: example notebook.

    • panel_border parameter in theme() [#542].

      See: example notebook.

    • Tooltip theme options, new parameters in theme():

      • tooltip - tooltip rectangle options;
      • tooltip_text, tooltip_title_text - tooltip text options;
      • axis_tooltip_text, axis_tooltip_text_x, axis_tooltip_text_y - axis tooltip text options.

      See: example notebook.

  • scale_color_gradientn() and scale_fill_gradientn() functions [#504].

    See: example notebook.

Changed

  • geom_livemap [breaking change] : symbol="point" now should be specified explicitly to enable the "livemap" layer to handle provided "point" aesthetics directly. This change doesn't affect "points" layers added via the geom_point() geometry layer.
  • New style of tooltip color marker (two sidebars with a stroke color) and symbols in legend (rectangle with a stroke instead of a slash-line).
  • New type of general tooltip for geom_boxplot: displayed under the cursor.
  • Default sampling type for geom_violin switched from systematic to pick.

Fixed

  • geom_livemap: support of the arrow parameter in geom_segment [#131].
  • Differences in tooltip color marker for plots with and without livemap.
  • Labels out of plot when axis_text_y='blank' [#525].
  • NPE in corr_plot with null coefficients.
  • Outliers are not shown when boxplot' alpha=0.
  • Support for polars.DataFrame [#526].
  • JFX rendering issue that causes tooltips to stuck [#539].
  • Support trim parameter in density and ydensity stats [#62].
  • Unexpected point geometries on geom_livemap() [#547].
  • geom_violin: add missing parameters kernel, bw, adjust, n, fs_max to signature and docstring.

[2.3.0] - 2022-03-21

Added

  • Plot subtitle and caption [#417]: subtitle parameter in ggtitle() and labs(), caption parameter in labs(), plot_subtitle and plot_caption parameters in theme().

    See: example notebook.

  • The 'newline' character (\n) now works as line break in plot title, subtitle, caption and in legend title.

    See: example notebook.

  • New in tooltip customization API:

    • The title() option defines a tooltip "title" text which will always appear above the rest of the tooltip content.
    • The 'newline' character (\n) now works as line break in tooltips.
    • Automatic word wrap: occurs when the length of a text value in tooltip exceeds the 30 characters limit.

    See: example notebook.

  • Parameter scales in facet_grid()/facet_wrap() [#451, #479].

    See: example notebook.

  • New in geom_livemap():

    • The Reset button: returns the map widget to its initial zoom/location state.
    • Parameters data_size_zoomin, const_size_zoomin: allow configuring how zooming-in of the map widget increases size of geometry objects (circles, lines etc.) on map.
    • Parameter ontop that controls z-index of the geom_livemap layer.
    • Parameter show_coord_pick_tools to show "copy location" and "draw geometry" buttons.
  • New geometries:

    • geom_violin()

    See: example notebook.

    • geom_dotplot()

    See: example notebook.

    • geom_ydotplot()

    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

  • LiveMap, Swing-batik: legend is not visible when overlapping map [#496].
  • CVE-2021-23792 in org.jetbrains.lets-plot:lets-plot-image-export@2.2.1 [#497].
  • Color in tooltip does not correspond to the color of marker on map [#227].
  • tooltip on livemap: hide tooltip when the cursor is over the controls [#335].
  • Automatic detection of DateTime series [#99].
  • 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.
  • scaleColorManual Divide by Zero with 1 mapping [#506].
  • LinearBreaksHelper$Companion.computeNiceBreaks out of memory error [#105].

[2.2.1] - 2021-12-10

Added

  • scale_x_time() and scale_y_time() [#468].

    See: example notebook.

  • plot_background, legend_background parameters in theme() [#485].

  • axis_ontop, axis_ontop_x, axis_ontop_y parameters in theme()

Fixed

  • 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].

[2.2.0] - 2021-10-29

Added

  • coord_flip().

    See: example notebook.

  • Date-time formatting support:

    • tooltip format() should understand date-time format pattern [#387];
    • scale_x_datetime should apply date-time formatting to the breaks [#392].

    See: example notebook.

  • Pre-configured themes:

    • Standard ggplot2 themes: theme_grey(), theme_light(), theme_classic(), theme_minimal();
    • Other themes: theme_minimal2() - the default theme, theme_none().
  • Theme modification: more parameters were added to the theme() function.

    See: example notebook.

Note: fonts size, family and face still can not be configured.

  • corr_plot() function now also accepts pre-computed correlation coefficients. I.e. the following two expressions are equivalent:
    corr_plot(iris_df).points().labels().build()
    corr_plot(iris_df.corr()).points().labels().build()  # new

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: stat_corr() and "correlation stat" will be removed in one of the future releases. Please use the corr_plot() plot builder object instead.

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.
  • map_join doesn't work when join variables with same names without mappings [#428].
  • Zoom without clipping breaks tooltips [#373].
  • Unreadable breaks on axis [#430].
  • Map rendering is broken when browser uses scaling [#450].
  • corr_plot() error for data with zero variation [#329].
  • Misleading error message [#271].

[2.1.0] - 2021-08-16

Added

  • Ordering categories. New parameters in the as_discrete function:

    • order_by (string) - the name of the variable by which the ordering will be performed;
    • order (int) - the ordering direction - 1 for ascending direction and -1 for descending (default value).

    See: as_discrete.

  • Basemap tiles configuring:

    • Subdomains parameter {s} for XYZ raster tiles.
    • Solid color tiles: maptiles_solid().
    • Builtin configurations for some 3rd party maptile services. The lets_plot.tilesets module.

    See: Configuring basemap tiles.

Changed

  • Upgraded Apach Batik version to 1.14 (was 1.12) [#398].
  • Upgraded Kotlin version to 1.5.21 (was 1.4.21)
  • Upgraded Gradle version to 7.1.1 (was 6.8.3)

Fixed

  • geom_livemap: properly handle max_zoom pamareter in maptiles_zxy().
  • Strange looking legend for tiles [#245].
  • Need to skip "bad" values during scale transformation [#301].
  • NPE on negative value in data and scale_xxx(trans='log10') [#292].
  • Legend is broken when using scale_fill_brewer with 'trans' parameter [#284].
  • Scale breaks should be distributed evenly on 'sqrt' scale. [#407].
  • Wrong tooltip formatting when used with log10 scales [#406].
  • Bad axis labels when using both plot and layer data [#327].
  • Plot layout looks wrong [#403].
  • map_join is not working correctly when map=geocoder [#380]
  • Tooltip default formatting should not change after adding other variables to tooltip [#388].
  • Tooltip on axis: increase the font size. [#399].
  • Tooltip format for variable is not working [#401].
  • Wrong direction in colorbars (legend) [#204].
  • geom_jitter: show axis tooltips (same as geom_point) [#412].
  • Outlier tooltips: the spout sometime is too long (boxplot) [#358].
  • Faceted plot is broken by geom with "constant" aesthetics [#391].
  • Interactive maps in AWT (PyCharm plugin):
    • Memory leaks in PyCharm caused by dispose() method in PlotPanel.
    • While showing map in PyCharm CPU is busy all the time, even when nothing is changing on screen.
    • Click events detection.

[2.0.4] - 2021-06-09

Changed

  • 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.

Fixed

  • Multilayer plots are corrupted [#385].

[2.0.3] - 2021-06-02

Added

  • In tooltip customization API:
    • layer_tooltips(variables) - the new parameter variables defines a list of variable names, which values will be placed line by line in the general tooltip. See: Tooltip Customization.

Changed

  • CDN: Lets-Plot JavaScript library is now served via JSDELIVR (was CDNJS):

https://cdn.jsdelivr.net/gh/JetBrains/lets-plot@v2.0.3/js-package/distr/lets-plot.min.js

Fixed

  • Removed the last dependency on bintray JCenter (commit).
  • 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]
  • map: calif.housing [#140]
  • Can't build plot: "Uncaught SyntaxError: Unexpected string" in a console [#371]
  • All scales should have the 'format' parameter [#347].
  • Poor font rendering in Swing/Batik. Related to: [#364]
  • Exclude slf4j implementation from lets-plot-common [#374]

[2.0.2] - 2021-04-13

Changed

[2.0.1] - 2021-03-17

Added

  • The alpha parameter for lines [#139].
  • Tooltips for geom_segment() [#296].
  • The guides() function [#52].
  • New Java Swing plot components to enable embedding Lets-Plot charts into JVM applications.
    • See: vis-swing-common, vis-swing-batik, vis-swing-jfx modules.

Fixed

  • Fix auto-detection of PyCharm env to enable plotting in SciView while using remote interpreter [348]
  • Fix tooltips appearing outside the specified x/y limits.
  • Clippath in accordance to the given limits [#189].
  • Treat a data as DataFrame if both data and map are GeoDataFrames [#343].
  • Removed the restriction on tooltips for small polygons [#298].
  • The x/y axis labels are derived from x/y aesthetics only [#333].
  • Merge 'theme' settings [#147].
  • Add axis tooltips for geom_bin2d.
  • Outlier tooltips for geom_ribbon().
  • Fix tooltip crosshair [#309].

[2.0.0] - 2021-02-09

Added

  • Python 3.9 support on all platforms.

  • facet_wrap() function [#238]

  • In facets:

    • Ascending/descending ordering of faceting values.
    • Formatting of faceting values.

    See: Facets demo

  • In tooltip customization API:

    • option color overrides the default tooltip color:
      geom_xxx(tooltips=layer_tooltips().color('red'))

    See: Tooltip Customization.

  • Crosshair cursor when tooltip is in fixed position specified by the anchor option.

  • Scale format parameter: formatting tick labels on X/Y axis. Supported types are number and date/time.

    Example:

    scale_x_datetime(format="%b %Y")
    scale_x_continuous(format='is {.2f}')

    Demo: Formatting demo

    See also: Formatting

Changed

  • [breaking change] New Geocoding API!

    Since Lets-Plot v2.0.0 the peviouse Geocoding API is no longer working (hence we bumped the version to 2.0.0).

    The old version of the Geocoding backend remains on-line for a couple of release cycles to continue support of prior versions of Lets-Plot.

    To learn more about Geocoding API see: Geocoding.

  • The project upgraded to Kotlin v1.4.21 (was v1.4.10).

Fixed

  • Kernel density estimate computation is too slow.
  • Serialize NaN and other special values as None (CRITICAL for the "Lets-Plot in SciView" PyCharm plugin) [#282].
  • Error in plot building: 'trans' parameter not compatible with None values in data [#287].
  • LOESS smoothing fails on small (<3) number points.
  • Facet grid truncated in jupyter [#28].
  • The reverse parameter on discrete scale with 'limits' [#303].
  • Geocoder's allow_ambiguous() doesn't prevent "ValueError: Multiple objects.." [#174].
  • Fix tooltip for overlapping objects [#230].
  • Fix duplicate values in tooltip [#280].
  • geom_histogram should not try to handle geometries in GeoDataFrame [#281].
  • Error building plot: Layer 'MAP' is not supported on Live Map. [#285].
  • Align title to the left of the plot geom area [#289].
  • Tooltip on geom_ribbon().

[1.5.6] - 2020-12-23

Fixed

  • “Symbol not found: _NSGenericException” error on macOS [#276].

[1.5.5] - 2020-12-18

Added

  • Correlation plot.

    See: Charts.

  • 'No Javascript' mode.

    Support for notebook renderers that don't execute Javascript.

    See: 'No Javascript' mode

  • In tooltip customization API:

    • options: center and middle (anchor).
    • option 'minWidth'.

    See: Tooltip Customization.

  • 'na_text' parameter in 'geom_text'

Changed

  • Tooltip customization API:

    • The anchor option moved from theme to layer:
      geom_xxx(tooltips=layer_tooltips().anchor(anchor_value))
      where anchor_value: ['top_right'|'top_center'|'top_left'|'bottom_right'|'bottom_center'|'bottom_left'|'middle_right'|'middle_center'|'middle_left'].

    See: Tooltip Customization.

Fixed

  • Tooltip should appear when the mapped data is continuous [#241]
  • Tooltip 'null' displayed for undefined vals [#243]
  • Y-tooltip should be aligned with a tile center [#246]
  • With facet_grid tooltip shows data from last plot on all plots [#247]

[1.5.4] - 2020-11-19

Changed

  • [breaking change] In functions format(field, format) and line(template) in tooltip builder, the '$' symbol is no longer used in aesthetic reference. It was replaced by the '^' (hat) symbol (see the udated doc: Tooltip Customization).
  • The project upgraded to Kotlin v1.4.10 (was v1.3.72).

Fixed

  • No tooltip on v-line [#229]

[1.5.3] - 2020-11-05

Added

  • Facilities for customization of tooltip contents and its position (see Tooltip Customization).
  • attribution and other new parameters in the maptiles_zxy() function.
  • label_format parameter in the geom_text() function.
  • scale_x_discrete_reversed() / scale_y_discrete_reversed()
  • ggsave() function (only SVG, HTML)

Fixed

  • Mercator's projection computes coordinates incorrectly (geom_map(), coord_map())
  • Handling of xlim,ylim in coord_fixed(), coord_map()
  • Colorbars: take in account limits defined in continuous color/fill scales.
  • scale_color_hue incorrectly interprets chroma range [#206].
  • scale_color_brewer shouldn't fail if 'type' is not specified [#203].
  • scale_fill_discrete should not replace the default discrete scale (Brewer) with 'HUE' scale [#172].

Changed

  • Lets-plot vector map-tiles are configured by default.
  • PACIFIC_BLUE color (#118ED8) replaced DARK_BLUE as a default color/fill value on plots.
  • Default discrete color scheme is now ColorBrewer's Set2 (was Dark2)

Deprecated

  • Function gg_image_matrix(). The new function is: image_matrix() in the lets_plot.bistro.im module. The new function is not any longer displaying matrix by itself but returns a GGBunch object instead. Unlike the depricated gg_image_matrix() function, it is not imported by from lets_plot import * statement.

    Usage:

    from lets_plot.bistro.im import image_matrix
    image_matrix()
    

[1.5.2] - 2020-08-10

Fixed

  • map_titanic.ipynb : UnboundLocalError: local variable 'map_join' referenced before assignment [#182]
  • Add the map_join parameter to all geoms which support map parameter (py) [#183]

[1.5.1] - 2020-08-06

Added

  • scale_x_reverse() / scale_y_reverse()
  • Mnemonics for the resolution parameter in the regions.boundaries() function.

Fixed

  • Exception when using coord_map with xlim [#173]
  • Clipped tooltip [#155]
  • Text on axis is clipped after hiding the tick-marks in theme [#160]
  • Tooltip on x axis with no title shouldn't be above the axis line [#161]
  • NPE while creating scale mapper when data series contains only nulls.
  • Default Geocoding server url.

[1.5.0] - 2020-07-15

Added

  • geocoding package

Fixed

  • NPE on geom_tile when data contains null-s.
  • The order of values in the limits parameter on discrete scales is ignored.
  • Livemap is not shown in GGBunch.

[1.4.2] - 2020-05-28

Added

  • Plugin for IntelliJ IDEA / PyCharm is available. For more info see the plugin homepage: Lets-Plot in SciView.

Changed

  • Plots build time reduced (up to 4X)

[1.4.1] - 2020-05-20

Added

  • geom_smooth: automatic sampling when n>1000 and the method is LOESS.

Fixed

  • 'map_join' fails when the map argument is a dictionary [#130]

Changed

  • HTML output was modified allow better integration with PyCharm.

Removed

  • The deprecated method 'load_lets_plot_js()'.

[1.4.0] - 2020-05-13

Added

  • Support for interactive maps.
  • The as_discrete() function.
  • Polynomial regression of an arbitrary degree (thelm smoothing method) in geom_smooth.
  • axis_tooltip, axis_tooltip_x, axis_tooltip_y parameters in theme()
  • Kaggle and Datalore notebook demos.

Fixed

  • Severe performance degradation when using discrete scales [#119].
  • Opaque background to better support PyCharm dark theme [#121].
  • Auto-detection of a Kaggle environment.
  • Limits on the maximum plot size [#115].
  • Installation instructions for Windows users [#118 MinGW].

Changed

  • More slick shape for tooltips on the axis.

[1.3.0] - 2020-03-26

Added

  • Python 3.6 support.
  • Windows platform support.
  • SVG/HTML export to file.
  • Offline mode for Jupyter notebooks.
  • Support for cloud-based notebooks like Google Colab and Datalore.
  • JVM Maven artefacts released.

Fixed

  • Tooltip on geom_rect and geom_vline.
  • Error when date-time series contains NaT value.

Changed

  • Optional load_lets_plot_js() function is now deprecated.
  • Initialisation call LetsPlot.setup_html() is now mandatory in Jupyter.

[1.2.1] - 2020-02-13

Fixed

  • tooltip not showing in geom_polygon

[1.2.0] - 2020-02-12

Added

  • geopandas support in geoms: point, path, polygon, rect, text.
  • support for LOESS smoothing method in geom_smooth.
  • new geometry layers: geom_crossbar, geom_linerange, geom_pointrange, geom_bin2d.
  • support for coordinate stystem xlim, ylim parameters (i.e. "clipping").

Fixed

  • Was not working weight parameter in stats: bin, count, bin2d, density, density2d
  • incorrect tooltip line 'NaN' in geom_boxplot.
  • ambiguous tooltip positioning in geoms: tile, bin2d.
  • cropped text in tooltip.

[1.1.0] - 2019-12-17

Added

  • GGBunch. Combines several different plots into one graphical object.
  • geom_image(). Displays an image specified by ndarray with shape (n,m) or (n,m,3) or (n,m,4).
  • gg_image_matrix(). A utility helping to combine several images into one graphical object.
  • user_guide.ipynb
  • ggbunch.ipynb
  • scatter_matrix.ipynb
  • image_101.ipynb
  • image_fisher_boat.ipynb
  • image_matrix.ipynb

Changed

  • Switched to Kotlin 1.3.61

Fixed

  • scale_datetime(). Date-time formatting in tooltips.
  • Links in README_PYTHON.md

[1.0.0] - 2019-11-27

Changed

  • First public release.