highcharts-rails 3.0.2 → 3.0.3

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 ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZjI5YTRiMTJiMjQ4MTM2YWYwNmZhZGU3MTAwMDA3N2FlN2ZlMWY2Nw==
5
+ data.tar.gz: !binary |-
6
+ NTc2MzAyYWE2YjU3NjdiNmFkOGZhYTNkNjYzNTk1MzBiMmIyMjY4YQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ NGYwYWI4NmM5MDlmNWEyZmM2YmFiMzIyOWY1Nzc2NGY1YWFmMmJhYWEwZjYz
10
+ NjkyMGExOGQwM2I3ZjhiY2NmNDFhZTA2MzI1MDc4Y2IxM2ZjNGYwNTZhMDZl
11
+ ZmEzZTc5ZDFkNDA1ZWMyN2MxYTZjMWIxMjgzYzU2MWE5MGIyNjU=
12
+ data.tar.gz: !binary |-
13
+ YzI5MjhlYmFlOTgyZGRjZDg1YTBmNzkwMzIyMWExZTFkZGE2MWRmYjRhOTFl
14
+ ODFmOTQ1MDQxYWI4NzM4MGY3OTc0YjNjZjhmNGUxMjgzY2FmODEzNzdiOTRh
15
+ NjQ4YWViZWIwOTA0OTJjZjk3ODRjNTU0YzQ2OWYzMDEwNDY1Yzc=
checksums.yaml.gz.asc ADDED
@@ -0,0 +1,18 @@
1
+ -----BEGIN PGP SIGNATURE-----
2
+ Version: GnuPG/MacGPG2 v2.0.20 (Darwin)
3
+ Comment: GPGTools - http://gpgtools.org
4
+
5
+ iQIcBAABAgAGBQJR+ocLAAoJEH1ncb0Txu7Xl1kP+wUDto8iBznBibINIAh6gKRy
6
+ geHnvX64o0K1h5LA8a8Au32wlOVW1YiDXXnkj2eO5JPbusnkzf5NaUdBXOvYaMyP
7
+ 3MDd3mC8LJtrHavizFU8nNDKGfZC/l5g47vc5OAS9Ti9zg1dWZg9vpjWlKb0d4AA
8
+ RF4MmBPieVpJLscwWSexOzzz1VP1yM6oiOt9dQcbLxK2LMOsjsSbwnOHdue+LS3q
9
+ BIJ06N60hOLxTcSKgEsMAgwXmqhOsWYrixktwc6wD/f4DUn8td00AY7ienR0dLVI
10
+ FCzwu8m+NKzja0vDhuhrPPpFtsyFNJG3WYbZCzA0hdqHmGKr78xZxgktlbECmohG
11
+ xxonq0eKNW8nLcmdU4dkrYRGuDLTBL2G0Q5/YB1xaUAOfg9TUBt3jb8I4v0gXUVY
12
+ q3M+STPOAbFt2zpna2W0x3m2l7xLlUAMbxK7K+l6AsfUDYHJFYNaG0PBontNreMs
13
+ +Xth9pvoWE/AsiQss4cyWbrF7EyEFDLxn+WEAxVlXvi2LUupjH8fSg3HyGKmka2B
14
+ dMweTMnHrDtR/iPAyP9xcoXhIH772blmXjZ/wj8cfzK6g+PyC7lkMC8YWDYelHxc
15
+ Mbw6rnMrqJTbjo4uBxOqhwHT52Ny318VHMYVXRSEE9HRwBUxIVlBek45db9wUpG9
16
+ j07oq3nF8rW/0QhkKxmk
17
+ =mSJy
18
+ -----END PGP SIGNATURE-----
data/CHANGELOG.markdown CHANGED
@@ -1,3 +1,7 @@
1
+ # 3.0.3 / 2013-08-01
2
+
3
+ * Updated Highcharts to 3.0.3
4
+
1
5
  # 3.0.2 / 2013-06-07
2
6
 
