Skip to content

Releases: lilaq-project/lilaq

Version 0.6.0 (March 14, 2026)

14 Mar 08:27
2ce85e8

Choose a tag to compare

Exciting news! Lilaq 0.6.0 introduces ultra-flexible support for plot grids, also known as subplots.

On the front of plotting functions, we added the new twins violin and hviolin and a new tick formatter for displaying fractions. Moreover, we significantly improved date/time support and introduced functionality for fixing the aspect ratio between $x$ and $y$ data coordinates.

Changelog

Breaking changes

  • Diagram bounds now strictly respect tick label bounds. This new default may change diagram layouts. You can restore the previous behavior with:

    #show: lq.set-diagram(bounds: "relaxed")
  • axis.mirror now reacts differently when set to auto. Before, axis mirrors where removed automatically when axis.position was changed. Now, they are removed automatically when either a secondary axis is added or axis.position is set to a data or screen coordinate. This change reduces boilerplate code when configuring secondary axes.

  • The default for bar.width and hbar.width changed from 0.8 to 80%. This prevents "invisible" bars on datetime axes or widely spaced positions. Similarly, boxplot.width and hboxplot.width now default to 50%. Unit-distance data (which is the most common case) is unaffected by this change.

  • Limits of boxplot and hboxplot instances are now computed correctly according to the actual width (thickness) of the box while before, boxplot (hboxplot) limits were not tight in x(y)-direction but extended to twice the width (height) in total. In order to increase the spacing again, you can set diagram.margin to something like (x: 20%).

  • vec.transform now takes individual arguments instead of a tuple. See the Utility section for details.

Diagram

  • Added native diagram grids via show rules with lq.layout.
  • Added diagram.aspect-ratio to set up a fixed aspect ratio between data x-and y-coordinates (by adjusting dimensions or margins).
  • Added diagram.bounds with modes: "strict", "relaxed", and "data-area".
  • Added support for em-lengths in diagram.width and diagram.height.
  • Improved the smartness of axis.mirror.
  • When axis limits are set to datetime values, the scale now switches to a datetime scale if axis.scale is set to auto.
  • Fixed inverted colorbars in PDF export.
  • Fixed spacing when labels are larger than the diagram.
  • When exporting to HTML, diagrams are wrapped in html.frame.

Plots

  • Added violin and hviolin plot types. Thanks to @koole for initiating their implementation.
  • Colormesh:
    • Now accepts pre-rendered images as input. When min, max, and map are provided, the colormesh behaves as if it rendered the mesh itself (including colorbars).
    • Added colormesh.align to control mesh rectangle alignment with x/y coordinates.
    • Now accepts edge arrays for x and y (length n+1) to specify mesh edges instead of point centers.
  • Bar plots:
    • Now, bar.width and hbar.width accept ratio (relative to consecutive bar positions) and duration (for datetime coordinates) values.
    • ⚠️ Default bar.width/hbar.width changed from 0.8 to 80% to improve visibility on datetime or sparse axes.
    • Changed hbar.align default from center to horizon (both values are supported).
    • Fixed integer handling for bar.width and hbar.width.
  • Boxplots
  • Added fill-between.smooth, equivalent to plot.smooth.
  • Added support for datetime coordinates with place, rect, ellipse, and line.
  • Added plot.tip and plot.toe to place Tiptoe arrow marks at the start and end of line plots.
  • Fixed behavior for empty coordinate arrays with most plotting functions. Also thanks to @koole.
  • Fixed colormesh scaling when scale.reflow is set to true via set rules. Thanks to @Andrew15-5
  • Fixed polygon rotation when rotate.reflow is set to true via set rules.
  • Fixed rect and ellipse content and gradient fills when the dimensions are negative.

Ticks

  • Added tick-format.fraction for automatic fraction formatting.
  • Added tick-format.linear#pad to disable zero-padding when formatting linear ticks.
  • Fixed formatting of linear ticks with suffix. In particular, the "0" and minus sign of negative ticks were previously not passed to zero.num. This can be important for consistency when text and math fonts don't match.
  • Fixed rounding issues for axis.tick-distance when using the linear locator.
  • Fixed an issue where the wrong subtick locator was selected when the log locator resolves to linear ticks.
  • Fixed automatic offsets and raised the threshold for automatic offsets to kick in.

Utility

  • Added logspace for creating logspaced value arrays. Thanks to @Ants-Aare.
  • Added vec.jitter to apply randomized offsets to numeric arrays.
  • Added the minmax.margin option.
  • ⚠️ vec.transform now takes individual arguments rather than a tuple. Use:
    lq.vec.transform(a, b, (a, b) => ...)
    instead of the previous:
    lq.vec.transform(a, b, ((a, b)) => ...).

