highcharts-rails 4.0.4.1 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.markdown +92 -0
- data/Rakefile +2 -0
- data/app/assets/javascripts/highcharts.js +1865 -1219
- data/app/assets/javascripts/highcharts/adapters/standalone-framework.js +1 -1
- data/app/assets/javascripts/highcharts/highcharts-3d.js +174 -239
- data/app/assets/javascripts/highcharts/highcharts-more.js +195 -187
- data/app/assets/javascripts/highcharts/modules/canvas-tools.js +1 -1
- data/app/assets/javascripts/highcharts/modules/data.js +125 -196
- data/app/assets/javascripts/highcharts/modules/drilldown.js +104 -80
- data/app/assets/javascripts/highcharts/modules/exporting.js +14 -4
- data/app/assets/javascripts/highcharts/modules/funnel.js +7 -7
- data/app/assets/javascripts/highcharts/modules/heatmap.js +26 -69
- data/app/assets/javascripts/highcharts/modules/no-data-to-display.js +2 -2
- data/app/assets/javascripts/highcharts/modules/solid-gauge.js +32 -17
- data/app/assets/javascripts/highcharts/modules/treemap.js +806 -0
- data/app/assets/javascripts/highcharts/themes/dark-unica.js +1 -1
- data/app/assets/javascripts/highcharts/themes/grid-light.js +1 -1
- data/app/assets/javascripts/highcharts/themes/sand-signika.js +1 -1
- data/lib/highcharts/version.rb +1 -1
- metadata +13 -12
- checksums.yaml.gz.asc +0 -18
- data.tar.gz.asc +0 -18
- metadata.gz.asc +0 -18
@@ -2,7 +2,7 @@
|
|
2
2
|
// @compilation_level SIMPLE_OPTIMIZATIONS
|
3
3
|
|
4
4
|
/**
|
5
|
-
* @license Highcharts JS v4.0
|
5
|
+
* @license Highcharts JS v4.1.0 (2015-02-16)
|
6
6
|
*
|
7
7
|
* (c) 2009-2014 Torstein Honsi
|
8
8
|
*
|
@@ -72,13 +72,16 @@ extend(Pane.prototype, {
|
|
72
72
|
// push them to the first axis' plot bands and borrow the existing logic there.
|
73
73
|
if (backgroundOption) {
|
74
74
|
each([].concat(splat(backgroundOption)).reverse(), function (config) {
|
75
|
-
var backgroundColor = config.backgroundColor
|
75
|
+
var backgroundColor = config.backgroundColor, // if defined, replace the old one (specific for gradients)
|
76
|
+
axisUserOptions = firstAxis.userOptions;
|
76
77
|
config = merge(pane.defaultBackgroundOptions, config);
|
77
78
|
if (backgroundColor) {
|
78
79
|
config.backgroundColor = backgroundColor;
|
79
80
|
}
|
80
81
|
config.color = config.backgroundColor; // due to naming in plotBands
|
81
82
|
firstAxis.options.plotBands.unshift(config);
|
83
|
+
axisUserOptions.plotBands = axisUserOptions.plotBands || []; // #3176
|
84
|
+
axisUserOptions.plotBands.unshift(config);
|
82
85
|
});
|
83
86
|
}
|
84
87
|
},
|
@@ -371,6 +374,10 @@ var radialAxisMixin = {
|
|
371
374
|
|
372
375
|
// Circular grid bands
|
373
376
|
} else {
|
377
|
+
|
378
|
+
// Keep within bounds
|
379
|
+
from = Math.max(from, this.min);
|
380
|
+
to = Math.min(to, this.max);
|
374
381
|
|
375
382
|
// Plot bands on Y axis (radial axis) - inner and outer radius depend on to and from
|
376
383
|
if (!isCircular) {
|
@@ -403,14 +410,14 @@ var radialAxisMixin = {
|
|
403
410
|
radii[0],
|
404
411
|
radii[0],
|
405
412
|
{
|
406
|
-
start: start,
|
407
|
-
end: end,
|
413
|
+
start: Math.min(start, end), // Math is for reversed yAxis (#3606)
|
414
|
+
end: Math.max(start, end),
|
408
415
|
innerR: pick(radii[1], radii[0] - radii[2]),
|
409
416
|
open: open
|
410
417
|
}
|
411
418
|
);
|
412
419
|
}
|
413
|
-
|
420
|
+
|
414
421
|
return ret;
|
415
422
|
},
|
416
423
|
|
@@ -575,6 +582,7 @@ wrap(tickProto, 'getLabelPosition', function (proceed, x, y, label, horiz, label
|
|
575
582
|
var axis = this.axis,
|
576
583
|
optionsY = labelOptions.y,
|
577
584
|
ret,
|
585
|
+
centerSlot = 20, // 20 degrees to each side at the top and bottom
|
578
586
|
align = labelOptions.align,
|
579
587
|
angle = ((axis.translate(this.pos) + axis.startAngleRad + Math.PI / 2) / Math.PI * 180) % 360;
|
580
588
|
|
@@ -595,9 +603,12 @@ wrap(tickProto, 'getLabelPosition', function (proceed, x, y, label, horiz, label
|
|
595
603
|
// Automatic alignment
|
596
604
|
if (align === null) {
|
597
605
|
if (axis.isCircular) {
|
598
|
-
if (
|
606
|
+
if (this.label.getBBox().width > axis.len * axis.tickInterval / (axis.max - axis.min)) { // #3506
|
607
|
+
centerSlot = 0;
|
608
|
+
}
|
609
|
+
if (angle > centerSlot && angle < 180 - centerSlot) {
|
599
610
|
align = 'left'; // right hemisphere
|
600
|
-
} else if (angle >
|
611
|
+
} else if (angle > 180 + centerSlot && angle < 360 - centerSlot) {
|
601
612
|
align = 'right'; // left hemisphere
|
602
613
|
} else {
|
603
614
|
align = 'center'; // top or bottom
|
@@ -682,6 +693,20 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
682
693
|
return [point.low, point.high];
|
683
694
|
},
|
684
695
|
pointValKey: 'low',
|
696
|
+
deferTranslatePolar: true,
|
697
|
+
|
698
|
+
/**
|
699
|
+
* Translate a point's plotHigh from the internal angle and radius measures to
|
700
|
+
* true plotHigh coordinates. This is an addition of the toXY method found in
|
701
|
+
* Polar.js, because it runs too early for arearanges to be considered (#3419).
|
702
|
+
*/
|
703
|
+
highToXY: function (point) {
|
704
|
+
// Find the polar plotX and plotY
|
705
|
+
var chart = this.chart,
|
706
|
+
xy = this.xAxis.postTranslate(point.rectPlotX, this.yAxis.len - point.plotHigh);
|
707
|
+
point.plotHighX = xy.x - chart.plotLeft;
|
708
|
+
point.plotHigh = xy.y - chart.plotTop;
|
709
|
+
},
|
685
710
|
|
686
711
|
/**
|
687
712
|
* Extend getSegments to force null points if the higher value is null. #1703.
|
@@ -728,6 +753,13 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
728
753
|
point.plotHigh = yAxis.translate(high, 0, 1, 0, 1);
|
729
754
|
}
|
730
755
|
});
|
756
|
+
|
757
|
+
// Postprocess plotHigh
|
758
|
+
if (this.chart.polar) {
|
759
|
+
each(this.points, function (point) {
|
760
|
+
series.highToXY(point);
|
761
|
+
});
|
762
|
+
}
|
731
763
|
},
|
732
764
|
|
733
765
|
/**
|
@@ -757,7 +789,7 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
757
789
|
point = segment[i];
|
758
790
|
if (point.plotHigh !== null) {
|
759
791
|
highSegment.push({
|
760
|
-
plotX: point.plotX,
|
792
|
+
plotX: point.plotHighX || point.plotX, // plotHighX is for polar charts
|
761
793
|
plotY: point.plotHigh
|
762
794
|
});
|
763
795
|
}
|
@@ -778,7 +810,9 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
778
810
|
linePath = [].concat(lowerPath, higherPath);
|
779
811
|
|
780
812
|
// For the area path, we need to change the 'move' statement into 'lineTo' or 'curveTo'
|
781
|
-
|
813
|
+
if (!this.chart.polar) {
|
814
|
+
higherPath[0] = 'L'; // this probably doesn't work for spline
|
815
|
+
}
|
782
816
|
this.areaPath = this.areaPath.concat(lowerPath, higherPath);
|
783
817
|
|
784
818
|
return linePath;
|
@@ -870,6 +904,8 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
870
904
|
seriesTypes.column.prototype.alignDataLabel.apply(this, arguments);
|
871
905
|
},
|
872
906
|
|
907
|
+
setStackedPoints: noop,
|
908
|
+
|
873
909
|
getSymbol: noop,
|
874
910
|
|
875
911
|
drawPoints: noop
|
@@ -967,9 +1003,6 @@ defaultPlotOptions.gauge = merge(defaultPlotOptions.line, {
|
|
967
1003
|
borderColor: 'silver',
|
968
1004
|
borderRadius: 3,
|
969
1005
|
crop: false,
|
970
|
-
style: {
|
971
|
-
fontWeight: 'bold'
|
972
|
-
},
|
973
1006
|
verticalAlign: 'top',
|
974
1007
|
zIndex: 2
|
975
1008
|
},
|
@@ -1213,7 +1246,7 @@ defaultPlotOptions.boxplot = merge(defaultPlotOptions.column, {
|
|
1213
1246
|
//stemWidth: null,
|
1214
1247
|
threshold: null,
|
1215
1248
|
tooltip: {
|
1216
|
-
pointFormat: '<span style="color:{
|
1249
|
+
pointFormat: '<span style="color:{point.color}">\u25CF</span> <b> {series.name}</b><br/>' + // docs
|
1217
1250
|
'Maximum: {point.high}<br/>' +
|
1218
1251
|
'Upper quartile: {point.q3}<br/>' +
|
1219
1252
|
'Median: {point.median}<br/>' +
|
@@ -1340,8 +1373,6 @@ seriesTypes.boxplot = extendClass(seriesTypes.column, {
|
|
1340
1373
|
// Median attributes
|
1341
1374
|
medianAttr.stroke = point.medianColor || options.medianColor || color;
|
1342
1375
|
medianAttr['stroke-width'] = pick(point.medianWidth, options.medianWidth, options.lineWidth);
|
1343
|
-
medianAttr['stroke-linecap'] = 'round'; // #1638
|
1344
|
-
|
1345
1376
|
|
1346
1377
|
// The stem
|
1347
1378
|
crispCorr = (stemAttr['stroke-width'] % 2) / 2;
|
@@ -1474,7 +1505,7 @@ defaultPlotOptions.errorbar = merge(defaultPlotOptions.boxplot, {
|
|
1474
1505
|
grouping: false,
|
1475
1506
|
linkedTo: ':previous',
|
1476
1507
|
tooltip: {
|
1477
|
-
pointFormat: '<span style="color:{
|
1508
|
+
pointFormat: '<span style="color:{point.color}">\u25CF</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>' // docs
|
1478
1509
|
},
|
1479
1510
|
whiskerWidth: null
|
1480
1511
|
});
|
@@ -1513,6 +1544,9 @@ defaultPlotOptions.waterfall = merge(defaultPlotOptions.column, {
|
|
1513
1544
|
lineColor: '#333',
|
1514
1545
|
dashStyle: 'dot',
|
1515
1546
|
borderColor: '#333',
|
1547
|
+
dataLabels: {
|
1548
|
+
inside: true
|
1549
|
+
},
|
1516
1550
|
states: {
|
1517
1551
|
hover: {
|
1518
1552
|
lineWidthPlus: 0 // #3126
|
@@ -1531,17 +1565,6 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
|
|
1531
1565
|
|
1532
1566
|
pointValKey: 'y',
|
1533
1567
|
|
1534
|
-
/**
|
1535
|
-
* Init waterfall series, force stacking
|
1536
|
-
*/
|
1537
|
-
init: function (chart, options) {
|
1538
|
-
// force stacking
|
1539
|
-
options.stacking = true;
|
1540
|
-
|
1541
|
-
seriesTypes.column.prototype.init.call(this, chart, options);
|
1542
|
-
},
|
1543
|
-
|
1544
|
-
|
1545
1568
|
/**
|
1546
1569
|
* Translate data points from raw values
|
1547
1570
|
*/
|
@@ -1556,10 +1579,12 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
|
|
1556
1579
|
shapeArgs,
|
1557
1580
|
stack,
|
1558
1581
|
y,
|
1582
|
+
yValue,
|
1559
1583
|
previousY,
|
1560
1584
|
previousIntermediate,
|
1561
|
-
|
1585
|
+
range,
|
1562
1586
|
threshold = options.threshold,
|
1587
|
+
stacking = options.stacking,
|
1563
1588
|
tooltipY;
|
1564
1589
|
|
1565
1590
|
// run column series translate
|
@@ -1571,35 +1596,38 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
|
|
1571
1596
|
for (i = 0, len = points.length; i < len; i++) {
|
1572
1597
|
// cache current point object
|
1573
1598
|
point = points[i];
|
1599
|
+
yValue = this.processedYData[i];
|
1574
1600
|
shapeArgs = point.shapeArgs;
|
1575
1601
|
|
1576
1602
|
// get current stack
|
1577
|
-
stack = series.
|
1578
|
-
|
1603
|
+
stack = stacking && yAxis.stacks[(series.negStacks && yValue < threshold ? '-' : '') + series.stackKey];
|
1604
|
+
range = stack ?
|
1605
|
+
stack[point.x].points[series.index + ',' + i] :
|
1606
|
+
[0, yValue];
|
1579
1607
|
|
1580
1608
|
// override point value for sums
|
1581
|
-
if (
|
1582
|
-
point.y =
|
1609
|
+
if (point.isSum || point.isIntermediateSum) { // #3710 Update point does not propagate to sum
|
1610
|
+
point.y = yValue;
|
1583
1611
|
}
|
1584
1612
|
|
1585
1613
|
// up points
|
1586
|
-
y = mathMax(previousY, previousY + point.y) +
|
1614
|
+
y = mathMax(previousY, previousY + point.y) + range[0];
|
1587
1615
|
shapeArgs.y = yAxis.translate(y, 0, 1);
|
1588
1616
|
|
1589
1617
|
|
1590
1618
|
// sum points
|
1591
1619
|
if (point.isSum) {
|
1592
|
-
shapeArgs.y = yAxis.translate(
|
1593
|
-
shapeArgs.height = yAxis.translate(
|
1620
|
+
shapeArgs.y = yAxis.translate(range[1], 0, 1);
|
1621
|
+
shapeArgs.height = yAxis.translate(range[0], 0, 1) - shapeArgs.y;
|
1594
1622
|
|
1595
1623
|
} else if (point.isIntermediateSum) {
|
1596
|
-
shapeArgs.y = yAxis.translate(
|
1624
|
+
shapeArgs.y = yAxis.translate(range[1], 0, 1);
|
1597
1625
|
shapeArgs.height = yAxis.translate(previousIntermediate, 0, 1) - shapeArgs.y;
|
1598
|
-
previousIntermediate =
|
1626
|
+
previousIntermediate = range[1];
|
1599
1627
|
|
1600
1628
|
// if it's not the sum point, update previous stack end position
|
1601
1629
|
} else {
|
1602
|
-
previousY +=
|
1630
|
+
previousY += yValue;
|
1603
1631
|
}
|
1604
1632
|
|
1605
1633
|
// negative points
|
@@ -1630,7 +1658,7 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
|
|
1630
1658
|
var series = this,
|
1631
1659
|
options = series.options,
|
1632
1660
|
yData = series.yData,
|
1633
|
-
points = series.
|
1661
|
+
points = series.options.data, // #3710 Update point does not propagate to sum
|
1634
1662
|
point,
|
1635
1663
|
dataLength = yData.length,
|
1636
1664
|
threshold = options.threshold || 0,
|
@@ -1697,9 +1725,16 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
|
|
1697
1725
|
seriesDownPointAttr.select[upColorProp] = stateOptions.select.upColor || upColor;
|
1698
1726
|
|
1699
1727
|
each(series.points, function (point) {
|
1700
|
-
if (
|
1701
|
-
|
1702
|
-
point.
|
1728
|
+
if (!point.options.color) {
|
1729
|
+
// Up color
|
1730
|
+
if (point.y > 0) {
|
1731
|
+
point.pointAttr = seriesDownPointAttr;
|
1732
|
+
point.color = upColor;
|
1733
|
+
|
1734
|
+
// Down color (#3710, update to negative)
|
1735
|
+
} else {
|
1736
|
+
point.pointAttr = series.pointAttr;
|
1737
|
+
}
|
1703
1738
|
}
|
1704
1739
|
});
|
1705
1740
|
},
|
@@ -1748,27 +1783,34 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
|
|
1748
1783
|
*/
|
1749
1784
|
getExtremes: noop,
|
1750
1785
|
|
1751
|
-
/**
|
1752
|
-
* Return stack for given index
|
1753
|
-
*/
|
1754
|
-
getStack: function (i) {
|
1755
|
-
var axis = this.yAxis,
|
1756
|
-
stacks = axis.stacks,
|
1757
|
-
key = this.stackKey;
|
1758
|
-
|
1759
|
-
if (this.processedYData[i] < this.options.threshold) {
|
1760
|
-
key = '-' + key;
|
1761
|
-
}
|
1762
|
-
|
1763
|
-
return stacks[key][i];
|
1764
|
-
},
|
1765
|
-
|
1766
1786
|
drawGraph: Series.prototype.drawGraph
|
1767
1787
|
});
|
1768
1788
|
|
1769
1789
|
/* ****************************************************************************
|
1770
1790
|
* End Waterfall series code *
|
1771
1791
|
*****************************************************************************/
|
1792
|
+
/**
|
1793
|
+
* Set the default options for polygon
|
1794
|
+
*/
|
1795
|
+
defaultPlotOptions.polygon = merge(defaultPlotOptions.scatter, {
|
1796
|
+
marker: {
|
1797
|
+
enabled: false
|
1798
|
+
}
|
1799
|
+
});
|
1800
|
+
|
1801
|
+
/**
|
1802
|
+
* The polygon series class
|
1803
|
+
*/
|
1804
|
+
seriesTypes.polygon = extendClass(seriesTypes.scatter, {
|
1805
|
+
type: 'polygon',
|
1806
|
+
fillGraph: true,
|
1807
|
+
// Close all segments
|
1808
|
+
getSegmentPath: function (segment) {
|
1809
|
+
return Series.prototype.getSegmentPath.call(this, segment).concat('z');
|
1810
|
+
},
|
1811
|
+
drawGraph: Series.prototype.drawGraph,
|
1812
|
+
drawLegendSymbol: Highcharts.LegendSymbolMixin.drawRectangle
|
1813
|
+
});
|
1772
1814
|
/* ****************************************************************************
|
1773
1815
|
* Start Bubble series code *
|
1774
1816
|
*****************************************************************************/
|
@@ -1780,10 +1822,6 @@ defaultPlotOptions.bubble = merge(defaultPlotOptions.scatter, {
|
|
1780
1822
|
return this.point.z;
|
1781
1823
|
},
|
1782
1824
|
inside: true,
|
1783
|
-
style: {
|
1784
|
-
color: 'white',
|
1785
|
-
textShadow: '0px 0px 3px black'
|
1786
|
-
},
|
1787
1825
|
verticalAlign: 'middle'
|
1788
1826
|
},
|
1789
1827
|
// displayNegative: true,
|
@@ -1807,13 +1845,15 @@ defaultPlotOptions.bubble = merge(defaultPlotOptions.scatter, {
|
|
1807
1845
|
pointFormat: '({point.x}, {point.y}), Size: {point.z}'
|
1808
1846
|
},
|
1809
1847
|
turboThreshold: 0,
|
1810
|
-
zThreshold: 0
|
1848
|
+
zThreshold: 0,
|
1849
|
+
zoneAxis: 'z'
|
1811
1850
|
});
|
1812
1851
|
|
1813
1852
|
var BubblePoint = extendClass(Point, {
|
1814
1853
|
haloPath: function () {
|
1815
1854
|
return Point.prototype.haloPath.call(this, this.shapeArgs.r + this.series.options.states.hover.halo.size);
|
1816
|
-
}
|
1855
|
+
},
|
1856
|
+
ttBelow: false
|
1817
1857
|
});
|
1818
1858
|
|
1819
1859
|
// 2 - Create the series object
|
@@ -1824,6 +1864,7 @@ seriesTypes.bubble = extendClass(seriesTypes.scatter, {
|
|
1824
1864
|
parallelArrays: ['x', 'y', 'z'],
|
1825
1865
|
trackerGroups: ['group', 'dataLabelsGroup'],
|
1826
1866
|
bubblePadding: true,
|
1867
|
+
zoneAxis: 'z',
|
1827
1868
|
|
1828
1869
|
/**
|
1829
1870
|
* Mapping between SVG attributes and the corresponding options
|
@@ -1936,9 +1977,6 @@ seriesTypes.bubble = extendClass(seriesTypes.scatter, {
|
|
1936
1977
|
while (i--) {
|
1937
1978
|
point = data[i];
|
1938
1979
|
radius = radii ? radii[i] : 0; // #1737
|
1939
|
-
|
1940
|
-
// Flag for negativeColor to be applied in Series.js
|
1941
|
-
point.negative = point.z < (this.options.zThreshold || 0);
|
1942
1980
|
|
1943
1981
|
if (radius >= this.minPxSize / 2) {
|
1944
1982
|
// Shape arguments
|
@@ -1981,9 +2019,11 @@ seriesTypes.bubble = extendClass(seriesTypes.scatter, {
|
|
1981
2019
|
item.legendSymbol.isMarker = true;
|
1982
2020
|
|
1983
2021
|
},
|
1984
|
-
|
2022
|
+
|
1985
2023
|
drawPoints: seriesTypes.column.prototype.drawPoints,
|
1986
|
-
alignDataLabel: seriesTypes.column.prototype.alignDataLabel
|
2024
|
+
alignDataLabel: seriesTypes.column.prototype.alignDataLabel,
|
2025
|
+
buildKDTree: noop,
|
2026
|
+
applyZones: noop
|
1987
2027
|
});
|
1988
2028
|
|
1989
2029
|
/**
|
@@ -2008,78 +2048,76 @@ Axis.prototype.beforePadding = function () {
|
|
2008
2048
|
activeSeries = [];
|
2009
2049
|
|
2010
2050
|
// Handle padding on the second pass, or on redraw
|
2011
|
-
|
2012
|
-
each(this.series, function (series) {
|
2051
|
+
each(this.series, function (series) {
|
2013
2052
|
|
2014
|
-
|
2015
|
-
|
2053
|
+
var seriesOptions = series.options,
|
2054
|
+
zData;
|
2016
2055
|
|
2017
|
-
|
2056
|
+
if (series.bubblePadding && (series.visible || !chart.options.chart.ignoreHiddenSeries)) {
|
2018
2057
|
|
2019
|
-
|
2020
|
-
|
2058
|
+
// Correction for #1673
|
2059
|
+
axis.allowZoomOutside = true;
|
2021
2060
|
|
2022
|
-
|
2023
|
-
|
2061
|
+
// Cache it
|
2062
|
+
activeSeries.push(series);
|
2024
2063
|
|
2025
|
-
|
2026
|
-
|
2027
|
-
|
2028
|
-
|
2029
|
-
|
2030
|
-
|
2031
|
-
|
2032
|
-
length = pInt(length);
|
2033
|
-
extremes[prop] = isPercent ?
|
2034
|
-
smallestSize * length / 100 :
|
2035
|
-
length;
|
2036
|
-
|
2037
|
-
});
|
2038
|
-
series.minPxSize = extremes.minSize;
|
2064
|
+
if (isXAxis) { // because X axis is evaluated first
|
2065
|
+
|
2066
|
+
// For each series, translate the size extremes to pixel values
|
2067
|
+
each(['minSize', 'maxSize'], function (prop) {
|
2068
|
+
var length = seriesOptions[prop],
|
2069
|
+
isPercent = /%$/.test(length);
|
2039
2070
|
|
2040
|
-
|
2041
|
-
|
2042
|
-
|
2043
|
-
|
2044
|
-
|
2045
|
-
|
2046
|
-
|
2047
|
-
|
2048
|
-
|
2049
|
-
|
2050
|
-
|
2051
|
-
|
2071
|
+
length = pInt(length);
|
2072
|
+
extremes[prop] = isPercent ?
|
2073
|
+
smallestSize * length / 100 :
|
2074
|
+
length;
|
2075
|
+
|
2076
|
+
});
|
2077
|
+
series.minPxSize = extremes.minSize;
|
2078
|
+
|
2079
|
+
// Find the min and max Z
|
2080
|
+
zData = series.zData;
|
2081
|
+
if (zData.length) { // #1735
|
2082
|
+
zMin = pick(seriesOptions.zMin, math.min(
|
2083
|
+
zMin,
|
2084
|
+
math.max(
|
2085
|
+
arrayMin(zData),
|
2086
|
+
seriesOptions.displayNegative === false ? seriesOptions.zThreshold : -Number.MAX_VALUE
|
2087
|
+
)
|
2088
|
+
));
|
2089
|
+
zMax = pick(seriesOptions.zMax, math.max(zMax, arrayMax(zData)));
|
2052
2090
|
}
|
2053
2091
|
}
|
2054
|
-
}
|
2092
|
+
}
|
2093
|
+
});
|
2055
2094
|
|
2056
|
-
|
2095
|
+
each(activeSeries, function (series) {
|
2057
2096
|
|
2058
|
-
|
2059
|
-
|
2060
|
-
|
2097
|
+
var data = series[dataKey],
|
2098
|
+
i = data.length,
|
2099
|
+
radius;
|
2061
2100
|
|
2062
|
-
|
2063
|
-
|
2064
|
-
|
2065
|
-
|
2066
|
-
|
2067
|
-
|
2068
|
-
|
2069
|
-
|
2070
|
-
|
2071
|
-
|
2072
|
-
}
|
2101
|
+
if (isXAxis) {
|
2102
|
+
series.getRadii(zMin, zMax, extremes.minSize, extremes.maxSize);
|
2103
|
+
}
|
2104
|
+
|
2105
|
+
if (range > 0) {
|
2106
|
+
while (i--) {
|
2107
|
+
if (typeof data[i] === 'number') {
|
2108
|
+
radius = series.radii[i];
|
2109
|
+
pxMin = Math.min(((data[i] - min) * transA) - radius, pxMin);
|
2110
|
+
pxMax = Math.max(((data[i] - min) * transA) + radius, pxMax);
|
2073
2111
|
}
|
2074
2112
|
}
|
2075
|
-
});
|
2076
|
-
|
2077
|
-
if (activeSeries.length && range > 0 && pick(this.options.min, this.userMin) === UNDEFINED && pick(this.options.max, this.userMax) === UNDEFINED) {
|
2078
|
-
pxMax -= axisLength;
|
2079
|
-
transA *= (axisLength + pxMin - pxMax) / axisLength;
|
2080
|
-
this.min += pxMin / transA;
|
2081
|
-
this.max += pxMax / transA;
|
2082
2113
|
}
|
2114
|
+
});
|
2115
|
+
|
2116
|
+
if (activeSeries.length && range > 0 && pick(this.options.min, this.userMin) === UNDEFINED && pick(this.options.max, this.userMax) === UNDEFINED) {
|
2117
|
+
pxMax -= axisLength;
|
2118
|
+
transA *= (axisLength + pxMin - pxMax) / axisLength;
|
2119
|
+
this.min += pxMin / transA;
|
2120
|
+
this.max += pxMax / transA;
|
2083
2121
|
}
|
2084
2122
|
};
|
2085
2123
|
|
@@ -2099,6 +2137,36 @@ Axis.prototype.beforePadding = function () {
|
|
2099
2137
|
pointerProto = Pointer.prototype,
|
2100
2138
|
colProto;
|
2101
2139
|
|
2140
|
+
seriesProto.searchPolarPoint = function (e) {
|
2141
|
+
var series = this,
|
2142
|
+
chart = series.chart,
|
2143
|
+
xAxis = series.xAxis,
|
2144
|
+
center = xAxis.pane.center,
|
2145
|
+
plotX = e.chartX - center[0] - chart.plotLeft,
|
2146
|
+
plotY = e.chartY - center[1] - chart.plotTop;
|
2147
|
+
|
2148
|
+
this.kdAxisArray = ['clientX'];
|
2149
|
+
e = {
|
2150
|
+
clientX: 180 + (Math.atan2(plotX, plotY) * (-180 / Math.PI))
|
2151
|
+
};
|
2152
|
+
return this.searchKDTree(e);
|
2153
|
+
|
2154
|
+
};
|
2155
|
+
|
2156
|
+
wrap(seriesProto, 'buildKDTree', function (proceed) {
|
2157
|
+
if (this.chart.polar) {
|
2158
|
+
this.kdAxisArray = ['clientX'];
|
2159
|
+
}
|
2160
|
+
proceed.apply(this);
|
2161
|
+
});
|
2162
|
+
|
2163
|
+
wrap(seriesProto, 'searchPoint', function (proceed, e) {
|
2164
|
+
if (this.chart.polar) {
|
2165
|
+
return this.searchPolarPoint(e);
|
2166
|
+
} else {
|
2167
|
+
return proceed.call(this, e);
|
2168
|
+
}
|
2169
|
+
});
|
2102
2170
|
/**
|
2103
2171
|
* Translate a point's plotX and plotY from the internal angle and radius measures to
|
2104
2172
|
* true plotX, plotY coordinates
|
@@ -2128,25 +2196,6 @@ Axis.prototype.beforePadding = function () {
|
|
2128
2196
|
point.plotY = point.polarPlotY = xy.y - chart.plotTop;
|
2129
2197
|
};
|
2130
2198
|
|
2131
|
-
/**
|
2132
|
-
* Order the tooltip points to get the mouse capture ranges correct. #1915.
|
2133
|
-
*/
|
2134
|
-
seriesProto.orderTooltipPoints = function (points) {
|
2135
|
-
if (this.chart.polar) {
|
2136
|
-
points.sort(function (a, b) {
|
2137
|
-
return a.clientX - b.clientX;
|
2138
|
-
});
|
2139
|
-
|
2140
|
-
// Wrap mouse tracking around to capture movement on the segment to the left
|
2141
|
-
// of the north point (#1469, #2093).
|
2142
|
-
if (points[0]) {
|
2143
|
-
points[0].wrappedClientX = points[0].clientX + 360;
|
2144
|
-
points.push(points[0]);
|
2145
|
-
}
|
2146
|
-
}
|
2147
|
-
};
|
2148
|
-
|
2149
|
-
|
2150
2199
|
/**
|
2151
2200
|
* Add some special init logic to areas and areasplines
|
2152
2201
|
*/
|
@@ -2173,6 +2222,7 @@ Axis.prototype.beforePadding = function () {
|
|
2173
2222
|
}
|
2174
2223
|
}
|
2175
2224
|
|
2225
|
+
|
2176
2226
|
if (seriesTypes.area) {
|
2177
2227
|
wrap(seriesTypes.area.prototype, 'init', initArea);
|
2178
2228
|
}
|
@@ -2392,21 +2442,6 @@ Axis.prototype.beforePadding = function () {
|
|
2392
2442
|
// Define the animate method for regular series
|
2393
2443
|
wrap(seriesProto, 'animate', polarAnimate);
|
2394
2444
|
|
2395
|
-
/**
|
2396
|
-
* Throw in a couple of properties to let setTooltipPoints know we're indexing the points
|
2397
|
-
* in degrees (0-360), not plot pixel width.
|
2398
|
-
*/
|
2399
|
-
wrap(seriesProto, 'setTooltipPoints', function (proceed, renew) {
|
2400
|
-
|
2401
|
-
if (this.chart.polar) {
|
2402
|
-
extend(this.xAxis, {
|
2403
|
-
tooltipLen: 360 // degrees are the resolution unit of the tooltipPoints array
|
2404
|
-
});
|
2405
|
-
}
|
2406
|
-
// Run uber method
|
2407
|
-
return proceed.call(this, renew);
|
2408
|
-
});
|
2409
|
-
|
2410
2445
|
|
2411
2446
|
if (seriesTypes.column) {
|
2412
2447
|
|
@@ -2507,33 +2542,6 @@ Axis.prototype.beforePadding = function () {
|
|
2507
2542
|
});
|
2508
2543
|
}
|
2509
2544
|
|
2510
|
-
|
2511
|
-
/**
|
2512
|
-
* Extend the mouse tracker to return the tooltip position index in terms of
|
2513
|
-
* degrees rather than pixels
|
2514
|
-
*/
|
2515
|
-
wrap(pointerProto, 'getIndex', function (proceed, e) {
|
2516
|
-
var ret,
|
2517
|
-
chart = this.chart,
|
2518
|
-
center,
|
2519
|
-
x,
|
2520
|
-
y;
|
2521
|
-
|
2522
|
-
if (chart.polar) {
|
2523
|
-
center = chart.xAxis[0].center;
|
2524
|
-
x = e.chartX - center[0] - chart.plotLeft;
|
2525
|
-
y = e.chartY - center[1] - chart.plotTop;
|
2526
|
-
|
2527
|
-
ret = 180 - Math.round(Math.atan2(x, y) / Math.PI * 180);
|
2528
|
-
|
2529
|
-
} else {
|
2530
|
-
|
2531
|
-
// Run uber method
|
2532
|
-
ret = proceed.call(this, e);
|
2533
|
-
}
|
2534
|
-
return ret;
|
2535
|
-
});
|
2536
|
-
|
2537
2545
|
/**
|
2538
2546
|
* Extend getCoordinates to prepare for polar axis values
|
2539
2547
|
*/
|