3
7
  * Updated Highcharts to 3.0.2
data/Rakefile CHANGED
@@ -1 +1,29 @@
1
- require 'bundler/gem_tasks'
1
+ desc "Update to the latest version of Highcharts"
2
+ task :update, :version do |t, args|
3
+ version = args[:version]
4
+ url = "http://code.highcharts.com/zips/Highcharts-#{version}.zip"
5
+ puts "Fetching #{url}"
6
+ #`curl -# #{url} -o tmp/#{version}.zip`
7
+ #`unzip tmp/#{version}.zip -d tmp/#{version}`
8
+
9
+ mappings = {
10
+ "highcharts.src.js" => "highcharts.js",
11
+ "highcharts-more.src.js" => "highcharts/highcharts-more.js",
12
+ "mootools-adapter.src.js" => "highcharts/adapters/mootools.js",
13
+ "prototype-adapter.src.js" => "highcharts/adapters/prototype.js",
14
+ "annotations.src.js" => "highcharts/modules/annotations.js",
15
+ "canvas-tools.src.js" => "highcharts/modules/canvas-tools.js",
16
+ "data.src.js" => "highcharts/modules/data.js",
17
+ "exporting.src.js" => "highcharts/modules/exporting.js",
18
+ "funnel.src.js" => "highcharts/modules/funnel.js",
19
+ "heatmap.src.js" => "highcharts/modules/heatmap.js",
20
+ "map.src.js" => "highcharts/modules/map.js",
21
+ }
22
+ dest = "app/assets/javascripts/"
23
+ Dir.glob("tmp/#{version}/js/**/*.src.js").each do |file|
24
+ name = File.basename(file)
25
+ FileUtils.cp file, "#{dest}#{mappings[name]}", verbose: true
26
+ end
27
+ FileUtils.cp Dir.glob("tmp/#{version}/js/themes/*.js"), "#{dest}highcharts/themes/", verbose: true
28
+ FileUtils.cp Dir.glob("tmp/#{version}/graphics/*.png"), "app/assets/images/highcharts", verbose: true
29
+ end
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Highcharts JS v3.0.2 (2013-06-05)
2
+ * @license Highcharts JS v3.0.3 (2013-07-31)
3
3
  * MooTools adapter
4
4
  *
5
5
  * (c) 2010-2013 Torstein Hønsi
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Highcharts JS v3.0.2 (2013-06-05)
2
+ * @license Highcharts JS v3.0.3 (2013-07-31)
3
3
  * Prototype adapter
4
4
  *
5
5
  * @author Michael Nelson, Torstein Hønsi.
@@ -2,7 +2,7 @@
2
2
  // @compilation_level SIMPLE_OPTIMIZATIONS
3
3
 
