                 Changes in version 8.3.1 (2026-09-13)                  

Bug fixes

  - avoid legend indexing warnings on R-devel (2628806)

                         Changes in version 8.3                         

This releases adds exterior set labels and region glyphs as well as
upgrades Eunoia to 1.9.0 for rectangle fitting and normalization fixes

Features

  - upgrade to Eunoia 1.9 (79ae995)

Bug fixes

  - repair two assertions that passed for the wrong reason (0dbd3e7)

                         Changes in version 8.2                         

Features

  - plotting: add matched exterior label placement (f00e121)

Bug fixes

  - flatten same-direction eulergram compositions (2a10b4b)
  - plot: associate region fills by label not position (c74896a), fixes
    #134

                         Changes in version 8.1                         

Highlights

This version brings rotated rectangles as a new shape to eulerr, as well
as the ability to customize the optimizer used to fit the diagram.
eulerr is also parallelized now, and because the fitting pipeline now
runs the full fit in several branches (in parallel), this should bring
significant speedups for larger diagrams.

Features

  - plotting: add configurable canvas margin (eea3542)
  - support rotated rectangles and configurable optimizers (330e42b)
  - add n_threads option for parallelizing fits (845a54f)
  - add transform option to fitter (f4b99c1), closes #96

Bug fixes

  - plotting: increase margin around plot to 2 pt (3ff50c6)
  - note correct rustc requirement in DESCRIPTION (9b05074)

                         Changes in version 8.0                         

This is a major milestone for eulerr. The 8.0.0 release introduces a
complete rewrite of the underlying C++ codebase, now relying instead on
the Rust library Eunoia, which is a library I have developed. Here are
some of the highlights this brings:

  - We have added support for squares and rectangles too!
  - Eunoia uses analytical gradients for all the smooth loss functions,
    which leads to significantly improved performance. We have also
    swapped the default optimization algorithm to a
    Levendberg--Marquardt (LM) method plus CMA-ES fallback. The LM
    method is invoked only when the loss is squared residuals, but is
    then much faster than the previous nlm() method. The CMA-ES fallback
    replaces the previous use of the GenSA package, and is invoked
    whenever the LM method reaches a minimum that's above a level of
    error (configurable by the user).
  - There are now several labeling algorithms that ensure labels do not
    overlap each other or other parts of the diagram.
  - As a result of the above, we have been able to drop multiple
    dependencies: Rcpp, RcppArmadillo, GenSA, polylabelr, and polyclip
    are all no longer required, since rextendr and Eunoia handle the
    Compiled code and algorithms natively.
  - The calculated intersections are now sparse, which means that only
    the intersections that actually appear in either input or output
    (the diagram) are calculated and stored. This is a breaking change
    because it means that you cannot index the intersections by their
    position or intersection name and guarantee that you will get a
    value. Instead, you must check if the intersection exists first, and
    then implicitly it will have a value of zero. But this allows eulerr
    to handle much larger combinations, since we never store a 2^n
    - 1-sized vector anywhere.

Breaking changes

  - return sparse residuals (decc985)

Features

  - add square and rectangle shapes (44c9a1a)
  - plotting: add placement strategies for labels (308167a)
  - add annotations argument for annotating intersections (19d2d87),
    closes #70
  - add plot composing via +, / and | (d974c08), closes #46
  - expose gap and separate labels by gap and tether (17802a2)
  - add template to quantities in plot() (59ddd71), closes #99
  - employ Eunoia's label-placement framework (4ed75b4), closes #69 and
    #4
  - add complement (b6ce232), closes #13
  - add new loss functions, deprecate old and loss_aggregator (03e7dea)
  - add max_sets in control for capping max sets (621a898), closes #85
  - add by_groups to plot() for panel-specifics (f2d5533), closes #125
  - return sparse residuals (decc985)
  - update euonoia to 0.8.0 (ceb3138)
  - update eunoia (530fb11)
  - lower default tolerance (6400fae)
  - plotting: add symbol_size to configure legend symbol (1491a49),
    closes #60
  - plotting: add rotate parameter (706735c), closes #12
  - plots: support top and left for labeling strips (c1a87fb), closes
    #123