Dependencies

  • Zero: 0.5.0 β†’ 0.6.1
  • Komet: 0.1.0 β†’ 0.2.0
  • Tiptoe: 0.3.1 β†’ 0.4.0

Documentation

  • Fixed typos and improved clarity across the entire documentation. Also thanks to @bastienvoirin @fGolke @Rahix and @kianmeng.
  • Typst built-in type annotations now link to the corresponding pages on the Typst website.

Version 0.5.0 (September 17, 2025)

17 Sep 07:19

Choose a tag to compare

With version 0.5.0, we are introducing several major improvements including:

Changelog

Additions

  • Added comprehensive datetime support for time series plotting with customizable formatting.
  • Diagrams now support relative and ratio inputs for diagram.width and diagram.height.
  • The parameter bar.offset now accepts array arguments for variable offsets.
  • In addition to coordinate arrays, functions x => f(x) can now be used as $y$ arguments in plot, bar, stem, and fill-between (thanks to @xkevio).
  • Column headers in text files can now be used as converter names in load-txt (thanks to @timfi).
  • Added parameter colormesh.excess to allow masking all values that are out-of-bounds.

Improvements

  • Major Performance Boost:
    • Contour computations are now significantly faster through Komet integration.
    • Boxplots can now be computed for considerably larger data sets thanks to using the Komet plugin.
  • tick-locate.linear now supports constrained tick distances like tick-distance: (min: 1).
  • ⚠️ The default for label.angle is now auto which results in 0Β° for x-labels and -90Β° for y-labels. With this change, the angle can now be changed with a conditional show rule (before, this was not possible since the -90Β° was hard-coded into the y-label).
  • ⚠️ Improved the schoolbook theme.
  • Updated elembic from version 1.1.0 to 1.1.1.
  • Updated Zero from version 0.4.0 to 0.5.0.

Fixed

  • Corrected colormesh positioning in zoomed-in views.
  • Fixed label space computation when using show rules.
  • Resolved issues with subtick labels and axis attachments.
  • Corrected axis positions defined in terms of data coordinates along the other axis when using top or right alignment.
  • Fixed a regression with setting label.pad to none.
  • Resolved placement of extra subticks.

Documentation

  • Added a comprehensive tutorial for datetime formatting.
  • Added documentation for tick locators and formatters.
  • Improved the colorbar documentation.
  • Fixed various typos and broken links (also thanks to @Jacobgarm and @F2011).

Version 0.4.0 (July 2nd, 2025)

07 Jul 09:17
1e46a39

Choose a tag to compare

With version 0.4.0, we finally add

and a lot more.

Changelog

Additions

  • Lilaq now (officially) has color bars that can be used to create a legend for colored plots like scatter or colormesh,
  • The function plot now supports smoothing through plot.smooth (thanks to @Netzwerk2).
  • There is now a formatter for symlog axes.
  • The linear tick locator now features a unit parameter making it easy to set up scales based on multiples of $\pi$ or other real numbers. In addition, the linear tick formatter is now equipped with a suffix parameter and reacts to the unit of the linear tick locator.
  • The types tick and now have a field kind which can be "x" or "y", referring to the kind of axis that they are placed on.
  • Lilaq now uses the new version 1.1.0 of elembic, introducing features like conditional set rules like show: lq.cond-set(lq.grid.with(kind: "x"), stroke: yellow) and filtered show rules through lq.show_(lq.tick-label.with(sub: true), it => {..}).
  • The type now has a field .
  • One can now pass a list of extra ticks to (for example through lq.diagram(xaxis: (extra-ticks: ()))).
  • The plot functions ellipse and rect now have a parameter align.

Breaking changes

  • ⚠️ The parameter now takes a ratio between 0% and 100% instead of a float between 0 and 1 and its behavior is inverted: Setting it to 70% for example shortens the sub-ticks by 70% and not to 70%.
  • ⚠️ The parameter grid.sub is now named instead of positional.
  • ⚠️ When a function is passed to quiver.color, it is passed both the coordinates and directions as (x, y, u, v) instead of just the coordinates.
  • ⚠️ The legend now uses a grid instead of a table to lay out its items, so you need to replace any show lq.selector(lq.legend): set table(..) with show lq.selector(lq.legend): set grid(..)

Improvements

  • The diagram bounds are updated accordingly for content placed with lq.place.
  • Updated Tiptoe from 0.3.0 to 0.3.1 (it now works with right-to-left text direction).
  • Updated Zero from 0.3.3 to 0.4.0 (some fixes, including with right-to-left text).
  • The fields and now default to auto.