4
4
  /**
5
- * @license Highcharts JS v3.0.2 (2013-06-05)
5
+ * @license Highcharts JS v3.0.3 (2013-07-31)
6
6
  *
7
7
  * (c) 2009-2013 Torstein Hønsi
8
8
  *
@@ -33,8 +33,6 @@ var arrayMin = Highcharts.arrayMin,
33
33
  math = Math,
34
34
  mathRound = math.round,
35
35
  mathFloor = math.floor,
36
- mathCeil = math.ceil,
37
- mathMin = math.min,
38
36
  mathMax = math.max,
39
37
  noop = function () {};/**
40
38
  * The Pane object allows options that are common to a set of X and Y axes.
@@ -559,7 +557,7 @@ wrap(tickProto, 'getLabelPosition', function (proceed, x, y, label, horiz, label
559
557
  optionsY = labelOptions.y,
560
558
  ret,
561
559
  align = labelOptions.align,
562
- angle = (axis.translate(this.pos) + axis.startAngleRad + Math.PI / 2) / Math.PI * 180;
560
+ angle = ((axis.translate(this.pos) + axis.startAngleRad + Math.PI / 2) / Math.PI * 180) % 360;
563
561
 
564
562
  if (axis.isRadial) {
565
563
  ret = axis.getPosition(this.pos, (axis.center[2] / 2) + pick(labelOptions.distance, -25));
@@ -697,13 +695,13 @@ seriesTypes.arearange = Highcharts.extendClass(seriesTypes.area, {
697
695
  point.y = null;
698
696
  } else if (low === null) {
699
697
  point.plotLow = point.plotY = null;
700
- point.plotHigh = yAxis.toPixels(high, true);
698
+ point.plotHigh = yAxis.translate(high, 0, 1, 0, 1);
701
699
  } else if (high === null) {
702
700
  point.plotLow = plotY;
703
701
  point.plotHigh = null;
704
702
  } else {
705
703
  point.plotLow = plotY;
706
- point.plotHigh = yAxis.toPixels(high, true);
704
+ point.plotHigh = yAxis.translate(high, 0, 1, 0, 1);
707
705
  }
708
706
  });
709
707
  },
@@ -873,15 +871,26 @@ seriesTypes.columnrange = extendClass(seriesTypes.arearange, {
873
871
 
874
872
  // Set plotLow and plotHigh
875
873
  each(series.points, function (point) {
876
- var shapeArgs = point.shapeArgs;
877
-
874
+ var shapeArgs = point.shapeArgs,
875
+ minPointLength = series.options.minPointLength,
876
+ heightDifference,
877
+ height,
878
+ y;
879
+
878
880
  point.plotHigh = plotHigh = yAxis.translate(point.high, 0, 1, 0, 1);
879
881
  point.plotLow = point.plotY;
880
-
882
+
881
883
  // adjust shape
882
- shapeArgs.y = plotHigh;
883
- shapeArgs.height = point.plotY - plotHigh;
884
-
884
+ y = plotHigh;
885
+ height = point.plotY - plotHigh;
886
+
887
+ if (height < minPointLength) {
888
+ heightDifference = (minPointLength - height);
889
+ height += heightDifference;
890
+ y -= heightDifference / 2;
891
+ }
892
+ shapeArgs.height = height;
893
+ shapeArgs.y = y;
885
894
  });
886
895
  },
887
896
  trackerGroups: ['group', 'dataLabels'],
@@ -891,7 +900,8 @@ seriesTypes.columnrange = extendClass(seriesTypes.arearange, {
891
900
  drawTracker: colProto.drawTracker,
892
901
  animate: colProto.animate,
893
902
  getColumnMetrics: colProto.getColumnMetrics
894
- });/*
903
+ });
904
+ /*
895
905
  * The GaugeSeries class
896
906
  */
897
907
 