Bug fixes

  - add padding to avoid clipping plots (5129054)
  - use stats namespace (72df9c8)

Performance improvements

  - upgrade to eunoia 0.11.0 (021ceb4)

                         Changes in version 7.1                         

Features

  - allow setting plot options via named vector (3b7a32e), closes #111
  - implement patterns (caf1c76), closes #83
  - set venn diagram class to venn_eulerr (244a657), closes #78
  - add quantities$format for number formatting (b01e69b), closes #75
  - allow rounding numbers (6e297a5), closes #76
  - add bg option for plot.euler() (bf70290), closes #74
  - allow named labels in quantities (4c7d091), fixes #112
  - allow expression vectors in plot.euler() + labels (cea5e43), closes
    #118

Bug fixes

  - strictly map colors to set identities (a58fce5), closes #109
  - use correct number of columns in tabular (4880f5e), closes #116

                 Changes in version 7.0.4 (2025-09-24)                  

Bug Fixes

  - Ignore air.toml in Rbuildignore to fix R CMD check warning.

                        Changes in version 7.0.3                        

Bug Fixes

  - Fix deprecated use of arma::is_finite() in C++ code.
  - Fix URL link to eulerAPE in documentation.
  - Fix URL link to workshop paper in documentation and citation.

                 Changes in version 7.0.2 (2024-03-28)                  

