632 lines
27 KiB
JavaScript
632 lines
27 KiB
JavaScript
|
/**
|
|||
|
* @license Highcharts JS v11.4.1 (2024-04-04)
|
|||
|
*
|
|||
|
* Arc diagram module
|
|||
|
*
|
|||
|
* (c) 2021 Piotr Madej
|
|||
|
*
|
|||
|
* License: www.highcharts.com/license
|
|||
|
*/
|
|||
|
(function (factory) {
|
|||
|
if (typeof module === 'object' && module.exports) {
|
|||
|
factory['default'] = factory;
|
|||
|
module.exports = factory;
|
|||
|
} else if (typeof define === 'function' && define.amd) {
|
|||
|
define('highcharts/modules/arc-diagram', ['highcharts', 'highcharts/modules/sankey'], function (Highcharts) {
|
|||
|
factory(Highcharts);
|
|||
|
factory.Highcharts = Highcharts;
|
|||
|
return factory;
|
|||
|
});
|
|||
|
} else {
|
|||
|
factory(typeof Highcharts !== 'undefined' ? Highcharts : undefined);
|
|||
|
}
|
|||
|
}(function (Highcharts) {
|
|||
|
'use strict';
|
|||
|
var _modules = Highcharts ? Highcharts._modules : {};
|
|||
|
function _registerModule(obj, path, args, fn) {
|
|||
|
if (!obj.hasOwnProperty(path)) {
|
|||
|
obj[path] = fn.apply(null, args);
|
|||
|
|
|||
|
if (typeof CustomEvent === 'function') {
|
|||
|
window.dispatchEvent(new CustomEvent(
|
|||
|
'HighchartsModuleLoaded',
|
|||
|
{ detail: { path: path, module: obj[path] } }
|
|||
|
));
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
_registerModule(_modules, 'Series/ArcDiagram/ArcDiagramPoint.js', [_modules['Series/NodesComposition.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (NodesComposition, SeriesRegistry, U) {
|
|||
|
/* *
|
|||
|
*
|
|||
|
* Arc diagram module
|
|||
|
*
|
|||
|
* (c) 2018-2024 Torstein Honsi
|
|||
|
*
|
|||
|
* License: www.highcharts.com/license
|
|||
|
*
|
|||
|
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
|||
|
*
|
|||
|
* */
|
|||
|
const { seriesTypes: { sankey: { prototype: { pointClass: SankeyPoint } } } } = SeriesRegistry;
|
|||
|
const { extend } = U;
|
|||
|
/* *
|
|||
|
*
|
|||
|
* Class
|
|||
|
*
|
|||
|
* */
|
|||
|
class ArcDiagramPoint extends SankeyPoint {
|
|||
|
/* *
|
|||
|
*
|
|||
|
* Functions
|
|||
|
*
|
|||
|
* */
|
|||
|
/* eslint-disable valid-jsdoc */
|
|||
|
isValid() {
|
|||
|
// No null points here
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
extend(ArcDiagramPoint.prototype, {
|
|||
|
setState: NodesComposition.setNodeState
|
|||
|
});
|
|||
|
/* *
|
|||
|
*
|
|||
|
* Default Export
|
|||
|
*
|
|||
|
* */
|
|||
|
|
|||
|
return ArcDiagramPoint;
|
|||
|
});
|
|||
|
_registerModule(_modules, 'Series/ArcDiagram/ArcDiagramSeries.js', [_modules['Series/ArcDiagram/ArcDiagramPoint.js'], _modules['Series/Sankey/SankeyColumnComposition.js'], _modules['Core/Series/Series.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Renderer/SVG/SVGRenderer.js'], _modules['Core/Utilities.js']], function (ArcDiagramPoint, SankeyColumnComposition, Series, SeriesRegistry, SVGRenderer, U) {
|
|||
|
/* *
|
|||
|
*
|
|||
|
* Arc diagram module
|
|||
|
*
|
|||
|
* (c) 2021 Piotr Madej, Grzegorz Blachliński
|
|||
|
*
|
|||
|
* License: www.highcharts.com/license
|
|||
|
*
|
|||
|
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
|||
|
*
|
|||
|
* */
|
|||
|
const { prototype: { symbols } } = SVGRenderer;
|
|||
|
const { seriesTypes: { column: ColumnSeries, sankey: SankeySeries } } = SeriesRegistry;
|
|||
|
const { extend, merge, pick, relativeLength } = U;
|
|||
|
/* *
|
|||
|
*
|
|||
|
* Class
|
|||
|
*
|
|||
|
* */
|
|||
|
/**
|
|||
|
* @private
|
|||
|
* @class
|
|||
|
* @name Highcharts.seriesTypes.arcdiagram
|
|||
|
*
|
|||
|
* @augments Highcharts.seriesTypes.sankey
|
|||
|
*/
|
|||
|
class ArcDiagramSeries extends SankeySeries {
|
|||
|
/* *
|
|||
|
*
|
|||
|
* Functions
|
|||
|
*
|
|||
|
* */
|
|||
|
/**
|
|||
|
* Create node columns by analyzing the nodes and the relations between
|
|||
|
* incoming and outgoing links.
|
|||
|
* @private
|
|||
|
*/
|
|||
|
createNodeColumns() {
|
|||
|
const series = this, chart = series.chart,
|
|||
|
// Column needs casting, to much methods required at the same time
|
|||
|
column = SankeyColumnComposition.compose([], series);
|
|||
|
column.sankeyColumn.maxLength = chart.inverted ?
|
|||
|
chart.plotHeight : chart.plotWidth;
|
|||
|
// Get the translation factor needed for each column to fill up the plot
|
|||
|
// height
|
|||
|
column.sankeyColumn.getTranslationFactor = (series) => {
|
|||
|
const nodes = column.slice(), minLinkWidth = this.options.minLinkWidth || 0;
|
|||
|
let skipPoint, factor = 0, i, radius, maxRadius = 0, scale = 1, additionalSpace = 0, remainingWidth = (chart.plotSizeX || 0) -
|
|||
|
(series.options.marker &&
|
|||
|
series.options.marker.lineWidth || 0) -
|
|||
|
(column.length - 1) *
|
|||
|
series.nodePadding;
|
|||
|
// Because the minLinkWidth option doesn't obey the direct
|
|||
|
// translation, we need to run translation iteratively, check node
|
|||
|
// heights, remove those nodes affected by minLinkWidth, check
|
|||
|
// again, etc.
|
|||
|
while (column.length) {
|
|||
|
factor = remainingWidth / column.sankeyColumn.sum();
|
|||
|
skipPoint = false;
|
|||
|
i = column.length;
|
|||
|
while (i--) {
|
|||
|
radius = (column[i].getSum()) * factor * scale;
|
|||
|
const plotArea = Math.min(chart.plotHeight, chart.plotWidth);
|
|||
|
if (radius > plotArea) {
|
|||
|
scale = Math.min(plotArea / radius, scale);
|
|||
|
}
|
|||
|
else if (radius < minLinkWidth) {
|
|||
|
column.splice(i, 1);
|
|||
|
remainingWidth -= minLinkWidth;
|
|||
|
radius = minLinkWidth;
|
|||
|
skipPoint = true;
|
|||
|
}
|
|||
|
additionalSpace += radius * (1 - scale) / 2;
|
|||
|
maxRadius = Math.max(maxRadius, radius);
|
|||
|
}
|
|||
|
if (!skipPoint) {
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
// Re-insert original nodes
|
|||
|
column.length = 0;
|
|||
|
nodes.forEach((node) => {
|
|||
|
node.scale = scale;
|
|||
|
column.push(node);
|
|||
|
});
|
|||
|
column.sankeyColumn.maxRadius = maxRadius;
|
|||
|
column.sankeyColumn.scale = scale;
|
|||
|
column.sankeyColumn.additionalSpace = additionalSpace;
|
|||
|
return factor;
|
|||
|
};
|
|||
|
column.sankeyColumn.offset = function (node, factor) {
|
|||
|
const equalNodes = node.series.options.equalNodes, nodePadding = series.nodePadding, maxRadius = Math.min(chart.plotWidth, chart.plotHeight, (column.sankeyColumn.maxLength || 0) /
|
|||
|
series.nodes.length - nodePadding);
|
|||
|
let offset = column.sankeyColumn.additionalSpace || 0, totalNodeOffset;
|
|||
|
for (let i = 0; i < column.length; i++) {
|
|||
|
const sum = column[i].getSum() *
|
|||
|
(column.sankeyColumn.scale || 0);
|
|||
|
const width = equalNodes ?
|
|||
|
maxRadius :
|
|||
|
Math.max(sum * factor, series.options.minLinkWidth || 0);
|
|||
|
if (sum) {
|
|||
|
totalNodeOffset = width + nodePadding;
|
|||
|
}
|
|||
|
else {
|
|||
|
// If node sum equals 0 nodePadding is missed #12453
|
|||
|
totalNodeOffset = 0;
|
|||
|
}
|
|||
|
if (column[i] === node) {
|
|||
|
return {
|
|||
|
relativeLeft: offset + relativeLength(node.options.offset || 0, totalNodeOffset)
|
|||
|
};
|
|||
|
}
|
|||
|
offset += totalNodeOffset;
|
|||
|
}
|
|||
|
};
|
|||
|
// Add nodes directly to the column right after it's creation
|
|||
|
series.nodes.forEach(function (node) {
|
|||
|
node.column = 0;
|
|||
|
column.push(node);
|
|||
|
});
|
|||
|
return [column];
|
|||
|
}
|
|||
|
/**
|
|||
|
* Run translation operations for one link.
|
|||
|
* @private
|
|||
|
*/
|
|||
|
translateLink(point) {
|
|||
|
const series = this, fromNode = point.fromNode, toNode = point.toNode, chart = this.chart, translationFactor = series.translationFactor, pointOptions = point.options, seriesOptions = series.options, linkWeight = pick(pointOptions.linkWeight, seriesOptions.linkWeight, Math.max((point.weight || 0) *
|
|||
|
translationFactor *
|
|||
|
fromNode.scale, (series.options.minLinkWidth || 0))), centeredLinks = point.series.options.centeredLinks, nodeTop = fromNode.nodeY;
|
|||
|
const getX = (node, fromOrTo) => {
|
|||
|
const linkLeft = ((node.offset(point, fromOrTo) || 0) *
|
|||
|
translationFactor);
|
|||
|
const x = Math.min(node.nodeX + linkLeft,
|
|||
|
// Prevent links from spilling below the node (#12014)
|
|||
|
node.nodeX + (node.shapeArgs && node.shapeArgs.height || 0) - linkWeight);
|
|||
|
return x;
|
|||
|
};
|
|||
|
let fromX = centeredLinks ?
|
|||
|
fromNode.nodeX +
|
|||
|
((fromNode.shapeArgs.height || 0) - linkWeight) / 2 :
|
|||
|
getX(fromNode, 'linksFrom'), toX = centeredLinks ? toNode.nodeX +
|
|||
|
((toNode.shapeArgs.height || 0) - linkWeight) / 2 :
|
|||
|
getX(toNode, 'linksTo'), bottom = nodeTop;
|
|||
|
if (fromX > toX) {
|
|||
|
[fromX, toX] = [toX, fromX];
|
|||
|
}
|
|||
|
if (seriesOptions.reversed) {
|
|||
|
[fromX, toX] = [toX, fromX];
|
|||
|
bottom = (chart.plotSizeY || 0) - bottom;
|
|||
|
}
|
|||
|
point.shapeType = 'path';
|
|||
|
point.linkBase = [
|
|||
|
fromX,
|
|||
|
fromX + linkWeight,
|
|||
|
toX,
|
|||
|
toX + linkWeight
|
|||
|
];
|
|||
|
const linkRadius = ((toX + linkWeight - fromX) / Math.abs(toX + linkWeight - fromX)) * pick(seriesOptions.linkRadius, Math.min(Math.abs(toX + linkWeight - fromX) / 2, fromNode.nodeY - Math.abs(linkWeight)));
|
|||
|
point.shapeArgs = {
|
|||
|
d: [
|
|||
|
['M', fromX, bottom],
|
|||
|
[
|
|||
|
'A',
|
|||
|
(toX + linkWeight - fromX) / 2,
|
|||
|
linkRadius,
|
|||
|
0,
|
|||
|
0,
|
|||
|
1,
|
|||
|
toX + linkWeight,
|
|||
|
bottom
|
|||
|
],
|
|||
|
['L', toX, bottom],
|
|||
|
[
|
|||
|
'A',
|
|||
|
(toX - fromX - linkWeight) / 2,
|
|||
|
linkRadius - linkWeight,
|
|||
|
0,
|
|||
|
0,
|
|||
|
0,
|
|||
|
fromX + linkWeight,
|
|||
|
bottom
|
|||
|
],
|
|||
|
['Z']
|
|||
|
]
|
|||
|
};
|
|||
|
point.dlBox = {
|
|||
|
x: fromX + (toX - fromX) / 2,
|
|||
|
y: bottom - linkRadius,
|
|||
|
height: linkWeight,
|
|||
|
width: 0
|
|||
|
};
|
|||
|
// And set the tooltip anchor in the middle
|
|||
|
point.tooltipPos = chart.inverted ? [
|
|||
|
(chart.plotSizeY || 0) - point.dlBox.y - linkWeight / 2,
|
|||
|
(chart.plotSizeX || 0) - point.dlBox.x
|
|||
|
] : [
|
|||
|
point.dlBox.x,
|
|||
|
point.dlBox.y + linkWeight / 2
|
|||
|
];
|
|||
|
// Pass test in drawPoints
|
|||
|
point.y = point.plotY = 1;
|
|||
|
point.x = point.plotX = 1;
|
|||
|
if (!point.color) {
|
|||
|
point.color = fromNode.color;
|
|||
|
}
|
|||
|
}
|
|||
|
/**
|
|||
|
* Run translation operations for one node.
|
|||
|
* @private
|
|||
|
*/
|
|||
|
translateNode(node, column) {
|
|||
|
const series = this, translationFactor = series.translationFactor, chart = series.chart, maxNodesLength = chart.inverted ?
|
|||
|
chart.plotWidth : chart.plotHeight, options = series.options, maxRadius = Math.min(chart.plotWidth, chart.plotHeight, maxNodesLength / node.series.nodes.length - this.nodePadding), sum = node.getSum() * (column.sankeyColumn.scale || 0), equalNodes = options.equalNodes, nodeHeight = equalNodes ?
|
|||
|
maxRadius :
|
|||
|
Math.max(sum * translationFactor, this.options.minLinkWidth || 0), crisp = Math.round(options.marker &&
|
|||
|
options.marker.lineWidth || 0) % 2 / 2, nodeOffset = column.sankeyColumn.offset(node, translationFactor), fromNodeLeft = Math.floor(pick(nodeOffset && nodeOffset.absoluteLeft, ((column.sankeyColumn.left(translationFactor) || 0) +
|
|||
|
(nodeOffset && nodeOffset.relativeLeft || 0)))) + crisp, markerOptions = merge(options.marker, node.options.marker), symbol = markerOptions.symbol, markerRadius = markerOptions.radius, top = parseInt(options.offset, 10) *
|
|||
|
((chart.inverted ?
|
|||
|
chart.plotWidth : chart.plotHeight) - (Math.floor(this.colDistance * (node.column || 0) +
|
|||
|
(markerOptions.lineWidth || 0) / 2) + crisp +
|
|||
|
(column.sankeyColumn.scale || 0) *
|
|||
|
(column.sankeyColumn.maxRadius || 0) / 2)) / 100;
|
|||
|
node.sum = sum;
|
|||
|
// If node sum is 0, don’t render the rect #12453
|
|||
|
if (sum) {
|
|||
|
// Draw the node
|
|||
|
node.nodeX = fromNodeLeft;
|
|||
|
node.nodeY = top;
|
|||
|
const x = fromNodeLeft, width = node.options.width || options.width || nodeHeight, height = node.options.height || options.height || nodeHeight;
|
|||
|
let y = top;
|
|||
|
if (options.reversed) {
|
|||
|
y = (chart.plotSizeY || 0) - top;
|
|||
|
if (chart.inverted) {
|
|||
|
y = (chart.plotSizeY || 0) - top;
|
|||
|
}
|
|||
|
}
|
|||
|
if (this.mapOptionsToLevel) {
|
|||
|
// Calculate data label options for the point
|
|||
|
node.dlOptions = SankeySeries.getDLOptions({
|
|||
|
level: this.mapOptionsToLevel[node.level],
|
|||
|
optionsPoint: node.options
|
|||
|
});
|
|||
|
}
|
|||
|
// Pass test in drawPoints
|
|||
|
node.plotX = 1;
|
|||
|
node.plotY = 1;
|
|||
|
// Set the anchor position for tooltips
|
|||
|
node.tooltipPos = chart.inverted ? [
|
|||
|
(chart.plotSizeY || 0) - y - height / 2,
|
|||
|
(chart.plotSizeX || 0) - x - width / 2
|
|||
|
] : [
|
|||
|
x + width / 2,
|
|||
|
y + height / 2
|
|||
|
];
|
|||
|
node.shapeType = 'path';
|
|||
|
node.shapeArgs = {
|
|||
|
d: symbols[symbol || 'circle'](x, y - (markerRadius || height) / 2, markerRadius || width, markerRadius || height),
|
|||
|
width: markerRadius || width,
|
|||
|
height: markerRadius || height
|
|||
|
};
|
|||
|
node.dlBox = {
|
|||
|
x: x + width / 2,
|
|||
|
y: y,
|
|||
|
height: 0,
|
|||
|
width: 0
|
|||
|
};
|
|||
|
}
|
|||
|
else {
|
|||
|
node.dlOptions = {
|
|||
|
enabled: false
|
|||
|
};
|
|||
|
}
|
|||
|
}
|
|||
|
// Networkgraph has two separate collecions of nodes and lines, render
|
|||
|
// dataLabels for both sets:
|
|||
|
drawDataLabels() {
|
|||
|
if (this.options.dataLabels) {
|
|||
|
const textPath = this.options.dataLabels.textPath;
|
|||
|
// Render node labels:
|
|||
|
ColumnSeries.prototype.drawDataLabels.call(this, this.nodes);
|
|||
|
// Render link labels:
|
|||
|
this.options.dataLabels.textPath =
|
|||
|
this.options.dataLabels.linkTextPath;
|
|||
|
ColumnSeries.prototype.drawDataLabels.call(this, this.data);
|
|||
|
// Restore nodes
|
|||
|
this.options.dataLabels.textPath = textPath;
|
|||
|
}
|
|||
|
}
|
|||
|
pointAttribs(point,
|
|||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|||
|
state) {
|
|||
|
if (point && point.isNode) {
|
|||
|
const { ...attrs } = Series.prototype.pointAttribs
|
|||
|
.apply(this, arguments);
|
|||
|
return attrs;
|
|||
|
}
|
|||
|
return super.pointAttribs.apply(this, arguments);
|
|||
|
}
|
|||
|
markerAttribs(point) {
|
|||
|
if (point.isNode) {
|
|||
|
return super.markerAttribs.apply(this, arguments);
|
|||
|
}
|
|||
|
return {};
|
|||
|
}
|
|||
|
}
|
|||
|
/**
|
|||
|
* Arc diagram series is a chart drawing style in which
|
|||
|
* the vertices of the chart are positioned along a line
|
|||
|
* on the Euclidean plane and the edges are drawn as a semicircle
|
|||
|
* in one of the two half-planes delimited by the line,
|
|||
|
* or as smooth curves formed by sequences of semicircles.
|
|||
|
*
|
|||
|
* @sample highcharts/demo/arc-diagram/
|
|||
|
* Arc Diagram
|
|||
|
*
|
|||
|
* @extends plotOptions.sankey
|
|||
|
* @since 10.0.0
|
|||
|
* @product highcharts
|
|||
|
* @requires modules/arc-diagram
|
|||
|
* @exclude curveFactor, connectEnds, connectNulls, colorAxis, colorKey,
|
|||
|
* dataSorting, dragDrop, getExtremesFromAll, nodeAlignment,
|
|||
|
* nodePadding, centerInCategory, pointInterval,
|
|||
|
* pointIntervalUnit, pointPlacement, pointStart,
|
|||
|
* relativeXValue, softThreshold, stack, stacking, step,
|
|||
|
* xAxis, yAxis
|
|||
|
* @optionparent plotOptions.arcdiagram
|
|||
|
*/
|
|||
|
ArcDiagramSeries.defaultOptions = merge(SankeySeries.defaultOptions, {
|
|||
|
/**
|
|||
|
* The option to center links rather than position them one after
|
|||
|
* another
|
|||
|
*
|
|||
|
* @type {boolean}
|
|||
|
* @since 10.0.0
|
|||
|
* @default false
|
|||
|
* @product highcharts
|
|||
|
*/
|
|||
|
centeredLinks: false,
|
|||
|
/**
|
|||
|
* The radius of the link arc. If not set, series renders a semi-circle
|
|||
|
* between the nodes, except when overflowing the edge of the plot area,
|
|||
|
* in which case an arc touching the edge is rendered. If `linkRadius`
|
|||
|
* is set, an arc extending to the given value is rendered.
|
|||
|
*
|
|||
|
* @type {number}
|
|||
|
* @since 10.0.0
|
|||
|
* @default undefined
|
|||
|
* @product highcharts
|
|||
|
* @apioption series.arcdiagram.linkRadius
|
|||
|
*/
|
|||
|
/**
|
|||
|
* The offset of an arc diagram nodes column in relation to the
|
|||
|
* `plotArea`. The offset equal to 50% places nodes in the center of a
|
|||
|
* chart. By default the series is placed so that the biggest node is
|
|||
|
* touching the bottom border of the `plotArea`.
|
|||
|
*
|
|||
|
* @type {string}
|
|||
|
* @since 10.0.0
|
|||
|
* @default '100%'
|
|||
|
* @product highcharts
|
|||
|
* @apioption series.arcdiagram.offset
|
|||
|
*/
|
|||
|
offset: '100%',
|
|||
|
/**
|
|||
|
* The global link weight, in pixels. If not set, width is calculated
|
|||
|
* per link, depending on the weight value.
|
|||
|
*
|
|||
|
* @sample highcharts/series-arcdiagram/link-weight
|
|||
|
* Link weight
|
|||
|
*
|
|||
|
* @type {number}
|
|||
|
* @since 10.0.0
|
|||
|
* @default undefined
|
|||
|
* @product highcharts
|
|||
|
* @apioption series.arcdiagram.linkWeight
|
|||
|
*/
|
|||
|
/**
|
|||
|
* Whether nodes with different values should have the same size. If set
|
|||
|
* to true, all nodes are calculated based on the `nodePadding` and
|
|||
|
* current `plotArea`. It is possible to override it using the
|
|||
|
* `marker.radius` option.
|
|||
|
*
|
|||
|
* @type {boolean}
|
|||
|
* @since 10.0.0
|
|||
|
* @default false
|
|||
|
* @product highcharts
|
|||
|
*/
|
|||
|
equalNodes: false,
|
|||
|
/**
|
|||
|
* Whether the series should be placed on the other side of the
|
|||
|
* `plotArea`.
|
|||
|
*
|
|||
|
* @type {boolean}
|
|||
|
* @since 10.0.0
|
|||
|
* @default false
|
|||
|
* @product highcharts
|
|||
|
*/
|
|||
|
reversed: false,
|
|||
|
/**
|
|||
|
* Options for the data labels appearing on top of the nodes and links.
|
|||
|
* For arc diagram charts, data labels are visible for the nodes by
|
|||
|
* default, but hidden for links. This is controlled by modifying the
|
|||
|
* `nodeFormat`, and the `format` that applies to links and is an empty
|
|||
|
* string by default.
|
|||
|
*
|
|||
|
* @declare Highcharts.SeriesArcDiagramDataLabelsOptionsObject
|
|||
|
*
|
|||
|
* @private
|
|||
|
*/
|
|||
|
dataLabels: {
|
|||
|
/**
|
|||
|
* Options for a _link_ label text which should follow link
|
|||
|
* connection. Border and background are disabled for a label that
|
|||
|
* follows a path.
|
|||
|
*
|
|||
|
* **Note:** Only SVG-based renderer supports this option. Setting
|
|||
|
* `useHTML` to true will disable this option.
|
|||
|
*
|
|||
|
* @extends plotOptions.networkgraph.dataLabels.linkTextPath
|
|||
|
* @since 10.0.0
|
|||
|
*/
|
|||
|
linkTextPath: {
|
|||
|
/**
|
|||
|
* @type {Highcharts.SVGAttributes}
|
|||
|
* @default {"startOffset":"25%"}
|
|||
|
*/
|
|||
|
attributes: {
|
|||
|
/**
|
|||
|
* @ignore-option
|
|||
|
*/
|
|||
|
startOffset: '25%'
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
/**
|
|||
|
* @extends plotOptions.series.marker
|
|||
|
* @excluding enabled, enabledThreshold, height, width
|
|||
|
*/
|
|||
|
marker: {
|
|||
|
symbol: 'circle',
|
|||
|
fillOpacity: 1,
|
|||
|
lineWidth: 0,
|
|||
|
states: {}
|
|||
|
}
|
|||
|
});
|
|||
|
extend(ArcDiagramSeries.prototype, {
|
|||
|
orderNodes: false
|
|||
|
});
|
|||
|
ArcDiagramSeries.prototype.pointClass = ArcDiagramPoint;
|
|||
|
SeriesRegistry.registerSeriesType('arcdiagram', ArcDiagramSeries);
|
|||
|
/* *
|
|||
|
*
|
|||
|
* Default Export
|
|||
|
*
|
|||
|
* */
|
|||
|
/* *
|
|||
|
*
|
|||
|
* API Options
|
|||
|
*
|
|||
|
* */
|
|||
|
/**
|
|||
|
* An `arcdiagram` series. If the [type](#series.arcdiagram.type)
|
|||
|
* option is not specified, it is inherited from [chart.type](#chart.type).
|
|||
|
*
|
|||
|
* @extends series,plotOptions.arcdiagram
|
|||
|
* @exclude dataSorting, boostThreshold, boostBlending, curveFactor,
|
|||
|
* connectEnds, connectNulls, colorAxis, colorKey, dataSorting,
|
|||
|
* dragDrop, getExtremesFromAll, nodePadding, centerInCategory,
|
|||
|
* pointInterval, pointIntervalUnit, pointPlacement,
|
|||
|
* pointStart, relativeXValue, softThreshold, stack,
|
|||
|
* stacking, step, xAxis, yAxis
|
|||
|
* @product highcharts
|
|||
|
* @requires modules/sankey
|
|||
|
* @requires modules/arc-diagram
|
|||
|
* @apioption series.arcdiagram
|
|||
|
*/
|
|||
|
/**
|
|||
|
* @extends plotOptions.series.marker
|
|||
|
* @excluding enabled, enabledThreshold, height, radius, width
|
|||
|
* @apioption series.arcdiagram.marker
|
|||
|
*/
|
|||
|
/**
|
|||
|
* @type {Highcharts.SeriesArcDiagramDataLabelsOptionsObject|Array<Highcharts.SeriesArcDiagramDataLabelsOptionsObject>}
|
|||
|
* @product highcharts
|
|||
|
* @apioption series.arcdiagram.data.dataLabels
|
|||
|
*/
|
|||
|
/**
|
|||
|
* A collection of options for the individual nodes. The nodes in an arc diagram
|
|||
|
* are auto-generated instances of `Highcharts.Point`, but options can be
|
|||
|
* applied here and linked by the `id`.
|
|||
|
*
|
|||
|
* @extends series.sankey.nodes
|
|||
|
* @type {Array<*>}
|
|||
|
* @product highcharts
|
|||
|
* @excluding column, level
|
|||
|
* @apioption series.arcdiagram.nodes
|
|||
|
*/
|
|||
|
/**
|
|||
|
* Individual data label for each node. The options are the same as the ones for
|
|||
|
* [series.arcdiagram.dataLabels](#series.arcdiagram.dataLabels).
|
|||
|
*
|
|||
|
* @type
|
|||
|
* {Highcharts.SeriesArcDiagramDataLabelsOptionsObject|Array<Highcharts.SeriesArcDiagramDataLabelsOptionsObject>}
|
|||
|
*
|
|||
|
* @apioption series.arcdiagram.nodes.dataLabels
|
|||
|
*/
|
|||
|
/**
|
|||
|
* Individual data label for each node. The options are the same as the ones for
|
|||
|
* [series.arcdiagram.dataLabels](#series.arcdiagram.dataLabels).
|
|||
|
*
|
|||
|
* @type
|
|||
|
* {Highcharts.SeriesArcDiagramDataLabelsOptionsObject|Array<Highcharts.SeriesArcDiagramDataLabelsOptionsObject>}
|
|||
|
*
|
|||
|
*/
|
|||
|
/**
|
|||
|
* An array of data points for the series. For the `arcdiagram` series type,
|
|||
|
* points can be given in the following way:
|
|||
|
*
|
|||
|
* An array of objects with named values. The following snippet shows only a few
|
|||
|
* settings, see the complete options set below. If the total number of data
|
|||
|
* points exceeds the series' [turboThreshold](#series.area.turboThreshold),
|
|||
|
* this option is not available.
|
|||
|
*
|
|||
|
* ```js
|
|||
|
* data: [{
|
|||
|
* from: 'Category1',
|
|||
|
* to: 'Category2',
|
|||
|
* weight: 2
|
|||
|
* }, {
|
|||
|
* from: 'Category1',
|
|||
|
* to: 'Category3',
|
|||
|
* weight: 5
|
|||
|
* }]
|
|||
|
* ```
|
|||
|
*
|
|||
|
* @type {Array<*>}
|
|||
|
* @extends series.sankey.data
|
|||
|
* @product highcharts
|
|||
|
* @excluding outgoing, dataLabels
|
|||
|
* @apioption series.arcdiagram.data
|
|||
|
*/
|
|||
|
''; // Adds doclets above to the transpiled file
|
|||
|
|
|||
|
return ArcDiagramSeries;
|
|||
|
});
|
|||
|
_registerModule(_modules, 'masters/modules/arc-diagram.src.js', [_modules['Core/Globals.js']], function (Highcharts) {
|
|||
|
|
|||
|
|
|||
|
return Highcharts;
|
|||
|
});
|
|||
|
}));
|