Skip to content

JetBrains/lets-plot-kotlin

Repository files navigation

Lets-Plot Kotlin API

A Grammar of Graphics for Kotlin.

official JetBrains project License MIT Latest Release

Lets-Plot Kotlin API is a Kotlin API for Lets-Plot Multiplatform plotting library,
which is built on the principles of layered graphics first described in the
Leland Wilkinson work The Grammar of Graphics.

book cover

Lets-Plot Kotlin API is largely based on the API
provided by ggplot2 package well-known to data scientists who use R.

To learn more about the Grammar of Graphics,
we recommend an excellent book called
“ggplot2: Elegant Graphics for Data Analysis”.

This will be a good prerequisite for further exploration of the Lets-Plot library.

Quickstart

Inside Kotlin Notebook, Datalore or Jupyter with Kotlin Kernel:

%use lets-plot 
val rand = java.util.Random() val data = mapOf( "rating" to List(200) { rand.nextGaussian() } + List(200) { rand.nextGaussian() * 1.5 + 1.5 }, "cond" to List(200) { "A" } + List(200) { "B" } ) var p = letsPlot(data) p += geomDensity(color = "dark_green", alpha = .3) { x = "rating"; fill = "cond" } p + ggsize(700, 350)

Couldn't load quickstart_notebook.png


See the "Quickstart" notebook in Datalore or Jupyter nbviewer.

Table of Contents

Usage

Notebooks

With the help of Lets-Plot Kotlin API you can easily create plots in Kotlin Notebook, Datalore, Jupyter with Kotlin Kernel
or any other notebook that supports Kotlin Kernel.

"Line Magics"

%use lets-plot 

This "line magic" will apply Lets-Plot library descriptor which adds to your notebook all the boilerplate code necessary to create plots.

By default, library descriptor is bundled with the Kotlin Jupyter Kernel installed in your environment.
However, you can override the default settings using:

%useLatestDescriptors 

In this case the latest library descriptor will be pulled from the Kotlin Jupyter Libraries repository.

Library Descriptor Parameters

%use lets-plot(v=4.13.0, isolatedFrame=false, output="js, ktnb, svg") 
  • v - version of the Lets-Plot Kotlin API.

  • isolatedFrame - If false: load JS just once per notebook (default in Jupyter).
    If true: include Lets-Plot JS in each output (default in Datalore notebooks).

  • output - comma-separated list of output types to store in notebook cells (default: "js, ktnb, svg"). \
    Available types:

    • js - Classic Web output: HTML+JS
    • ktnb - Kotlin Notebook Swing-based rendering
    • svg - Static SVG output
    • png - Static PNG output

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

    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.

Compose Multiplatform

To learn how to embed Lets-Plot charts in Compose Multiplatform applications, please check out the Lets-Plot Compose Frontend project at GitHub.

JVM and Kotlin/JS

To learn more about creating plots in JVM or Kotlin/JS environment, please read USAGE_JVM_JS.md.

Examples

Examples of using the Lets-Plot Kotlin API in JVM and Kotlin/JS applications are available in the Lets-Plot Kotlin Mini Apps (Demos) GitHub repository.

Documentation

What is new in 4.13.0

Kotlin: v2.2.20 (was v1.9.25).

Important

Artifact changes in the core Lets-Plot library (v4.9.0):

  • New artifact for JVM Swing applications: org.jetbrains.lets-plot:lets-plot-swing. This artifact provides 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: org.jetbrains.letsPlot.awt.plot.PlotImageExport. The required org.jetbrains.lets-plot:platf-awt dependency is likely already present in your project.
  • Statistical Summaries Directly on geomSmooth() Plot Layer

    The geomSmooth() layer now includes a labels parameter designed to display statistical summaries of the fitted model directly on the plot.
    This parameter accepts a smoothLabels() object, which provides access to model-specific variables like $R^2$ and the regression equation.

    f-26a/images/smooth_summary.png

    See: example notebook.

  • Plot Tags

    Plot tags are short labels attached to a plot.

    f-26a/images/plot_tags.png

    See: example notebook and updated Plot Layout Diagrams.

  • New geomBracket() and geomBracketDodge() Geometries

    New geometries designed primarily for significance bars (p-values) annotations in categorical plots.

    f-26a/images/geom_bracket.png

    See: example notebook.

  • Custom Color Palettes in geomImshow()

    The cmap parameter now allows you to specify a list of hex color codes for visualizing grayscale images.
    Also, the new cguide parameter lets you customize the colorbar for grayscale images.

    f-26a/images/image_custom_cmap.png

    See: example notebook.

  • New palette() Method in Color Scales

    Generates a list of hex color codes that can be used with scaleColorManual() to maintain consistent colors across multiple plots.

    See: example notebook.

  • New overflow parameter in scaleColorBrewer(), scaleFillBrewer()

    Controls how colors are generated when more colors are needed than the palette provides.
    Options: 'interpolate' ('i'), 'cycle' ('c'), 'generate' ('g').

    See: example notebook.

  • New breakWidth Parameter in Positional Scales

    Specifies a fixed distance between axis breaks.

    See examples:

  • Axis Minor Ticks Customization

    The axisMinorTicks and axisMinorTicksLength parameters in theme().

    See: example notebook.

  • Pan/Zoom in gggrid() with Shared Axes

    Pan/Zoom now propagates across subplots with shared axes (sharex/sharey).

    See: example notebook.

  • And More

    See CHANGELOG.md for a full list of changes.

Recent Updates in the Gallery

Raincloud plot Lets-Plot GeoTools with texts and labels Bitcoin daily trend visualization Creating magnifier inset effect with ggbunch() Customize legend appearance Zoom and Pan interactivity The observable LP-verse Sunshine hours

Change Log

See CHANGELOG.md.

Code of Conduct

This project and the corresponding community are governed by the JetBrains Open Source and Community Code of Conduct. Please make sure you read it.

License

Code and documentation released under the MIT license. Copyright © 2019-2025, JetBrains s.r.o.