Bug Fixes

  - Fix order and layout of strips when grouping (#108, by @altairwei)

                 Changes in version 7.0.1 (2024-02-16)                  

Minor Changes

  - Fixed some incorrect documentation of internal functions.
  - Corrected an url for eulerAPE.

                 Changes in version 7.0.0 (2022-12-09)                  

New Features

  - It is now possible to set the loss function to be used when trying
    to optimize the Euler diagram layout via loss and loss_aggregator.
    There is a new vignette that showcases this new feature.

Minor Changes

  - C++14 is now required for the package.

Bug Fixes

  - Label repelling via adjust_labels in plot.euler() has been
    deprecated and removed to fix sanitizer warnings.

                 Changes in version 6.1.1 (2021-09-06)                  

Minor changes

  - citation to conference paper added to inst/CITATION
  - error messages for erroneous input have been improved in several
    places
  - switched PI to M_PI to support STRICT_R_HEADERS in C++ code (#82,
    thanks @eddelbuettel)

Bug fixes

  - error in documentation for list method has been fixed, thanks
    @gprezza (##77)

                 Changes in version 6.1.0 (2020-03-09)                  

Minor changes

  - Label repelling (activated by calling euler() with adjust_labels =
    TRUE) no longer repels text labels away from the edges of the shapes
    in the diagram.

Bug fixes

  - Rectify sanitizer error from clang-ASAN test environment.

                 Changes in version 6.0.2 (2020-03-04)                  

Bug fixes

  - Set stringsAsFactors = TRUE inside all relevant functions in euler()
    to avoid errors in upcoming R version.
  - Fix broken link in eulerr under the hood vignette.

                        Changes in version 6.0.1                        

Minor changes

  - Throw an error message when the number of sets in venn() exceeds 5
    (##65)
  - Performance improved when large lists are used as input to euler()
    and venn() (##64, @privefl)

Bug fixes

  - Correctly handle data.frame inputs to euler() when categorical
    variables are character vectors and not factors.

                 Changes in version 6.0.0 (2019-09-27)                  

New features

  - In plot.euler(), percentages can be added to the plot in addition to
    or instead of counts by providing a list to the quantities argument
    with an item type that can take any combination of counts and
    percent. This change also comes with a redesign of the grid graphics
    implementation for labels.
  - eulerr_options() gains a new argument padding which controls the
    amount of padding between labels and quantities. (##48)
  - plot.euler() now uses code from the ggrepel package to prevent
    labels from overlapping or escaping the plot area if adjust_labels
    is set to TRUE.
  - A new vignette featuring a gallery of plots from the package has
    been added.

Minor changes

  - The default cex for quantity labels has changed from 1.0 to 0.9.
  - Labels for sets that overlap are now merged (partly fixes ##45)
  - The fill colors for sets which are completely contained within
    another set are now once again composed of a mix of the color of the
    subset and the superset.
  - Plotting data has been exposed in a data slot in the object created
    by calling to plot.euler() (##57)

Bug fixes

  - An error in layout normalization that occurred sometimes with
    ellipses has been fixed.

eulerr 5.1.0

New features

  - venn() is a new function that produces Venn diagrams for up to 5
    sets. The interface is almost identical to euler() except that a
    single integer can also be provided. A new vignette, Venn diagrams
    with eulerr, exemplifies its use.

Minor changes

  - Calculations for the strips in plot.euler() when a list of Euler
    diagrams is given has been improved. Setting fontsize or cex now
    results in appropriately sized strips as one would expect.
  - Tiny overlaps (where the fraction of the area is less than one
    thousandth of the largest overlap) in the final diagram are no
    longer plotted.
  - eulergram() objects from plot.euler() now have a proper grob name
    for the canvas grob, so that extracting information from them is
    easier.

Bug fixes

  - Return value documentation for euler() now correctly says "ellipses"
    and not "coefficients".
  - data.frame or matrix inputs now work properly when values are
    numerical. (##42)
  - Fixed some spelling errors in news and vignettes.

                 Changes in version 5.0.0 (2018-11-05)                  

New features

  - error_plot() is a new function that offers diagnostic plots of fits
    from euler(), letting the user visualize the error in the resulting
    Euler diagram.

Major changes

  - euler() once again uses the residual sums of squares, rather than
    the stress metric, as optimization objective, which means that
    output is always scaled appropriately to input (##28).
  - plot.euler() now uses the polylabelr package to position labels for
    the overlaps of the ellipses, which has improved performance in
    plotting complicated diagrams considerably and reduced the amount of
    code in this package greatly.
  - The c++ internals have been rewritten using more memory-efficient,
    performant and expressive code.

Minor changes

  - The euler.data.frame() method (and by proxy the euler.matrix()
    method) can now take matrices with factors in addition to the
    previously supported logical and integer (binary) input. The
    function will dummy code the variables for the user.
  - A few performance fixes.
  - Additional unit tests.
  - Previously deprecated arguments to plot.euler() have been made
    defunct.
  - Added a data set, plants, to exemplify the list method for euler().
  - Added a data set, fruits, to exemplify the data.frame method for
    euler().
  - euler.data.frame() gains an argument sep, which is a character
    vector used to separate dummy-coded factors if there are factors or
    characters in the input.
  - Added a data set, organisms, to exemplify the matrix method for
    euler().
  - Added a data set, pain, to exemplify the table method for euler().
  - euler.table() gains an argument, factor_names, for specifying
    whether the factor names should be included when generating
    dummy-coded variables in case the input is a data.frame with
    character or factor vectors or if the input is a table with more
    than two columns or rows.
  - Parts of the eulerr under the hood vignette has been branched off
    into a new vignette regarding visualization.

Bug fixes

  - Empty combinations can now be provided and will be plotted
    (generating completely blank plots).
  - euler.list() now passes its ellipsis argument along properly. (##33,
    thanks, @banfai)
  - Several spelling and grammar mistakes were corrected in vignettes
    and documentation.

                 Changes in version 4.1.0 (2018-04-20)                  

Minor changes

  - plot.euler() now returns a gTree object. All of the plotting
    mechanisms are now also found in this function and plot.eulergram()
    and print.eulergram() basically just call grid::grid.draw() on the
    result of plot.euler(). This change means that functions such as
    gridExtra::grid.arrange() now work as one would intuit on the
    objects produced by plot.euler().
  - Fitting and plotting Euler diagrams with empty sets is now allowed
    (##23). Empty sets in the input will be returned as NA in the
    resulting data.frame of ellipses.
  - The last-ditch optimizer has been switched back to GenSA::GenSA()
    from RcppDE::DEoptim().

Bug fixes

  - The grid parameters available for edges are now correctly specified
    in the manual for plot.euler().
  - euler.data.frame() now works as expected for tibbles (from the
    tibble package) when argument by is used.

                 Changes in version 4.0.0 (2018-02-05)                  

Major changes

  - plot.euler() has been rewritten completely from scratch, now using a
    custom grid-based implementation rather than lattice. As a result,
    all panel.*() functions and label() have been deprecated as well as
    arguments fill_alpha, auto.key, fontface, par.settings,
    default.prepanel, default.scales, and panel. The method for plotting
    diagrams has also changed---rather than overlaying shapes on top of
    each other, the diagram is now split into separate polygons using
    the polyclip package. Instead of relying on semi-transparent fills,
    the colors of the fills are now blended in the CIELab color space
    (##16).
  - The default color palette has been redesigned from scratch to suit
    the new plot method.
  - A new function eulerr_options() have been provided in order to set
    default graphical parameters for the diagrams.

Minor changes

  - Arguments counts and outer_strips to plot.euler() are now defunct.
  - euler() now always returns ellipse-based parameters with columns h,
    k, a, b, and phi, regardless of which shape is used. This item was
    previously named "coefficients", but it now called "ellipses"
    instead and a custom coef.euler() method has been added to make cure
    that coef() still works.
  - Layouts are now partially normalized so that diagrams will look
    approximately the same even with different random seeds.

Bug fixes

  - Providing custom labels to quantities and labels arguments of
    plot.euler() now works correctly (##20).

                 Changes in version 3.1.0 (2018-01-02)                  

Major changes

  - The last-ditch optimizer switched from GenSA::GenSA() to
    RcppDE::DEoptim().
  - The optimizer used in all the remaining cases, including all
    circular diagrams and initial layouts, was switched back to
    stats::nlm() again.
  - In final optimization, we now use stress instead of residual sums of
    squares as a target for our optimizer.

Minor changes

  - label is now a proper generic with an appropriate method
    (label.euler()).
  - The eulerr under the hood vignette has received a substantial
    update.

Bug fixes

  - Fixed warnings resulting from the deprecated counts argument in one
    of the vignettes.
  - Fixed memcheck errors in the final optimizer.
  - Corrected erroneous labeling when auto.key = TRUE and labels were
    not in alphabetic order. (##15)

                 Changes in version 3.0.1 (2017-11-15)                  

Bug fixes

  - Added the missing %\VignetteEngine{knitr::knitr} to both vignettes.
    It had mistakenly been left out, which had mangled the resulting
    vignettes.

                 Changes in version 3.0.0 (2017-11-15)                  

Major changes

  - Ellipses are now supported by setting the new argument shape =
    "ellipse" in euler(). This functionality accompanies an overhaul of
    the innards of the function.
  - Initial optimization function and gradient have been ported to C++.
  - The initial optimizer has been switched from stats::optim(...,
    method = "L-BFGS-B") to stats::nlminb().
  - The final optimizer now falls back to GenSA::GenSA() when the fit
    from nlminb() isn't good enough, by default for 3 sets and ellipses,
    but this behavior can be controlled via a new argument control.
  - A packing algorithm has been introduced to arrange disjoint clusters
    of ellipses/circles.
  - The label placement algorithm has been rewritten to handle ellipses
    and been ported to C++. It now uses numerical optimization, which
    should provide slightly more accurate locations.
  - The initial optimizer now uses an analytical Hessian in addition to
    gradient.

Minor changes

  - The initial optimizer now restarts up to 10 times and picks the best
    fit (unless it is perfect somewhere along the way).
  - The default palette has been changed to a fixed palette, still
    adapted to color deficiency, but with some manual adjustments to,
    among other things, avoid unnecessary use of color.
  - The names of the diagError and regionError metrics have been changed
    from diag_error and region_error to reflect the original names.
  - The coordinates for the centers are now called h and k instead of x
    and y, respectively.
  - A new label() function has been added to extract locations for the
    overlaps for third party plotting (##10).
  - The counts argument to plot.euler() and panel.euler.labels() have
    been deprecated in favor of the more appropriate quantities.
  - Argument fill_opacity in plot.euler() that was deprecated in v2.0.0
    has been made defunct.

                 Changes in version 2.0.0 (2017-06-20)                  

Major changes

  - eulerr() has been replaced with euler() (see update 1.1.0) and made
    defunct.
  - There are two new methods for euler:
      - euler.list() produces diagrams from a list of sample spaces.
      - euler.table() produces diagrams from a table object, as long as
        there are no dimensions with values greater than 2.
  - plot.euler() has been rewritten (again) from the ground up to better
    match other high-level functions from lattice. This change is
    intended to be as smooth as possible and should not make much of a
    difference to most users.
  - Arguments polygon_args, mar, and text_args to plot.euler() have been
    made defunct.

Minor changes

  - plot.euler() handles conflicting arguments better.
  - c++ routines in eulerr now use registration.
  - euler() now allows single sets (##9).
  - Labels in plot.euler() now use a bold font face by default in order
    to distinguish them from the typeface used for counts.
  - Argument key in plot.euler() has been deprecated and replaced with
    auto.key. Notice that using key does not throw a warning since the
    argument is used in lattice::xyplot() (which plot.euler() relies
    on).
  - Argument fill_opacity is softly deprecated and has been replaced
    with fill_alpha for consistency with other lattice functions.

Bug fixes

  - border argument in plot.euler() works again (##7).

                 Changes in version 1.1.0 (2017-02-05)                  

Major changes

  - eulerr() and its related methods been deprecated and are being
    replaced by euler(), which takes slightly different input. Notably,
    the default is now to provide input in the form of disjoint class
    combinations, rather than unions. This is partly to make the
    function a drop-in replacement for venneuler::venneuler.
  - plot.euler() has been completely revamped, now interfacing xyplot()
    from lattice. As a result, arguments polygon_args, mar, and
    text_args have been deprecated.

Minor changes

  - Added a counts argument to plot.eulerr, which intersections and
    complements with counts from the original set specification (##6).
  - Added a key argument to plot.eulerr that prints a legend next to the
    diagram.
  - Switched to atan2() from RcppArmadillo.
  - Added version requirement for RcppArmadillo.
  - Dropped dependency on MASS for computing label placement, replacing
    it with a faster, geometric algorithm.
  - Dropped the cost function argument cost and now forces the function
    to use sums of squares, which is more or less equivalent to the cost
    function from venneuler.
  - Color palettes in plot.euler() now chooses colors adapted to color
    vision deficiency (deuteranopia). With increasingly large numbers of
    sets, this adaptation is relaxed to make sure that colors are kept
    visually distinct.
  - euler() now uses nlm() instead of optim(method = "Nelder-Mead") for
    its final optimization.

Bug fixes

  - The previous algorithm incorrectly computed loss from unions of
    sets. It now computes loss from disjoint class combinations.
  - Added missing row breaks in print.eulerr.

                 Changes in version 1.0.0 (2016-12-10)                  

New features

  - Final optimization routines have been completely rewritten in C++
    using Rcpp and RcppArmadillo.
  - Switched to the cost function from EulerAPE for the default
    optimization target but added the possibility to choose cost
    function via a cost argument (currently eulerAPE or venneuler).
  - Added the option to produce conditional eulerr plots via a by
    argument to eulerr. The result is a list of Euler diagrams that can
    be plotted in a grid arrangement via a new plot method.
  - Improved label placement by using a two-dimensional kernel density
    estimation instead of means to calculate label centers.

Bug fixes and minor improvements

  - Cleaned up typos and grammar errors in the Introduction to eulerr
    vignette.
  - Added mar argument to plot.eulerr with a default that produces
    symmetric margins.
  - Corrected the implementation of the stress statistic from venneuler.
  - Switched to Vogel sampling to generate points to choose label
    positions from.
  - Minor clean up and performance fixes all around.
  - Added a print.eulerr method.
  - Updated vignette to cover new features and changes.

                 Changes in version 0.1.0 (2016-10-16)                  

  - The first release.