@@ -1129,11 +1139,12 @@ defaultPlotOptions.boxplot = merge(defaultPlotOptions.column, {
1129
1139
  threshold: null,
1130
1140
  tooltip: {
1131
1141
  pointFormat: '<span style="color:{series.color};font-weight:bold">{series.name}</span><br/>' +
1132
- 'Minimum: {point.low}<br/>' +
1133
- 'Lower quartile: {point.q1}<br/>' +
1142
+ 'Maximum: {point.high}<br/>' +
1143
+ 'Upper quartile: {point.q3}<br/>' +
1134
1144
  'Median: {point.median}<br/>' +
1135
- 'Higher quartile: {point.q3}<br/>' +
1136
- 'Maximum: {point.high}<br/>'
1145
+ 'Lower quartile: {point.q1}<br/>' +
1146
+ 'Minimum: {point.low}<br/>'
1147
+
1137
1148
  },
1138
1149
  //whiskerColor: null,
1139
1150
  whiskerLength: '50%',
@@ -1421,99 +1432,6 @@ seriesTypes.errorbar = extendClass(seriesTypes.boxplot, {
1421
1432
  * Start Waterfall series code *
1422
1433
  *****************************************************************************/
1423
1434
 
1424
- wrap(axisProto, 'getSeriesExtremes', function (proceed, renew) {
1425
- // Run uber method
1426
- proceed.call(this, renew);
1427
-
1428
- if (this.isXAxis) {
1429
- return;
1430
- }
1431
-
1432
- var axis = this,
1433
- visitedStacks = [],
1434
- resetMinMax = true;
1435
-
1436
-
1437
- // recalculate extremes for each waterfall stack
1438
- each(axis.series, function (series) {
1439
- // process only visible, waterfall series, one from each stack
1440
- if (!series.visible || !series.stackKey || series.type !== 'waterfall' || HighchartsAdapter.inArray(series.stackKey) !== -1) {
1441
- return;
1442
- }
1443
-
1444
- // reset previously found dataMin and dataMax, do it only once
1445
- if (resetMinMax) {
1446
- axis.dataMin = axis.dataMax = null;
1447
- resetMinMax = false;
1448
- }
1449
-
1450
-
1451
- var yData = series.processedYData,
1452
- yDataLength = yData.length,
1453
- seriesDataMin = yData[0],
1454
- seriesDataMax = yData[0],
1455
- threshold = series.options.threshold,
1456
- stacks = axis.stacks,
1457
- stackKey = series.stackKey,
1458
- negKey = '-' + stackKey,
1459
- total,
1460
- previous,
1461
- key,
1462
- i;
1463
-
1464
-
1465
- // set new stack totals including preceding values, finds new min and max values
1466
- for (i = 0; i < yDataLength; i++) {
1467
- key = yData[i] < threshold ? negKey : stackKey;
1468
- total = stacks[key][i].total;
1469
-
1470
- if (i > threshold) {
1471
- total += previous;
1472
- stacks[key][i].setTotal(total);
1473
-
1474
- // _cum is used to avoid conflict with Series.translate method
1475
- stacks[key][i]._cum = null;
1476
- }
1477
-
1478
-
1479
- // find min / max values
1480
- if (total < seriesDataMin) {
1481
- seriesDataMin = total;
1482
- }
1483
-
1484
- if (total > seriesDataMax) {
1485
- seriesDataMax = total;
1486
- }
1487
-
1488
- previous = total;
1489
- }
1490
-
1491
-
1492
- // set new extremes
1493
- series.dataMin = seriesDataMin;
1494
- series.dataMax = seriesDataMax;
1495
- axis.dataMin = mathMin(pick(axis.dataMin, seriesDataMin), seriesDataMin, threshold);
1496
- axis.dataMax = mathMax(pick(axis.dataMax, seriesDataMax), seriesDataMax, threshold);
1497
-
1498
- // remember series' stack key
1499
- visitedStacks.push(series.stackKey);
1500
-
1501
-
1502
-
1503
- // Adjust to threshold. This code is duplicated from the parent getSeriesExtremes method.
1504
- if (typeof threshold === 'number') {
1505
- if (axis.dataMin >= threshold) {
1506
- axis.dataMin = threshold;
1507
- axis.ignoreMinPadding = true;
1508
- } else if (axis.dataMax < threshold) {
1509
- axis.dataMax = threshold;
1510
- axis.ignoreMaxPadding = true;
1511
- }
1512
- }
1513
- });
1514
- });
1515
-
1516
-
1517
1435
  // 1 - set default options
1518
1436
  defaultPlotOptions.waterfall = merge(defaultPlotOptions.column, {
1519
1437
  lineWidth: 1,
@@ -1529,7 +1447,7 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
1529
1447
 
1530
1448
  upColorProp: 'fill',
1531
1449
 
1532
- pointArrayMap: ['y', 'low'],
1450
+ pointArrayMap: ['low', 'y'],
1533
1451
 
1534
1452
  pointValKey: 'y',
1535
1453
 
@@ -1537,7 +1455,9 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
1537
1455
  * Init waterfall series, force stacking
1538
1456
  */
1539
1457
  init: function (chart, options) {
1458
+ // force stacking
1540
1459
  options.stacking = true;
1460
+
1541
1461
  seriesTypes.column.prototype.init.call(this, chart, options);
1542
1462
  },
1543
1463
 
@@ -1551,84 +1471,60 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
1551
1471
  axis = series.yAxis,
1552
1472
  len,
1553
1473
  i,
1554
-
1555
1474
  points,
1556
1475
  point,
1557
1476
  shapeArgs,
1558
- sum,
1559
- sumStart,
1560
- subSum,
1561
- subSumStart,
1562
- edges,
1563
- cumulative,
1564
- prevStack,
1565
- prevY,
1566
1477
  stack,
1478
+ y,
1479
+ previousY,
1480
+ stackPoint,
1481
+ threshold = options.threshold,
1567
1482
  crispCorr = (options.borderWidth % 2) / 2;
1568
1483
 
1569
1484
  // run column series translate
1570
1485
  seriesTypes.column.prototype.translate.apply(this);
1571
1486
 
1487
+ previousY = threshold;
1488
+ points = series.points;
1572
1489
 
1573
- points = this.points;
1574
- subSumStart = sumStart = points[0];
1575
- sum = subSum = points[0].y;
1576
-
1577
- for (i = 1, len = points.length; i < len; i++) {
1490
+ for (i = 0, len = points.length; i < len; i++) {
1578
1491
  // cache current point object
1579
1492
  point = points[i];
1580
1493
  shapeArgs = point.shapeArgs;
1581
1494
 
1582
- // get current and previous stack
1495
+ // get current stack
1583
1496
  stack = series.getStack(i);
1584
- prevStack = series.getStack(i - 1);
1585
- prevY = series.getStackY(prevStack);
1497
+ stackPoint = stack.points[series.index];
1586
1498
 
1587
- // set new intermediate sum values after reset
1588
- if (subSumStart === null) {
1589
- subSumStart = point;
1590
- subSum = 0;
1499
+ // override point value for sums
1500
+ if (isNaN(point.y)) {
1501
+ point.y = series.yData[i];
1591
1502
  }
1592
1503
 
1593
- // sum only points with value, not intermediate or total sum
1594
- if (point.y && !point.isSum && !point.isIntermediateSum) {
1595
- sum += point.y;
1596
- subSum += point.y;
1597
- }
1504
+ // up points
1505
+ y = mathMax(previousY, previousY + point.y) + stackPoint[0];
1506
+ shapeArgs.y = axis.translate(y, 0, 1);
1598
1507
 
1599
- // calculate sum points
1600
- if (point.isSum || point.isIntermediateSum) {
1601
1508
 
1602
- if (point.isIntermediateSum) {
1603
- edges = series.getSumEdges(subSumStart, points[i - 1]);
1604
- point.y = subSum;
1605
- subSumStart = null;
1606
- } else {
1607
- edges = series.getSumEdges(sumStart, points[i - 1]);
1608
- point.y = sum;
1609
- }
1610
-
1611
- shapeArgs.y = point.plotY = edges[1];
1612
- shapeArgs.height = edges[0] - edges[1];
1509
+ // sum points
1510
+ if (point.isSum || point.isIntermediateSum) {
1511
+ shapeArgs.y = axis.translate(stackPoint[1], 0, 1);
1512
+ shapeArgs.height = axis.translate(stackPoint[0], 0, 1) - shapeArgs.y;
1613
1513
 
1614
- // calculate other (up or down) points based on y value
1514
+ // if it's not the sum point, update previous stack end position
1615
1515
  } else {
1616
- // use "_cum" instead of already calculated "cum" to avoid reverse ordering negative columns
1617
- cumulative = stack._cum === null ? prevStack.total : stack._cum;
1618
- stack._cum = cumulative + point.y;
1619
-
1620
- if (point.y < 0) {
1621
- shapeArgs.y = mathCeil(axis.translate(cumulative, 0, 1)) - crispCorr;
1622
- shapeArgs.height = mathCeil(axis.translate(stack._cum, 0, 1) - shapeArgs.y);
1623
- } else {
1624
- if (prevStack.total + point.y < 0) {
1625
- shapeArgs.y = axis.translate(stack._cum, 0, 1);
1626
- }
1627
-
1628
- shapeArgs.height = mathFloor(prevY - shapeArgs.y);
1629
- }
1516
+ previousY += stack.total;
1517
+ }
1630
1518
 
1519
+ // negative points
1520
+ if (shapeArgs.height < 0) {
1521
+ shapeArgs.y += shapeArgs.height;
1522
+ shapeArgs.height *= -1;
1631
1523
  }
1524
+
1525
+ point.plotY = shapeArgs.y = mathRound(shapeArgs.y) - crispCorr;
1526
+ shapeArgs.height = mathRound(shapeArgs.height);
1527
+ point.yBottom = shapeArgs.y + shapeArgs.height;
1632
1528
  }
1633
1529
  },
1634
1530
 
@@ -1636,44 +1532,48 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
1636
1532
  * Call default processData then override yData to reflect waterfall's extremes on yAxis
1637
1533
  */
1638
1534
  processData: function (force) {
1639
- Series.prototype.processData.call(this, force);
1640
-
1641
1535
  var series = this,
1642
1536
  options = series.options,
1643
1537
  yData = series.yData,
1644
- length = yData.length,
1645
- prev,
1646
- curr,
1538
+ points = series.points,
1539
+ point,
1540
+ dataLength = yData.length,
1541
+ threshold = options.threshold || 0,
1647
1542
  subSum,
1648
1543
  sum,
1544
+ dataMin,
1545
+ dataMax,
1546
+ y,
1649
1547
  i;
1650
1548
 
1651
- prev = sum = subSum = options.threshold;
1652
-
1653
- for (i = 0; i < length; i++) {
1654
- curr = yData[i];
1655
-
1656
- // processed yData only if it's not already processed
1657
- if (curr !== null && typeof curr !== 'number') {
1549
+ sum = subSum = dataMin = dataMax = threshold;
1658
1550
 
1659
- if (curr === "sum") {
1660
- yData[i] = null;
1661
-
1662
- } else if (curr === "intermediateSum") {
1663
- yData[i] = null;
1664
- subSum = prev;
1665
-
1666
- } else {
1667
- yData[i] = curr[0];// + prev;
1668
- }
1551
+ for (i = 0; i < dataLength; i++) {
1552
+ y = yData[i];
1553
+ point = points ? points[i] : {};
1669
1554
 
1670
- prev = yData[i];
1555
+ if (y === "sum" || point.isSum) {
1556
+ yData[i] = sum;
1557
+ } else if (y === "intermediateSum" || point.isIntermediateSum) {
1558
+ yData[i] = subSum;
1559
+ subSum = threshold;
1560
+ } else {
1561
+ sum += y;
1562
+ subSum += y;
1671
1563
  }
1564
+ dataMin = Math.min(sum, dataMin);
1565
+ dataMax = Math.max(sum, dataMax);
1672
1566
  }
1567
+
1568
+ Series.prototype.processData.call(this, force);
1569
+
1570
+ // Record extremes
1571
+ series.dataMin = dataMin;
1572
+ series.dataMax = dataMax;
1673
1573
  },
1674
1574
 
1675
1575
  /**
1676
- * Return [y, low] array, if low is not defined, it's replaced with null for further calculations
1576
+ * Return y value or string if point is sum
1677
1577
  */
1678
1578
  toYData: function (pt) {
1679
1579
  if (pt.isSum) {
@@ -1682,7 +1582,7 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
1682
1582
  return "intermediateSum";
1683
1583
  }
1684
1584
 
1685
- return [pt.y];
1585
+ return pt.y;
1686
1586
  },
1687
1587
 
1688
1588
  /**
@@ -1750,6 +1650,14 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
1750
1650
  return path;
1751
1651
  },
1752
1652
 
1653
+ /**
1654
+ * Extremes are recorded in processData
1655
+ */
1656
+ getExtremes: noop,
1657
+
1658
+ /**
1659
+ * Return stack for given index
1660
+ */
1753
1661
  getStack: function (i) {
1754
1662
  var axis = this.yAxis,
1755
1663
  stacks = axis.stacks,
@@ -1762,31 +1670,6 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
1762
1670
  return stacks[key][i];
1763
1671
  },
1764
1672
 
1765
- getStackY: function (stack) {
1766
- return mathCeil(this.yAxis.translate(stack.total, null, true));
1767
- },
1768
-
1769
- /**
1770
- * Return array of top and bottom position for sum column based on given edge points
1771
- */
1772
- getSumEdges: function (pointA, pointB) {
1773
- var valueA,
1774
- valueB,
1775
- tmp,
1776
- threshold = this.options.threshold;
1777
-
1778
- valueA = pointA.y >= threshold ? pointA.shapeArgs.y + pointA.shapeArgs.height : pointA.shapeArgs.y;
1779
- valueB = pointB.y >= threshold ? pointB.shapeArgs.y : pointB.shapeArgs.y + pointB.shapeArgs.height;
1780
-
1781
- if (valueB > valueA) {
1782
- tmp = valueA;
1783
- valueA = valueB;
1784
- valueB = tmp;
1785
- }
1786
-
1787
- return [valueA, valueB];
1788
- },
1789
-
1790
1673
  drawGraph: Series.prototype.drawGraph
1791
1674
  });
1792
1675
 
@@ -1819,6 +1702,7 @@ defaultPlotOptions.bubble = merge(defaultPlotOptions.scatter, {
1819
1702
  tooltip: {
1820
1703
  pointFormat: '({point.x}, {point.y}), Size: {point.z}'
1821
1704
  },
1705
+ turboThreshold: 0, // docs: exclude from bubbles
1822
1706
  zThreshold: 0
1823
1707
  });
1824
1708
 
@@ -1976,7 +1860,8 @@ seriesTypes.bubble = extendClass(seriesTypes.scatter, {
1976
1860
  radius
1977
1861
  ).attr({
1978
1862
  zIndex: 3
1979
- }).add(item.legendGroup);
1863
+ }).add(item.legendGroup);
1864
+ item.legendSymbol.isMarker = true;
1980
1865
 
1981
1866
  },
1982
1867
 
@@ -2108,7 +1993,7 @@ seriesProto.toXY = function (point) {
2108
1993
  point.rectPlotY = plotY;
2109
1994
 
2110
1995
  // Record the angle in degrees for use in tooltip
2111
- point.clientX = plotX / Math.PI * 180;
1996
+ point.clientX = ((plotX / Math.PI * 180) + this.xAxis.pane.options.startAngle) % 360;
2112
1997
 
2113
1998
  // Find the polar plotX and plotY
2114
1999
  xy = this.xAxis.postTranslate(point.plotX, this.yAxis.len - plotY);
@@ -2116,6 +2001,22 @@ seriesProto.toXY = function (point) {
2116
2001
  point.plotY = point.polarPlotY = xy.y - chart.plotTop;
2117
2002
  };
2118
2003
 
2004
+ /**
2005
+ * Order the tooltip points to get the mouse capture ranges correct. #1915.
2006
+ */
2007
+ seriesProto.orderTooltipPoints = function (points) {
2008
+ if (this.chart.polar) {
2009
+ points.sort(function (a, b) {
2010
+ return a.clientX - b.clientX;
2011
+ });
2012
+
2013
+ // Wrap mouse tracking around to capture movement on the segment to the left
2014
+ // of the north point (#1469).
2015
+ points[0].wrappedClientX = points[0].clientX + 360;
2016
+ points.push(points[0]);
2017
+ }
2018
+ };
2019
+
2119
2020
 
2120
2021
  /**
2121
2022
  * Add some special init logic to areas and areasplines