- Fix order and layout of strips when grouping (#108, by @altairwei)
- Fixed some incorrect documentation of internal functions.
- Corrected an url for eulerAPE.
- It is now possible to set the loss function to be used when trying to
optimize the Euler diagram layout via
loss
andloss_aggregator
. There is a new vignette that showcases this new feature.
- C++14 is now required for the package.
- Label repelling via
adjust_labels
inplot.euler()
has been deprecated and removed to fix sanitizer warnings.
- citation to conference paper added to
inst/CITATION
- error messages for erroneous input have been improved in several places
- switched
PI
toM_PI
to supportSTRICT_R_HEADERS
in C++ code (#82, thanks @eddelbuettel)
- error in documentation for list method has been fixed, thanks @gprezza (##77)
- Label repelling (activated by calling
euler()
withadjust_labels = TRUE
) no longer repels text labels away from the edges of the shapes in the diagram.
- Rectify sanitizer error from clang-ASAN test environment.
- Set
stringsAsFactors = TRUE
inside all relevant functions ineuler()
to avoid errors in upcoming R version. - Fix broken link in eulerr under the hood vignette.
- 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()
andvenn()
(##64, @privefl)
- Correctly handle
data.frame
inputs toeuler()
when categorical variables are character vectors and not factors.
- In
plot.euler()
, percentages can be added to the plot in addition to or instead of counts by providing alist
to thequantities
argument with an itemtype
that can take any combination ofcounts
andpercent
. This change also comes with a redesign of the grid graphics implementation for labels. eulerr_options()
gains a new argumentpadding
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 ifadjust_labels
is set toTRUE
.- A new vignette featuring a gallery of plots from the package has been added.
- 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 toplot.euler()
(##57)
- An error in layout normalization that occurred sometimes with ellipses has been fixed.
venn()
is a new function that produces Venn diagrams for up to 5 sets. The interface is almost identical toeuler()
except that a single integer can also be provided. A new vignette, Venn diagrams with eulerr, exemplifies its use.
- Calculations for the strips in
plot.euler()
when a list of Euler diagrams is given has been improved. Settingfontsize
orcex
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 fromplot.euler()
now have a proper grob name for the canvas grob, so that extracting information from them is easier.
- Return value documentation for
euler()
now correctly says "ellipses" and not "coefficients". data.frame
ormatrix
inputs now work properly when values are numerical. (##42)- Fixed some spelling errors in news and vignettes.
error_plot()
is a new function that offers diagnostic plots of fits fromeuler()
, letting the user visualize the error in the resulting Euler diagram.
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.
- The
euler.data.frame()
method (and by proxy theeuler.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 foreuler()
. - Added a data set,
fruits
, to exemplify the data.frame method foreuler()
. euler.data.frame()
gains an argumentsep
, 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 foreuler()
. - Added a data set,
pain
, to exemplify the table method foreuler()
. 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.
- 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.
plot.euler()
now returns agTree
object. All of the plotting mechanisms are now also found in this function andplot.eulergram()
andprint.eulergram()
basically just callgrid::grid.draw()
on the result ofplot.euler()
. This change means that functions such asgridExtra::grid.arrange()
now work as one would intuit on the objects produced byplot.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 resultingdata.frame
of ellipses. - The last-ditch optimizer has been switched back to
GenSA::GenSA()
fromRcppDE::DEoptim()
.
- 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 argumentby
is used.
plot.euler()
has been rewritten completely from scratch, now using a custom grid-based implementation rather than lattice. As a result, allpanel.*()
functions andlabel()
have been deprecated as well as argumentsfill_alpha
,auto.key
,fontface
,par.settings
,default.prepanel
,default.scales
, andpanel
. 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.
- Arguments
counts
andouter_strips
toplot.euler()
are now defunct. euler()
now always returns ellipse-based parameters with columnsh
,k
,a
,b
, andphi
, regardless of which shape is used. This item was previously named "coefficients", but it now called "ellipses" instead and a customcoef.euler()
method has been added to make cure thatcoef()
still works.- Layouts are now partially normalized so that diagrams will look approximately the same even with different random seeds.
- Providing custom labels to
quantities
andlabels
arguments ofplot.euler()
now works correctly (##20).
- The last-ditch optimizer switched from
GenSA::GenSA()
toRcppDE::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.
label
is now a proper generic with an appropriate method (label.euler()
).- The eulerr under the hood vignette has received a substantial update.
- 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)
- Added the missing %\VignetteEngine{knitr::knitr} to both vignettes. It had mistakenly been left out, which had mangled the resulting vignettes.
- Ellipses are now supported by setting the new argument
shape = "ellipse"
ineuler()
. 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")
tostats::nlminb()
. - The final optimizer now falls back to
GenSA::GenSA()
when the fit fromnlminb()
isn't good enough, by default for 3 sets and ellipses, but this behavior can be controlled via a new argumentcontrol
. - 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.
- 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
andregionError
metrics have been changed fromdiag_error
andregion_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 toplot.euler()
andpanel.euler.labels()
have been deprecated in favor of the more appropriatequantities
. - Argument
fill_opacity
inplot.euler()
that was deprecated in v2.0.0 has been made defunct.
eulerr()
has been replaced witheuler()
(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 atable
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
, andtext_args
toplot.euler()
have been made defunct.
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
inplot.euler()
has been deprecated and replaced withauto.key
. Notice that usingkey
does not throw a warning since the argument is used inlattice::xyplot()
(whichplot.euler()
relies on). - Argument
fill_opacity
is softly deprecated and has been replaced withfill_alpha
for consistency with other lattice functions.
border
argument inplot.euler()
works again (##7).
eulerr()
and its related methods been deprecated and are being replaced byeuler()
, 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 forvenneuler::venneuler
.plot.euler()
has been completely revamped, now interfacingxyplot()
from lattice. As a result, argumentspolygon_args
,mar
, andtext_args
have been deprecated.
- Added a
counts
argument toplot.eulerr
, which intersections and complements with counts from the original set specification (##6). - Added a
key
argument toplot.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 fromvenneuler
. - 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 usesnlm()
instead ofoptim(method = "Nelder-Mead")
for its final optimization.
- 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
.
- 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 (currentlyeulerAPE
orvenneuler
). - Added the option to produce conditional eulerr plots via a
by
argument toeulerr
. 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.
- Cleaned up typos and grammar errors in the Introduction to eulerr vignette.
- Added
mar
argument toplot.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.
- The first release.