BubbleSeries.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. /* *
  2. *
  3. * (c) 2010-2021 Torstein Honsi
  4. *
  5. * License: www.highcharts.com/license
  6. *
  7. * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
  8. *
  9. * */
  10. 'use strict';
  11. var __extends = (this && this.__extends) || (function () {
  12. var extendStatics = function (d, b) {
  13. extendStatics = Object.setPrototypeOf ||
  14. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  15. function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
  16. return extendStatics(d, b);
  17. };
  18. return function (d, b) {
  19. extendStatics(d, b);
  20. function __() { this.constructor = d; }
  21. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  22. };
  23. })();
  24. import Axis from '../../Core/Axis/Axis.js';
  25. import BubblePoint from './BubblePoint.js';
  26. import Color from '../../Core/Color/Color.js';
  27. var color = Color.parse;
  28. import H from '../../Core/Globals.js';
  29. var noop = H.noop;
  30. import Series from '../../Core/Series/Series.js';
  31. import SeriesRegistry from '../../Core/Series/SeriesRegistry.js';
  32. var _a = SeriesRegistry.seriesTypes, ColumnSeries = _a.column, ScatterSeries = _a.scatter;
  33. import U from '../../Core/Utilities.js';
  34. var arrayMax = U.arrayMax, arrayMin = U.arrayMin, clamp = U.clamp, extend = U.extend, isNumber = U.isNumber, merge = U.merge, pick = U.pick, pInt = U.pInt;
  35. import '../Column/ColumnSeries.js';
  36. import '../Scatter/ScatterSeries.js';
  37. import './BubbleLegend.js';
  38. /* *
  39. *
  40. * Class
  41. *
  42. * */
  43. var BubbleSeries = /** @class */ (function (_super) {
  44. __extends(BubbleSeries, _super);
  45. function BubbleSeries() {
  46. /* *
  47. *
  48. * Static Properties
  49. *
  50. * */
  51. var _this = _super !== null && _super.apply(this, arguments) || this;
  52. /* *
  53. *
  54. * Properties
  55. *
  56. * */
  57. _this.data = void 0;
  58. _this.maxPxSize = void 0;
  59. _this.minPxSize = void 0;
  60. _this.options = void 0;
  61. _this.points = void 0;
  62. _this.radii = void 0;
  63. _this.yData = void 0;
  64. _this.zData = void 0;
  65. return _this;
  66. /* eslint-enable valid-jsdoc */
  67. }
  68. /* *
  69. *
  70. * Functions
  71. *
  72. * */
  73. /* eslint-disable valid-jsdoc */
  74. /**
  75. * Perform animation on the bubbles
  76. * @private
  77. */
  78. BubbleSeries.prototype.animate = function (init) {
  79. if (!init &&
  80. this.points.length < this.options.animationLimit // #8099
  81. ) {
  82. this.points.forEach(function (point) {
  83. var graphic = point.graphic;
  84. if (graphic && graphic.width) { // URL symbols don't have width
  85. // Start values
  86. if (!this.hasRendered) {
  87. graphic.attr({
  88. x: point.plotX,
  89. y: point.plotY,
  90. width: 1,
  91. height: 1
  92. });
  93. }
  94. // Run animation
  95. graphic.animate(this.markerAttribs(point), this.options.animation);
  96. }
  97. }, this);
  98. }
  99. };
  100. /**
  101. * Get the radius for each point based on the minSize, maxSize and each
  102. * point's Z value. This must be done prior to Series.translate because
  103. * the axis needs to add padding in accordance with the point sizes.
  104. * @private
  105. */
  106. BubbleSeries.prototype.getRadii = function (zMin, zMax, series) {
  107. var len, i, zData = this.zData, yData = this.yData, minSize = series.minPxSize, maxSize = series.maxPxSize, radii = [], value;
  108. // Set the shape type and arguments to be picked up in drawPoints
  109. for (i = 0, len = zData.length; i < len; i++) {
  110. value = zData[i];
  111. // Separate method to get individual radius for bubbleLegend
  112. radii.push(this.getRadius(zMin, zMax, minSize, maxSize, value, yData[i]));
  113. }
  114. this.radii = radii;
  115. };
  116. /**
  117. * Get the individual radius for one point.
  118. * @private
  119. */
  120. BubbleSeries.prototype.getRadius = function (zMin, zMax, minSize, maxSize, value, yValue) {
  121. var options = this.options, sizeByArea = options.sizeBy !== 'width', zThreshold = options.zThreshold, zRange = zMax - zMin, pos = 0.5;
  122. // #8608 - bubble should be visible when z is undefined
  123. if (yValue === null || value === null) {
  124. return null;
  125. }
  126. if (isNumber(value)) {
  127. // When sizing by threshold, the absolute value of z determines
  128. // the size of the bubble.
  129. if (options.sizeByAbsoluteValue) {
  130. value = Math.abs(value - zThreshold);
  131. zMax = zRange = Math.max(zMax - zThreshold, Math.abs(zMin - zThreshold));
  132. zMin = 0;
  133. }
  134. // Issue #4419 - if value is less than zMin, push a radius that's
  135. // always smaller than the minimum size
  136. if (value < zMin) {
  137. return minSize / 2 - 1;
  138. }
  139. // Relative size, a number between 0 and 1
  140. if (zRange > 0) {
  141. pos = (value - zMin) / zRange;
  142. }
  143. }
  144. if (sizeByArea && pos >= 0) {
  145. pos = Math.sqrt(pos);
  146. }
  147. return Math.ceil(minSize + pos * (maxSize - minSize)) / 2;
  148. };
  149. /**
  150. * Define hasData function for non-cartesian series.
  151. * Returns true if the series has points at all.
  152. * @private
  153. */
  154. BubbleSeries.prototype.hasData = function () {
  155. return !!this.processedXData.length; // != 0
  156. };
  157. /**
  158. * @private
  159. */
  160. BubbleSeries.prototype.pointAttribs = function (point, state) {
  161. var markerOptions = this.options.marker, fillOpacity = markerOptions.fillOpacity, attr = Series.prototype.pointAttribs.call(this, point, state);
  162. if (fillOpacity !== 1) {
  163. attr.fill = color(attr.fill)
  164. .setOpacity(fillOpacity)
  165. .get('rgba');
  166. }
  167. return attr;
  168. };
  169. /**
  170. * Extend the base translate method to handle bubble size
  171. * @private
  172. */
  173. BubbleSeries.prototype.translate = function () {
  174. var i, data = this.data, point, radius, radii = this.radii;
  175. // Run the parent method
  176. _super.prototype.translate.call(this);
  177. // Set the shape type and arguments to be picked up in drawPoints
  178. i = data.length;
  179. while (i--) {
  180. point = data[i];
  181. radius = radii ? radii[i] : 0; // #1737
  182. if (isNumber(radius) && radius >= this.minPxSize / 2) {
  183. // Shape arguments
  184. point.marker = extend(point.marker, {
  185. radius: radius,
  186. width: 2 * radius,
  187. height: 2 * radius
  188. });
  189. // Alignment box for the data label
  190. point.dlBox = {
  191. x: point.plotX - radius,
  192. y: point.plotY - radius,
  193. width: 2 * radius,
  194. height: 2 * radius
  195. };
  196. }
  197. else { // below zThreshold
  198. // #1691
  199. point.shapeArgs = point.plotY = point.dlBox = void 0;
  200. }
  201. }
  202. };
  203. /**
  204. * A bubble series is a three dimensional series type where each point
  205. * renders an X, Y and Z value. Each points is drawn as a bubble where the
  206. * position along the X and Y axes mark the X and Y values, and the size of
  207. * the bubble relates to the Z value.
  208. *
  209. * @sample {highcharts} highcharts/demo/bubble/
  210. * Bubble chart
  211. *
  212. * @extends plotOptions.scatter
  213. * @excluding cluster
  214. * @product highcharts highstock
  215. * @requires highcharts-more
  216. * @optionparent plotOptions.bubble
  217. */
  218. BubbleSeries.defaultOptions = merge(ScatterSeries.defaultOptions, {
  219. dataLabels: {
  220. formatter: function () {
  221. return this.point.z;
  222. },
  223. inside: true,
  224. verticalAlign: 'middle'
  225. },
  226. /**
  227. * If there are more points in the series than the `animationLimit`, the
  228. * animation won't run. Animation affects overall performance and
  229. * doesn't work well with heavy data series.
  230. *
  231. * @since 6.1.0
  232. */
  233. animationLimit: 250,
  234. /**
  235. * Whether to display negative sized bubbles. The threshold is given
  236. * by the [zThreshold](#plotOptions.bubble.zThreshold) option, and negative
  237. * bubbles can be visualized by setting
  238. * [negativeColor](#plotOptions.bubble.negativeColor).
  239. *
  240. * @sample {highcharts} highcharts/plotoptions/bubble-negative/
  241. * Negative bubbles
  242. *
  243. * @type {boolean}
  244. * @default true
  245. * @since 3.0
  246. * @apioption plotOptions.bubble.displayNegative
  247. */
  248. /**
  249. * @extends plotOptions.series.marker
  250. * @excluding enabled, enabledThreshold, height, radius, width
  251. */
  252. marker: {
  253. lineColor: null,
  254. lineWidth: 1,
  255. /**
  256. * The fill opacity of the bubble markers.
  257. */
  258. fillOpacity: 0.5,
  259. /**
  260. * In bubble charts, the radius is overridden and determined based
  261. * on the point's data value.
  262. *
  263. * @ignore-option
  264. */
  265. radius: null,
  266. states: {
  267. hover: {
  268. radiusPlus: 0
  269. }
  270. },
  271. /**
  272. * A predefined shape or symbol for the marker. Possible values are
  273. * "circle", "square", "diamond", "triangle" and "triangle-down".
  274. *
  275. * Additionally, the URL to a graphic can be given on the form
  276. * `url(graphic.png)`. Note that for the image to be applied to
  277. * exported charts, its URL needs to be accessible by the export
  278. * server.
  279. *
  280. * Custom callbacks for symbol path generation can also be added to
  281. * `Highcharts.SVGRenderer.prototype.symbols`. The callback is then
  282. * used by its method name, as shown in the demo.
  283. *
  284. * @sample {highcharts} highcharts/plotoptions/bubble-symbol/
  285. * Bubble chart with various symbols
  286. * @sample {highcharts} highcharts/plotoptions/series-marker-symbol/
  287. * General chart with predefined, graphic and custom markers
  288. *
  289. * @type {Highcharts.SymbolKeyValue|string}
  290. * @since 5.0.11
  291. */
  292. symbol: 'circle'
  293. },
  294. /**
  295. * Minimum bubble size. Bubbles will automatically size between the
  296. * `minSize` and `maxSize` to reflect the `z` value of each bubble.
  297. * Can be either pixels (when no unit is given), or a percentage of
  298. * the smallest one of the plot width and height.
  299. *
  300. * @sample {highcharts} highcharts/plotoptions/bubble-size/
  301. * Bubble size
  302. *
  303. * @type {number|string}
  304. * @since 3.0
  305. * @product highcharts highstock
  306. */
  307. minSize: 8,
  308. /**
  309. * Maximum bubble size. Bubbles will automatically size between the
  310. * `minSize` and `maxSize` to reflect the `z` value of each bubble.
  311. * Can be either pixels (when no unit is given), or a percentage of
  312. * the smallest one of the plot width and height.
  313. *
  314. * @sample {highcharts} highcharts/plotoptions/bubble-size/
  315. * Bubble size
  316. *
  317. * @type {number|string}
  318. * @since 3.0
  319. * @product highcharts highstock
  320. */
  321. maxSize: '20%',
  322. /**
  323. * When a point's Z value is below the
  324. * [zThreshold](#plotOptions.bubble.zThreshold)
  325. * setting, this color is used.
  326. *
  327. * @sample {highcharts} highcharts/plotoptions/bubble-negative/
  328. * Negative bubbles
  329. *
  330. * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}
  331. * @since 3.0
  332. * @product highcharts
  333. * @apioption plotOptions.bubble.negativeColor
  334. */
  335. /**
  336. * Whether the bubble's value should be represented by the area or the
  337. * width of the bubble. The default, `area`, corresponds best to the
  338. * human perception of the size of each bubble.
  339. *
  340. * @sample {highcharts} highcharts/plotoptions/bubble-sizeby/
  341. * Comparison of area and size
  342. *
  343. * @type {Highcharts.BubbleSizeByValue}
  344. * @default area
  345. * @since 3.0.7
  346. * @apioption plotOptions.bubble.sizeBy
  347. */
  348. /**
  349. * When this is true, the absolute value of z determines the size of
  350. * the bubble. This means that with the default `zThreshold` of 0, a
  351. * bubble of value -1 will have the same size as a bubble of value 1,
  352. * while a bubble of value 0 will have a smaller size according to
  353. * `minSize`.
  354. *
  355. * @sample {highcharts} highcharts/plotoptions/bubble-sizebyabsolutevalue/
  356. * Size by absolute value, various thresholds
  357. *
  358. * @type {boolean}
  359. * @default false
  360. * @since 4.1.9
  361. * @product highcharts
  362. * @apioption plotOptions.bubble.sizeByAbsoluteValue
  363. */
  364. /**
  365. * When this is true, the series will not cause the Y axis to cross
  366. * the zero plane (or [threshold](#plotOptions.series.threshold) option)
  367. * unless the data actually crosses the plane.
  368. *
  369. * For example, if `softThreshold` is `false`, a series of 0, 1, 2,
  370. * 3 will make the Y axis show negative values according to the
  371. * `minPadding` option. If `softThreshold` is `true`, the Y axis starts
  372. * at 0.
  373. *
  374. * @since 4.1.9
  375. * @product highcharts
  376. */
  377. softThreshold: false,
  378. states: {
  379. hover: {
  380. halo: {
  381. size: 5
  382. }
  383. }
  384. },
  385. tooltip: {
  386. pointFormat: '({point.x}, {point.y}), Size: {point.z}'
  387. },
  388. turboThreshold: 0,
  389. /**
  390. * The minimum for the Z value range. Defaults to the highest Z value
  391. * in the data.
  392. *
  393. * @see [zMin](#plotOptions.bubble.zMin)
  394. *
  395. * @sample {highcharts} highcharts/plotoptions/bubble-zmin-zmax/
  396. * Z has a possible range of 0-100
  397. *
  398. * @type {number}
  399. * @since 4.0.3
  400. * @product highcharts
  401. * @apioption plotOptions.bubble.zMax
  402. */
  403. /**
  404. * @default z
  405. * @apioption plotOptions.bubble.colorKey
  406. */
  407. /**
  408. * The minimum for the Z value range. Defaults to the lowest Z value
  409. * in the data.
  410. *
  411. * @see [zMax](#plotOptions.bubble.zMax)
  412. *
  413. * @sample {highcharts} highcharts/plotoptions/bubble-zmin-zmax/
  414. * Z has a possible range of 0-100
  415. *
  416. * @type {number}
  417. * @since 4.0.3
  418. * @product highcharts
  419. * @apioption plotOptions.bubble.zMin
  420. */
  421. /**
  422. * When [displayNegative](#plotOptions.bubble.displayNegative) is `false`,
  423. * bubbles with lower Z values are skipped. When `displayNegative`
  424. * is `true` and a [negativeColor](#plotOptions.bubble.negativeColor)
  425. * is given, points with lower Z is colored.
  426. *
  427. * @sample {highcharts} highcharts/plotoptions/bubble-negative/
  428. * Negative bubbles
  429. *
  430. * @since 3.0
  431. * @product highcharts
  432. */
  433. zThreshold: 0,
  434. zoneAxis: 'z'
  435. });
  436. return BubbleSeries;
  437. }(ScatterSeries));
  438. extend(BubbleSeries.prototype, {
  439. alignDataLabel: ColumnSeries.prototype.alignDataLabel,
  440. applyZones: noop,
  441. bubblePadding: true,
  442. buildKDTree: noop,
  443. directTouch: true,
  444. isBubble: true,
  445. pointArrayMap: ['y', 'z'],
  446. pointClass: BubblePoint,
  447. parallelArrays: ['x', 'y', 'z'],
  448. trackerGroups: ['group', 'dataLabelsGroup'],
  449. specialGroup: 'group',
  450. zoneAxis: 'z'
  451. });
  452. /* *
  453. *
  454. * Axis ?
  455. *
  456. * */
  457. // Add logic to pad each axis with the amount of pixels necessary to avoid the
  458. // bubbles to overflow.
  459. Axis.prototype.beforePadding = function () {
  460. var axis = this, axisLength = this.len, chart = this.chart, pxMin = 0, pxMax = axisLength, isXAxis = this.isXAxis, dataKey = isXAxis ? 'xData' : 'yData', min = this.min, extremes = {}, smallestSize = Math.min(chart.plotWidth, chart.plotHeight), zMin = Number.MAX_VALUE, zMax = -Number.MAX_VALUE, range = this.max - min, transA = axisLength / range, activeSeries = [];
  461. // Handle padding on the second pass, or on redraw
  462. this.series.forEach(function (series) {
  463. var seriesOptions = series.options, zData;
  464. if (series.bubblePadding &&
  465. (series.visible || !chart.options.chart.ignoreHiddenSeries)) {
  466. // Correction for #1673
  467. axis.allowZoomOutside = true;
  468. // Cache it
  469. activeSeries.push(series);
  470. if (isXAxis) { // because X axis is evaluated first
  471. // For each series, translate the size extremes to pixel values
  472. ['minSize', 'maxSize'].forEach(function (prop) {
  473. var length = seriesOptions[prop], isPercent = /%$/.test(length);
  474. length = pInt(length);
  475. extremes[prop] = isPercent ?
  476. smallestSize * length / 100 :
  477. length;
  478. });
  479. series.minPxSize = extremes.minSize;
  480. // Prioritize min size if conflict to make sure bubbles are
  481. // always visible. #5873
  482. series.maxPxSize = Math.max(extremes.maxSize, extremes.minSize);
  483. // Find the min and max Z
  484. zData = series.zData.filter(isNumber);
  485. if (zData.length) { // #1735
  486. zMin = pick(seriesOptions.zMin, clamp(arrayMin(zData), seriesOptions.displayNegative === false ?
  487. seriesOptions.zThreshold :
  488. -Number.MAX_VALUE, zMin));
  489. zMax = pick(seriesOptions.zMax, Math.max(zMax, arrayMax(zData)));
  490. }
  491. }
  492. }
  493. });
  494. activeSeries.forEach(function (series) {
  495. var data = series[dataKey], i = data.length, radius;
  496. if (isXAxis) {
  497. series.getRadii(zMin, zMax, series);
  498. }
  499. if (range > 0) {
  500. while (i--) {
  501. if (isNumber(data[i]) &&
  502. axis.dataMin <= data[i] &&
  503. data[i] <= axis.max) {
  504. radius = series.radii ? series.radii[i] : 0;
  505. pxMin = Math.min(((data[i] - min) * transA) - radius, pxMin);
  506. pxMax = Math.max(((data[i] - min) * transA) + radius, pxMax);
  507. }
  508. }
  509. }
  510. });
  511. // Apply the padding to the min and max properties
  512. if (activeSeries.length && range > 0 && !this.logarithmic) {
  513. pxMax -= axisLength;
  514. transA *= (axisLength +
  515. Math.max(0, pxMin) - // #8901
  516. Math.min(pxMax, axisLength)) / axisLength;
  517. [
  518. ['min', 'userMin', pxMin],
  519. ['max', 'userMax', pxMax]
  520. ].forEach(function (keys) {
  521. if (typeof pick(axis.options[keys[0]], axis[keys[1]]) === 'undefined') {
  522. axis[keys[0]] += keys[2] / transA;
  523. }
  524. });
  525. }
  526. /* eslint-enable valid-jsdoc */
  527. };
  528. SeriesRegistry.registerSeriesType('bubble', BubbleSeries);
  529. /* *
  530. *
  531. * Default Export
  532. *
  533. * */
  534. export default BubbleSeries;
  535. /* *
  536. *
  537. * API Declarations
  538. *
  539. * */
  540. /**
  541. * @typedef {"area"|"width"} Highcharts.BubbleSizeByValue
  542. */
  543. ''; // detach doclets above
  544. /* *
  545. *
  546. * API Options
  547. *
  548. * */
  549. /**
  550. * A `bubble` series. If the [type](#series.bubble.type) option is
  551. * not specified, it is inherited from [chart.type](#chart.type).
  552. *
  553. * @extends series,plotOptions.bubble
  554. * @excluding dataParser, dataURL, stack
  555. * @product highcharts highstock
  556. * @requires highcharts-more
  557. * @apioption series.bubble
  558. */
  559. /**
  560. * An array of data points for the series. For the `bubble` series type,
  561. * points can be given in the following ways:
  562. *
  563. * 1. An array of arrays with 3 or 2 values. In this case, the values correspond
  564. * to `x,y,z`. If the first value is a string, it is applied as the name of
  565. * the point, and the `x` value is inferred. The `x` value can also be
  566. * omitted, in which case the inner arrays should be of length 2\. Then the
  567. * `x` value is automatically calculated, either starting at 0 and
  568. * incremented by 1, or from `pointStart` and `pointInterval` given in the
  569. * series options.
  570. * ```js
  571. * data: [
  572. * [0, 1, 2],
  573. * [1, 5, 5],
  574. * [2, 0, 2]
  575. * ]
  576. * ```
  577. *
  578. * 2. An array of objects with named values. The following snippet shows only a
  579. * few settings, see the complete options set below. If the total number of
  580. * data points exceeds the series'
  581. * [turboThreshold](#series.bubble.turboThreshold), this option is not
  582. * available.
  583. * ```js
  584. * data: [{
  585. * x: 1,
  586. * y: 1,
  587. * z: 1,
  588. * name: "Point2",
  589. * color: "#00FF00"
  590. * }, {
  591. * x: 1,
  592. * y: 5,
  593. * z: 4,
  594. * name: "Point1",
  595. * color: "#FF00FF"
  596. * }]
  597. * ```
  598. *
  599. * @sample {highcharts} highcharts/series/data-array-of-arrays/
  600. * Arrays of numeric x and y
  601. * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/
  602. * Arrays of datetime x and y
  603. * @sample {highcharts} highcharts/series/data-array-of-name-value/
  604. * Arrays of point.name and y
  605. * @sample {highcharts} highcharts/series/data-array-of-objects/
  606. * Config objects
  607. *
  608. * @type {Array<Array<(number|string),number>|Array<(number|string),number,number>|*>}
  609. * @extends series.line.data
  610. * @product highcharts
  611. * @apioption series.bubble.data
  612. */
  613. /**
  614. * @extends series.line.data.marker
  615. * @excluding enabledThreshold, height, radius, width
  616. * @product highcharts
  617. * @apioption series.bubble.data.marker
  618. */
  619. /**
  620. * The size value for each bubble. The bubbles' diameters are computed
  621. * based on the `z`, and controlled by series options like `minSize`,
  622. * `maxSize`, `sizeBy`, `zMin` and `zMax`.
  623. *
  624. * @type {number|null}
  625. * @product highcharts
  626. * @apioption series.bubble.data.z
  627. */
  628. /**
  629. * @excluding enabled, enabledThreshold, height, radius, width
  630. * @apioption series.bubble.marker
  631. */
  632. ''; // adds doclets above to transpiled file