Fixed

  • Diagrams now work in a context with right-to-left text direction.
  • Fixed axis.inverted which was ignored whenever there was at least one plot with non-tight limits.
  • Setting mark.stroke and mark.fill via plot cycles now works for scatter.
  • Breaking of tick labels when the diagram is too narrow (thanks to @Xendergo).
  • Manual tick locations are now clipped to the range of the axis.
  • Fixed computation of significant digits with non-integer steps.
  • Sub-ticks can now be formatted easily.
  • The interaction of various color and stroke settings for scatter.
  • Fixed error bars when the y-axis range is inverted.
  • Median inset has been fixed for inverted axes.
  • A conflict when using plot.every together with legend labels has been resolved.

Documentation

Version 0.3.0 (May 9th, 2025)

09 May 12:03

Choose a tag to compare

The new version ships with a set of predefined themes that you can use to quickly change the style of your plots.

Moreover, various improvements to important components of Lilaq have been made along with the addition of a large selection of scientific and colorblind-friendly color maps.
Notably, we have added a new tutorial on data loading with Typst and Lilaq.

Changelog

Additions

  • A set of predefined themes is now avaiable!
  • Added the qualitative color sequence lq.color.map.okabe-ito according to https://jfly.uni-koeln.de/color/.
  • Added a range of sequential and diverging color maps that are scientific, i.e., perceptually uniform, perceptually ordered, and colorblind-friendly, see https://lilaq.org/docs/reference/color.
  • A new plot type hboxplot as horizontal pendant to the existing boxplot.
  • An axis.inverted property to quickly swap min/max limits.
  • A tick locator for symlog axes.

Breaking changes

  • ⚠️ The parameter line of hlines and vlines has been renamed to stroke to bring the signature in line with the other plotting functions.
  • ⚠️ The symlog.threshold is now by default 1 (instead of 2).
  • ⚠️ The color sequences matplotlib10 and matplotlib20 have been removed.

Improvements

  • diagram.legend now accepts a full legend as argument which enables one to specify all entries manually.
  • boxplot now allows defining the statistical values manually instead of passing a data set.
  • Functions like plot can now have empty coordinate arrays.

Fixed

  • The step mode for fill-between works again.
  • The parameters diagram.xlim and diagram.ylim don't fold any more through array concatenation with set rules.
  • For plot functions like colormesh that ignore the cycle style, the cycle counter is now not advanced.
  • Fixed an issue with the default tick locator when an integer tick distance was given.

Documentation

  • Added a tutorial on data loading.
  • Mention the usage of std.pad together with lq.place.
  • Mention the possibility of masking values with colormesh.
  • Articles in the reference section now contain a link that brings you to the source of the definition on GitHub.

Version 0.2.0 (April 2nd, 2025)

02 Apr 10:20

Choose a tag to compare

With this release, important improvements are made to the defaults, prominently including a new default color cycle.

