highcharts-rails 4.0.4.1 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
*/
|