ApexCharts 6.9.0 shipped on August 16 with a histogram chart type, raw-observation input for box plot and violin, and a cross-type morph that moves marks instead of crossfading. No API was removed, but pie selection, grouped stacked totals and the package's dependencies changed, so check the table below before you upgrade.

Key takeaways

Which defaults changed?

ChangeReleaseWhat you will seeHow to reverse or upgrade
Pie and donut click6.9.0A clicked slice slides out along its mid-angle instead of darkening and growing by 4pxplotOptions.pie.expandOffset: 0 keeps the slice in place
Pie and donut hover6.9.0Hover traces an outline band (plotOptions.pie.hoverOutline) and the fill keeps its colourplotOptions.pie.hoverOutline.show: false brings back the lightened fill; states.hover.filter.type: 'none' turns hover feedback off entirely
Grouped stacked totals (series[].group)6.9.0One total above each group's bar, instead of one label per data point summing every seriesNo option: the old label was wrong. Remove any workaround
apex-commons (^0.5.0) runtime dependency6.9.0A new package in your dependency tree; ApexCharts is no longer dependency-freeNo action: npm resolves it and the browser bundles inline it

Histogram

A histogram takes one number per event and does the aggregating itself. There is no x; the bin edges come from the data's own extent.

chart: { type: 'histogram' },
series: [{ name: 'Latency', data: [102, 87, 143, 91, 118, 96, /* ... */] }]

bins: 'auto' (the narrower of Freedman-Diaconis and Sturges).

plotOptions.histogram.bins takes a rule ('auto', 'fd', 'sturges', 'scott', 'rice', 'sqrt') or a fixed count. Step through the buttons above on the same sample and watch the slow tail appear and disappear. binWidth, range, normalize and cumulative cover the rest. Several series share one set of edges and overlay by default (overlap: true), so two samples stay comparable. The binning ships behind apexcharts/features/stats, so it costs nothing if you do not use it. See Choosing the bins.

Box plot and violin take the sample

Put the measurements in points, the field both types already used for jitter dots, and the chart computes the summary or the density.

// before: you compute the summary
series: [{ data: [{ x: 'Phone', y: [1.2, 1.9, 2.4, 3.1, 4.1] }] }]

// after: you supply the sample
series: [{ data: [{ x: 'Phone', points: [1.2, 1.9, 3.4, 2.2, 2.8, /* ... */] }] }]

BoxPlot from Raw Observations

Quartiles interpolate between ranks (R type 7). Whiskers reach the extremes by default; plotOptions.boxPlot.whiskers: 'tukey' switches to the 1.5 × IQR convention, so pair it with points.show or the points beyond the fence disappear. A precomputed y is still drawn exactly as given. See Raw observations.

rowSeries() and a morph that conserves the ink

chart.rowSeries() returns the rows a histogram bin, box or violin stands for, so the summary and its observations are two views of one dataset. It returns null when the current type has no row source.

chart.updateOptions({
  chart: { type: 'unit' },
  series: chart.rowSeries()
})

The morph no longer crossfades. A mark is cut into one cell per object, along its own silhouette rather than its bounding box (a wedge along its curve), and every cell flies to its target. Any two mark families now pair, except a dot cluster against a partition. Treemap and sunburst pair at every level, and a box plot unfolds into its violin and folds back.

Treemap and Sunburst Morph

The unit chart type needs a Premium licence or above; without one it renders in full with a trial watermark. See Morphing between chart types.

Other fixes

  • An exported SVG or PNG now carries its fonts, images and patterns inline.
  • A tooltip.intersect tooltip on a pie, donut or polar area slice lands on the slice in charts wider than they are tall.
  • Changing type through updateOptions({ chart: { type } }) re-chooses the new type's reading, tooltip and hit-testing defaults, so a box plot turned violin no longer throws on hover. Options you set yourself are never re-chosen.
  • Line and area drilldown works with a real click: each drillable point gets its own marker.
  • The hover hit-test and bar centres measure from the right origin, so the tooltip no longer captions the neighbouring bar (#5272, thanks @lazerg).
  • Datetime gridlines outside the plot are skipped instead of drawn on the axis (#5273).
  • An annotation label's background box is fixed (#5270, thanks @mrash).
  • xaxis.labels.style.fontSize: 'inherit' no longer yields NaN (#5064, thanks @waterWang).
  • A legend toggle no longer re-bins a histogram's counts, and a hidden polar area series gives its slot back.

The full list is in the 6.9.0 GitHub release, and every change is in the v6.8.0...v6.9.0 diff.

Upgrading

npm install apexcharts@6.9.0

Or with a script tag:

<script src="https://cdnjs.cloudflare.com/ajax/libs/apexcharts/6.9.0/apexcharts.min.js"></script>
  1. Check pie and donut charts against the new selection and hover.
  2. Remove any workaround for the old grouped stacked totals.

The React, Vue and Angular wrappers work unchanged. Apart from the Premium unit chart, everything in this post is covered by the Community License, free under $2M in annual revenue, budget or funding. See pricing and the license.

Frequently asked questions

Will upgrading to ApexCharts 6.9 break my charts?

No API was renamed or removed. A clicked pie or donut slice now slides out rather than darkening, and grouped stacked bars carry one total per group. Set `plotOptions.pie.expandOffset: 0` to keep a clicked slice in place. The grouped totals have no switch, because the old labels summed the whole chart.

How does the ApexCharts histogram choose its bins?

`plotOptions.histogram.bins` takes a rule name or a fixed count. `'auto'` takes the narrower of Freedman-Diaconis and Sturges, falling back to Sturges when the IQR is 0. Set `binWidth` instead when the boundaries carry meaning, such as decades or 5-minute buckets.

Do I still have to compute quartiles for an ApexCharts box plot?

No. From 6.9 a datum can supply `points`, an array of raw observations, instead of a five-number `y`, and the library works out the summary. Violin does the same for its kernel density. Charts that already pass a summary keep rendering it untouched.

Does ApexCharts 6.9 add a dependency?

Yes. It now requires `apex-commons` (^0.5.0) at runtime, which carries the licence manager, the crossfilter engine and the spring primitives the unit chart uses. npm installs it for you and the browser bundles inline it, so neither script-tag nor bundler users need to do anything.