UNPKG

@amcharts/amcharts4

Version:
415 lines 15.6 kB
/** * Radar chart module. */ import { __extends } from "tslib"; /** * ============================================================================ * IMPORTS * ============================================================================ * @hidden */ import { XYChart, XYChartDataItem } from "./XYChart"; import { percent, Percent } from "../../core/utils/Percent"; import { RadarSeries } from "../series/RadarSeries"; import { Container } from "../../core/Container"; import { Circle } from "../../core/elements/Circle"; import { registry } from "../../core/Registry"; import { AxisRendererCircular } from "../axes/AxisRendererCircular"; import { AxisRendererRadial } from "../axes/AxisRendererRadial"; import * as $utils from "../../core/utils/Utils"; import * as $iter from "../../core/utils/Iterator"; import * as $type from "../../core/utils/Type"; import * as $math from "../../core/utils/Math"; import * as $path from "../../core/rendering/Path"; /** * ============================================================================ * DATA ITEM * ============================================================================ * @hidden */ /** * Defines a [[DataItem]] for [[RadarChart]]. * * @see {@link DataItem} */ var RadarChartDataItem = /** @class */ (function (_super) { __extends(RadarChartDataItem, _super); /** * Constructor */ function RadarChartDataItem() { var _this = _super.call(this) || this; _this.className = "RadarChartDataItem"; _this.applyTheme(); return _this; } return RadarChartDataItem; }(XYChartDataItem)); export { RadarChartDataItem }; /** * ============================================================================ * MAIN CLASS * ============================================================================ * @hidden */ /** * Creates a Radar chart. * * @see {@link IRadarChartEvents} for a list of available Events * @see {@link IRadarChartAdapters} for a list of available Adapters * @see {@link https://www.amcharts.com/docs/v4/chart-types/radar-chart/} for documentation * @important */ var RadarChart = /** @class */ (function (_super) { __extends(RadarChart, _super); /** * Constructor */ function RadarChart() { var _this = // Init _super.call(this) || this; /** * Defines X axis renderer type. */ _this._axisRendererX = AxisRendererCircular; /** * Defines Y axis renderer type. */ _this._axisRendererY = AxisRendererRadial; /** * used by cursor. We adjust innerradius if start and end angle are close to each other * @ignore Exclude from docs */ _this.innerRadiusModifyer = 1; /** * @ignore */ _this.mr = 1; _this.className = "RadarChart"; _this.startAngle = -90; _this.endAngle = 270; _this.radius = percent(80); _this.innerRadius = 0; var radarContainer = _this.plotContainer.createChild(Container); radarContainer.shouldClone = false; radarContainer.layout = "absolute"; radarContainer.align = "center"; radarContainer.valign = "middle"; _this.seriesContainer.parent = radarContainer; _this.radarContainer = radarContainer; _this.bulletsContainer.parent = radarContainer; _this.axisBulletsContainer = radarContainer; _this._cursorContainer = radarContainer; _this.chartContainer.events.on("maxsizechanged", _this.invalidate, _this, false); // need this for the chart to change radius if legend is removed/disabled _this._bulletMask = radarContainer.createChild(Circle); _this._bulletMask.shouldClone = false; _this._bulletMask.element = _this.paper.add("path"); _this._bulletMask.opacity = 0; // Apply theme _this.applyTheme(); return _this; } /** * Sets defaults that instantiate some objects that rely on parent, so they * cannot be set in constructor. */ RadarChart.prototype.applyInternalDefaults = function () { _super.prototype.applyInternalDefaults.call(this); // Add a default screen reader title for accessibility // This will be overridden in screen reader if there are any `titles` set if (!$type.hasValue(this.readerTitle)) { this.readerTitle = this.language.translate("Radar chart"); } }; /** * Decorates Axis with required properties for this chart. * * @param axis Axis */ RadarChart.prototype.processAxis = function (axis) { _super.prototype.processAxis.call(this, axis); var renderer = axis.renderer; renderer.gridContainer.parent = renderer; renderer.breakContainer.parent = renderer; axis.parent = this.radarContainer; renderer.toBack(); }; /** * Updates all X axes after range change event. */ RadarChart.prototype.handleXAxisRangeChange = function () { _super.prototype.handleXAxisRangeChange.call(this); $iter.each(this.yAxes.iterator(), function (axis) { axis.invalidate(); }); }; /** * Updates all Y axes after range change event. */ RadarChart.prototype.handleYAxisRangeChange = function () { _super.prototype.handleYAxisRangeChange.call(this); $iter.each(this.xAxes.iterator(), function (axis) { axis.invalidate(); }); }; /** * Processes JSON-based config before it is applied to the object. * * @ignore Exclude from docs * @param config Config */ RadarChart.prototype.processConfig = function (config) { if (config) { // Set up cursor if ($type.hasValue(config.cursor) && !$type.hasValue(config.cursor.type)) { config.cursor.type = "RadarCursor"; } // Set up series if ($type.hasValue(config.series) && $type.isArray(config.series)) { for (var i = 0, len = config.series.length; i < len; i++) { config.series[i].type = config.series[i].type || "RadarSeries"; } } // Set up axes /*if ($type.hasValue(config.xAxes) && $type.isArray(config.xAxes)) { for (let i = 0, len = config.xAxes.length; i < len; i++) { config.xAxes[i].type = config.xAxes[i].type || "AxisRendererCircular"; } } if ($type.hasValue(config.yAxes) && $type.isArray(config.yAxes)) { for (let i = 0, len = config.yAxes.length; i < len; i++) { config.yAxes[i].type = config.yAxes[i].type || "AxisRendererRadial"; } }*/ } _super.prototype.processConfig.call(this, config); }; /** * Does calculations before drawing the chart. */ RadarChart.prototype.beforeDraw = function () { _super.prototype.beforeDraw.call(this); var plotContainer = this.plotContainer; var rect = $math.getArcRect(this.startAngle, this.endAngle, 1); var innerRect = { x: 0, y: 0, width: 0, height: 0 }; var wr = plotContainer.innerWidth / rect.width; var hr = plotContainer.innerHeight / rect.height; var innerRadius = this.innerRadius; if (innerRadius instanceof Percent) { var value = innerRadius.value; var mr = Math.min(wr, hr); this.mr = mr; value = Math.max(mr * value, mr - Math.min(plotContainer.innerHeight, plotContainer.innerWidth)) / mr; innerRect = $math.getArcRect(this.startAngle, this.endAngle, value); this.innerRadiusModifyer = value / innerRadius.value; innerRadius = percent(value * 100); } // @todo handle this when innerRadius set in pixels (do it for pie also) rect = $math.getCommonRectangle([rect, innerRect]); var maxRadius = Math.min(plotContainer.innerWidth / rect.width, plotContainer.innerHeight / rect.height); var diameter = $utils.relativeRadiusToValue(this.radius, maxRadius) * 2 || 0; var radius = diameter / 2; var startAngle = this.startAngle; var endAngle = this.endAngle; this._pixelInnerRadius = $utils.relativeRadiusToValue(innerRadius, radius); this._bulletMask.path = $path.arc(startAngle, endAngle - startAngle, radius, this._pixelInnerRadius); $iter.each(this.xAxes.iterator(), function (axis) { if (axis.renderer.useChartAngles) { axis.renderer.startAngle = startAngle; axis.renderer.endAngle = endAngle; } axis.width = diameter; axis.height = diameter; //axis.renderer.width = diameter; //axis.renderer.height = diameter; axis.renderer.pixelRadiusReal = radius; //axis.renderer.innerRadius = innerRadius; }); $iter.each(this.yAxes.iterator(), function (axis) { axis.renderer.startAngle = startAngle; axis.renderer.endAngle = endAngle; axis.width = diameter; axis.height = diameter; //axis.renderer.width = diameter; //axis.renderer.height = diameter; axis.renderer.pixelRadiusReal = radius; //axis.renderer.innerRadius = innerRadius; }); var cursor = this.cursor; if (cursor) { cursor.width = diameter; cursor.height = diameter; cursor.startAngle = startAngle; cursor.endAngle = endAngle; } this.radarContainer.definedBBox = { x: radius * rect.x, y: radius * rect.y, width: radius * rect.width, height: radius * rect.height }; this.radarContainer.validatePosition(); }; /** * Creates and returns a new Series, suitable for RadarChart. * * @return New Series */ RadarChart.prototype.createSeries = function () { return new RadarSeries(); }; Object.defineProperty(RadarChart.prototype, "startAngle", { /** * @return Start angle (degrees) */ get: function () { return this.getPropertyValue("startAngle"); }, /** * Starting angle of the Radar face. (degrees) * * Normally, a circular radar face begins (the radial axis is drawn) at the * top center. (at -90 degrees) * * You can use `startAngle` to change this setting. * * E.g. setting this to 0 will make the radial axis start horizontally to * the right, as opposed to vertical. * * For a perfect circle the absolute sum of `startAngle` and `endAngle` * needs to be 360. * * However, it's **not** necessary to do so. You can set those to lesser * numbers, to create semi-circles. * * E.g. `startAngle = -90` with `endAngle = 0` will create a radar face that * looks like a quarter of a circle. * * @default -90 * @param value Start angle (degrees) */ set: function (value) { this.setPropertyValue("startAngle", value, true); }, enumerable: true, configurable: true }); Object.defineProperty(RadarChart.prototype, "endAngle", { /** * @return End angle (degrees) */ get: function () { return this.getPropertyValue("endAngle"); }, /** * Starting angle of the Radar face. (degrees) * * Normally, a circular radar face ends (the radial axis is drawn) exactly * where it has started, forming a full 360 circle. (at 270 degrees) * * You can use `endAngle` to end the circle somewhere else. * * E.g. setting this to 180 will make the radar face end at horizontal line * to the left off the center. * * For a perfect circle the absolute sum of `startAngle` and `endAngle` * needs to be 360. * * However, it's **not** necessary to do so. You can set those to lesser * numbers, to create semi-circles. * * E.g. `startAngle = -90` with `endAngle = 0` will create a radar face that * looks like a quarter of a circle. * * @default -90 * @param value End angle (degrees) */ set: function (value) { this.setPropertyValue("endAngle", value, true); }, enumerable: true, configurable: true }); Object.defineProperty(RadarChart.prototype, "radius", { /** * @return Outer radius */ get: function () { return this.getPropertyValue("radius"); }, /** * Outer radius of the Radar face. * * This can either be in absolute pixel value, or relative [[Percent]]. * * @param value Outer radius */ set: function (value) { this.setPercentProperty("radius", value, true, false, 10, false); }, enumerable: true, configurable: true }); Object.defineProperty(RadarChart.prototype, "pixelInnerRadius", { /** * @return Inner radius in pixels */ get: function () { return this._pixelInnerRadius; }, enumerable: true, configurable: true }); Object.defineProperty(RadarChart.prototype, "innerRadius", { /** * @return Inner radius */ get: function () { return this.getPropertyValue("innerRadius"); }, /** * Inner radius of the radar face. * * This can either be in absolute pixel value, or relative [[Percent]]. * * If set in Percent, it will be relative to `radius`. (outer radius) * * @param value Inner radius */ set: function (value) { this.setPercentProperty("innerRadius", value, true, false, 10, false); }, enumerable: true, configurable: true }); /** * Triggers (re)rendering of the horizontal (X) axis. * * @ignore Exclude from docs * @param axis Axis */ RadarChart.prototype.updateXAxis = function (renderer) { //do not call super! if (renderer) { renderer.processRenderer(); } }; /** * Triggers (re)rendering of the vertical (Y) axis. * * @ignore Exclude from docs * @param axis Axis */ RadarChart.prototype.updateYAxis = function (renderer) { // do not call super! if (renderer) { renderer.processRenderer(); } }; return RadarChart; }(XYChart)); export { RadarChart }; /** * Register class in system, so that it can be instantiated using its name from * anywhere. * * @ignore */ registry.registeredClasses["RadarChart"] = RadarChart; //# sourceMappingURL=RadarChart.js.map