Instead of a somewhat arbitrary color cycle, Lilaq now uses a thoroughly researched, highly optimized color sequence that is friendly to people with color deficiencies. This map is a result of the work of M. A. Petroff (https://arxiv.org/abs/2107.02270).
On top, Lilaq ships a small set of color sequences, available under lq.color.map.

Moreover, the default axis thickness and tick length have been reduced, resulting in a better harmony with text surrounding a diagram figure.

The mark shapes of Lilaq are carefully designed to match in optical size, so they look good together in one plot without further adaptation. This release makes some fine adjustments to the mark sizes. Furthermore, some marks have been added and a few ones renamed (see below).

The most important fixes in this release concern a bug that made it impossible to replace the default style cycle and an issue when first-line-indent was applied to all paragraphs.

Changelog

Highlights

  • Lilaq now features a professional default color cycle.

Added

  • plot.every for plotting marks for only a subset of the data points.
  • Sequential color maps, e.g., for style cycles under lq.color.map.
  • Tools for creating cycles.
  • Options tip and toe to lq.path for adding arrow tips or other marks.

Improved

  • diagram.xaxis and diagram.yaxis dictionaries will now fold which is useful for set rules and overriding only specific settings made in templates.
  • axis.dx and axis.dy can now be of type relative or ratio for more positioning control.
  • Ticks now use cap: "butt" by default leading to better results when the spine stroke is set to none. This also shortens the ticks by half their width compared to before.
  • The function locate-ticks-linear now features a parameter density that can be used to tune the number of generated ticks based on the automatic estimate.
  • The parameter label.pad can now be none for placement directly on the axis (ignoring the ticks).
  • diagram.cycle can now also take an array of colors for the common case that the style cycle only consists of color changes. Moreover, and array of dictionaries with the possible keys color, stroke, and mark is supported.

Marks

  • Tweaked mark sizes.
  • ⚠️ Replaced triangle with ^ and added other triangle rotations <, >, and v.
  • ⚠️ Replaced diamond with d
  • ⚠️ Replaced pentagon, hexagon, heptagon, and octagon with p5, p6, p7, p8.
  • Added star variations s3, s4, s5, and s6
  • ⚠️ Default mark stroke thickness is now 0.7pt instead of 1pt matching it with the default line width of 0.7pt.

Other breaking changes

  • ⚠️ The default color cycle has changed. We now use a color sequence introduced by Matthew A. Petroff in https://arxiv.org/pdf/2107.02270 that is optimized for distinguishability, aesthetics, and people with color deficiencies.
  • ⚠️ The default spine thickness has changed from 0.7pt to 0.5pt.
  • ⚠️ The default tick length has been reduced from 4pt to 3pt.
  • ⚠️ diagram.legend no longer supports bool arguments. Instead, use legend: none to turn the legend off (or legend: (:) to turn it back on after it has been deactivated previously).
  • ⚠️ The default color of vlines and hlines is now black instead of blue.
  • ⚠️ The default z-index values for axis, legend, and place have changed.

Fixed

  • An urgent bug with style cycle lists being appended.
  • The bottom axis being misplaced when a first-line-indent is applied to all paragraphs.
  • Combination of plot.stroke: none and a fixed plot.color resulted in black error bars.

Documentation

  • Added examples for advanced bar charts with labels and error bars.
  • Added mark documentation and tutorial.
  • Improved style cycle documentation.

Version 0.1.0 (March 14th, 2024)

14 Mar 09:26

Choose a tag to compare

This is the first official release of Lilaq. The documentation can be found on the website at https://lilaq.org.

Version 0.0.2-alpha (March 14th, 2025)

14 Mar 08:20

Choose a tag to compare

Pre-release

This release makes some big changes and a vast number of improvements.

Primarily, types in form of elembic elements are introduced to greatly enhance user customization possibilities. Moreover, Lilaq now has a website with thorough documentation at https://lilaq.org. Enjoy!

Changelog

Added

  • New elements grid, title, label, legend, diagram, tick, tick-label, spine, and errorbar.
  • Added hbar plotting function.
  • Support for individual rectangle side coloring of bar.
  • New filter parameter for axis.

Breaking changes

  • The parameters vmin/vmax have been renamed to min/max for quiver, contour, colormesh.
  • mesh now only returns the 2d mesh array and not any more also the given inputs. Furthermore, mesh returns a transposed mesh in comparison to before.
  • Consequently, colormesh and quiver now take transposed 2D input arrays.
  • Removed parameter color of contour in favor of the new stroke parameter.
  • hline and vline now expect coordinates as individual positional arguments (before one array was expected).
  • legend.pos is now legend.position.
  • title.pos is now title.position.
  • The format for asymmetric errorbars (in plot.xerr and plot.yerr) has changed. Please refer to the documentation.
  • axis.position now takes a dictionary instead of an array for combined align+offset configuration.

Improvements

  • Improved contour rendering by using the new curve element to remove rare artifacts.
  • colormesh now creates pixmaps when possible (when the coordinates are evenly spaced) to avoid artifacts and to support smooth interpolation.
  • Quiver can now take a function for color.
  • Axis exponents/offsets now use Zero for showing numbers.
  • Arrow tips for axis.
  • Arrow tips for line.
  • Added fill parameter to diagram.
  • Improved ticking heuristic for horizontal axes.
  • Use square cap for base stroke for stem and hstem.
  • Updated to tiptoe:0.2.0.

Fixed

  • plots legend images with error bars.
  • ticking: automatic e base label (after Typst 0.13 it was shown incorrectly).
  • fill-between now responds to the current style cycle.
  • Overflowing, crammed legends.
  • empty diagrams with log scales resulting in an error.
  • additional axes now respect diagram.margin.
  • Plots in additional axes now work properly: they are shown in the legend (if labeled), they behave properly with style cycles, and their z-index is not ignored anymore.
  • The default symlog formatter now uses Zero.

Docs

  • Documentation website!
  • Large-scale documentation improvements.
  • Added examples to all important functions, types and sometimes parameters.

Version 0.0.1-alpha (January 18th, 2025)

18 Jan 13:59

Choose a tag to compare

This is a first and early release of Lilaq, starting an initiatory testing phase.

In the attachments of this release you can find a quickstart document and its Typst source.