Commits

Anonymous committed 760da16

Fixed click and double click zoom handlers to check if appropriate option is set on current plot.
Updated change log for zooming.
Updated and added tests.

  • Participants
  • Parent commits 26c5634

Comments (0)

Files changed (6)

File src/changes.txt

 Title: Change Log
 
+0.8.5:
+
+* Added zooming ability with double click or single click options to reset zoom.
+* Modified default tick spacing algorithm for date axes to give more space to ticks.
+* Fixed bug #2 where tickInterval wasn't working properly.
+* Added neighborThreshold option to control how close mouse must be to 
+  point to trigger neighbor detection.
+* Added double click event handler on plot.
+
 0.8.0:
 
 * Support for up to 9 y axes.
 * Added option to control padding at max/min bounds of axes separately.
 * Closed issue #21, added options to control grid line color and width.
-* Closed issue #20, added options to filled line charts to stoke above fill and customize fill color and transparency.
-* Improved structure of on line documentation to make usage and options docs default.
+* Closed issue #20, added options to filled line charts to stoke above 
+  fill and customize fill color and transparency.
+* Improved structure of on line documentation to make usage and options 
+  docs default.
 * Added much documentation on options and css styling.
 
 0.7.1:
 
 * Bug fix release
 * Fixed bug #6, missing semi-colons messing up some javascript compressors.
-* Fixed bug #13 where 2D ticks array of [values, labels] would fail to renderer with DateAxisRenderer.
-* Fixes bug #16 where pie renderer overwriting options for all plot types and crashing non pie plots.
-* Fixes bug #17 constrainTo dragable option mispelled as "contstrainTo".  Fixed dragable color issue when used with trend lines.
+* Fixed bug #13 where 2D ticks array of [values, labels] would fail to 
+  renderer with DateAxisRenderer.
+* Fixes bug #16 where pie renderer overwriting options for all plot types 
+  and crashing non pie plots.
+* Fixes bug #17 constrainTo dragable option mispelled as "contstrainTo".  
+  Fixed dragable color issue when used with trend lines.
 
 0.7.0:
 
 * Pie chart support
 * Enabled tooltipLocation option in highlighter. 
-* Highlighter Tooltip will account for mark size and highlight size when positioning itself. 
+* Highlighter Tooltip will account for mark size and highlight size when 
+  positioning itself. 
 * Added ability to show just x, y or both axes in highlighter tooltip.
 * Added customization of separator between axes values in highlighter tooltip.
-* Modified how shadows are drawn for lines, bars and markers.  Now drawn first, so they are always behind the object.
+* Modified how shadows are drawn for lines, bars and markers.  Now drawn first, 
+  so they are always behind the object.
 * Adjustments to shadow parameters on lines to account for new shadow positioning.
-* Added a ColorGenerator class to robustly return next available color for a plot with wrap around to first color at end.
+* Added a ColorGenerator class to robustly return next available color 
+  for a plot with wrap around to first color at end.
 * Udates to docs about css file.
 * Fixed bug with String x values in series and IE error on sorting (Category Axis).
 * Added cursor changes in dragable plugin when cursor near dragable point.
 0.6.6b:
 
 * Added excanvas.js and excanvas.min.js to compressed distributions.
-* Added example/test html pages I had locally into repository and to compressed distributions.
+* Added example/test html pages I had locally into repository and to 
+  compressed distributions.
 
 0.6.6a:
 
 * Removed absolute positioning from dom element and put back into css file.
-* Duplicate of 0.6.6 with a suffix to unambiguously differentiate between previously posted 0.6.6 release.
+* Duplicate of 0.6.6 with a suffix to unambiguously differentiate between 
+  previously posted 0.6.6 release.
 
 0.6.6:
 
 * Fixed bug #5, trend line plugin failing when no trend line options specified.
 * Added absolute position css spec to axis tick dom element.
-* Enhancement to category axes, more intuitive handling of series with missing data values.
+* Enhancement to category axes, more intuitive handling of series with 
+  missing data values.
 
 0.6.5:
 
-* Fixed bug #4, series of unequal data length not rendering correctly.  This is a bugfix release only.
+* Fixed bug #4, series of unequal data length not rendering correctly.  
+  This is a bugfix release only.
 
 0.6.4:
 
-* Fixed bug (issue #1 in tracker) where flat line data series (all x and/or y values are euqal) or single value data series would crash.
+* Fixed bug (issue #1 in tracker) where flat line data series (all x and/or y 
+  values are euqal) or single value data series would crash.
 
 0.6.3:
 
-* Support for stacked line (a.k.a. area) and stacked bar (horizontal and vertical) charts.
+* Support for stacked line (a.k.a. area) and stacked bar (horizontal and 
+  vertical) charts.
 * Refactored barRenderer to use default shape and shadow renderers.
 * Added info (contacts & support information) page to web site.
 
 
 0.6.0:
 
-* Added rotated text support.  Uses native canvas text functionality in browsers that support it or draws text on canvas with Hershey font
+* Added rotated text support.  Uses native canvas text functionality in 
+  browsers that support it or draws text on canvas with Hershey font
 * metrics for non-supporting browsers.
 * Removed lots of lint in js code.
 * Moved tick css from js code into css file.

File src/plugins/jqplot.cursor.js

 * This software is licensed under the GPL version 2.0 and MIT licenses.
 */
 (function($) {
-	$.jqplot.eventListenerHooks.push(['jqplotMouseEnter', handleMouseEnter]);
-	$.jqplot.eventListenerHooks.push(['jqplotMouseLeave', handleMouseLeave]);
-    $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMouseMove]);
-    $.jqplot.eventListenerHooks.push(['jqplotMouseDown', handleMouseDown]);
-    $.jqplot.eventListenerHooks.push(['jqplotMouseUp', handleMouseUp]);
 	
 	/**
 	 * Class: $.jqplot.Cursor
 	    // prop: zoom
 	    // Enable plot zooming.
 	    this.zoom = false;
-	    this._zoom = {start:[], end:[], zooming:false, axes:{start:{}, end:{}}};
+	    // prop: clickReset
+	    // Will reset plot zoom if single click on plot without drag.
+	    this.clickReset = false;
+	    // prop: dblClickReset
+	    // Will reset plot zoom if double click on plot without drag.
+	    this.dblClickReset = true;
+	    this._zoom = {start:[], end:[], started: false, zooming:false, axes:{start:{}, end:{}}};
 	    this._tooltipElem;
 	    this.zoomCanvas;
 	    $.extend(true, this, options);
 	    // add a cursor attribute to the plot
 	    var options = opts || {};
 	    this.plugins.cursor = new $.jqplot.Cursor(options.cursor);
+
+        if (this.plugins.cursor.show) {
+        	$.jqplot.eventListenerHooks.push(['jqplotMouseEnter', handleMouseEnter]);
+        	$.jqplot.eventListenerHooks.push(['jqplotMouseLeave', handleMouseLeave]);
+            $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMouseMove]);
+            
+            if (this.plugins.cursor.zoom) {
+                $.jqplot.eventListenerHooks.push(['jqplotMouseDown', handleMouseDown]);
+                $.jqplot.eventListenerHooks.push(['jqplotMouseUp', handleMouseUp]);
+                
+                if (this.plugins.cursor.clickReset) {
+                    $.jqplot.eventListenerHooks.push(['jqplotClick', handleClick]);
+                }
+                
+                if (this.plugins.cursor.dblClickReset) {
+                    $.jqplot.eventListenerHooks.push(['jqplotDblClick', handleDblClick]);
+                }
+            }
+        }
 	};
 	
 	// called with context of plot
 	    var axes = plot.axes;
 	    var cax = plot.plugins.cursor._zoom.axes;
 	    for (var ax in axes) {
-	        axes[ax]._ticks = cax[ax]._ticks;
+            axes[ax]._ticks = [];
 	        axes[ax].min = cax[ax].min;
 	        axes[ax].max = cax[ax].max;
 	        axes[ax].numberTicks = cax[ax].numberTicks; 
 	        axes[ax].tickInterval = cax[ax].tickInterval;
+	        // for date axes
+	        axes[ax]._tickInterval = cax[ax]._tickInterval;
 	    }
 	    plot.redraw();
 	};
         }
 	}
 	
+	function handleClick (ev, gridpos, datapos, neighbor, plot) {
+	    var c = plot.plugins.cursor;
+        if (c.clickReset) {
+            $.jqplot.Cursor.resetZoom(plot);
+        }
+        return true;
+	}
+	
+	function handleDblClick (ev, gridpos, datapos, neighbor, plot) {
+	    var c = plot.plugins.cursor;
+        if (c.dblClickReset) {
+            $.jqplot.Cursor.resetZoom(plot);
+        }
+        return;
+	}
+	
+	function handleMouseLeave(ev, gridpos, datapos, neighbor, plot) {
+	    var c = plot.plugins.cursor;
+	    if (c.show) {
+	        $(ev.target).css('cursor', c.previousCursor);
+            if (c.showTooltip) {
+                c._tooltipElem.hide();
+            }
+            if (c.zoom) {
+                c._zoom.started = false;
+                c._zoom.zooming = false;
+	            var ctx = c.zoomCanvas._ctx;
+                ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);
+                
+            }
+	    }
+	}
+	
 	function handleMouseEnter(ev, gridpos, datapos, neighbor, plot) {
 	    var c = plot.plugins.cursor;
 	    if (c.show) {
 	    }
 	}
 	
-	function handleMouseLeave(ev, gridpos, datapos, neighbor, plot) {
-	    var c = plot.plugins.cursor;
-	    if (c.show) {
-	        $(ev.target).css('cursor', c.previousCursor);
-            if (c.showTooltip) {
-                c._tooltipElem.hide();
-            }
-	    }
-	}
-	
 	function handleMouseMove(ev, gridpos, datapos, neighbor, plot) {
     	var c = plot.plugins.cursor;
-    	if (c.show && c.showTooltip) {
-            updateTooltip(gridpos, datapos, plot);
-            if (c.followMouse) {
-                moveTooltip(gridpos, plot);
-            }
-            if (c.zoom && c._zoom.zooming) {
+    	if (c.show) {
+    	    if (c.showTooltip) {
+                updateTooltip(gridpos, datapos, plot);
+                if (c.followMouse) {
+                    moveTooltip(gridpos, plot);
+                }
+    	    }
+            if (c.zoom && c._zoom.started) {
+                c._zoom.zooming = true;
                 c._zoom.end = [gridpos.x, gridpos.y];
                 drawZoomBox.call(c);
             }
 	
 	function handleMouseDown(ev, gridpos, datapos, neighbor, plot) {
 	    var c = plot.plugins.cursor;
+	    var axes = plot.axes;
 	    if (c.zoom) {
 	        c._zoom.start = [gridpos.x, gridpos.y];
-	        c._zoom.zooming = true;
+	        c._zoom.started = true;
             for (var ax in datapos) {
+                // get zoom starting position.
                 c._zoom.axes.start[ax] = datapos[ax];
                 // make a copy of the original axes to revert back.
                 if (c._zoom.axes[ax] == undefined) {
                     c._zoom.axes[ax] = {};
-                    c._zoom.axes[ax]._ticks = $.extend(true, [], plot.axes[ax]._ticks);
-                    c._zoom.axes[ax].numberTicks = plot.axes[ax].numberTicks;
-                    c._zoom.axes[ax].tickInterval = plot.axes[ax].tickInterval;
-                    c._zoom.axes[ax].min = plot.axes[ax].min;
-                    c._zoom.axes[ax].max = plot.axes[ax].max;
+                    c._zoom.axes[ax].numberTicks = axes[ax].numberTicks;
+                    c._zoom.axes[ax].tickInterval = axes[ax].tickInterval;
+                    // for date axes...
+                    c._zoom.axes[ax]._tickInterval = axes[ax]._tickInterval;
+                    c._zoom.axes[ax].min = axes[ax].min;
+                    c._zoom.axes[ax].max = axes[ax].max;
                 }
                 
             }
 	
 	function handleMouseUp(ev, gridpos, datapos, neighbor, plot) {
 	    var c = plot.plugins.cursor;
-	    if (c.zoom) {
+	    if (c.zoom && c._zoom.zooming) {
 	        var axes = plot.axes;
 	        var zaxes = c._zoom.axes;
 	        var start = zaxes.start;
 	        var end = zaxes.end;
 	        var min, max;
-	        c._zoom.zooming = false;
 	        var ctx = c.zoomCanvas._ctx;
             ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);
-            for (var ax in datapos) {
-                dp = datapos[ax];
-                if (dp != null) {
-                    if (dp > start[ax]) {
-                        axes[ax].min = start[ax];
-                        axes[ax].max = dp;
+            // don't zoom is zoom area is too small (in pixels)
+            if (!(Math.abs(gridpos.x - c._zoom.start[0]) < 8 || Math.abs(gridpos.y - c._zoom.start[1]) < 8)) {
+                for (var ax in datapos) {
+                    dp = datapos[ax];
+                    if (dp != null) {           
+                        if (dp > start[ax]) { 
+                            axes[ax].min = start[ax];
+                            axes[ax].max = dp;
+                        }
+                        else {
+                            span = start[ax] - dp;
+                            axes[ax].max = start[ax];
+                            axes[ax].min = dp;
+                        }
+                        axes[ax].tickInterval = null;
+                        // for date axes...
+                        axes[ax]._tickInterval = null;
+                        axes[ax]._ticks = [];
                     }
-                    else {
-                        axes[ax].max = start[ax];
-                        axes[ax].min = dp;
-                    }
-                    axes[ax]._ticks = [];
                 }
+                plot.redraw();
             }
-            plot.redraw();
         }
+        c._zoom.started = false;
+        c._zoom.zooming = false;
 	}
 	
 	function drawZoomBox() {

File tests/closer.php

 <?php
-  $pages = array('coretests.php', 'pieTests.php', 'multipleYAxesTests.php', 'logAxisTests.php', 'dateAxisTests.php', 'categoryAxisTests.php', 'barRendererTests.php', 'dragableTests.php', 'stackedTests.php', 'canvasAxisTests.php', 'highlighterTests.php');
+  $pages = array('coretests.php', 'pieTests.php', 'multipleYAxesTests.php', 'logAxisTests.php', 'dateAxisTests.php', 'highlighterTests.php', 'zoomTests.php', 'categoryAxisTests.php', 'barRendererTests.php', 'dragableTests.php', 'stackedTests.php', 'canvasAxisTests.php');
         
   $len = count($pages);
   $parts = explode("/", $_SERVER["REQUEST_URI"]);

File tests/highlighterTests.php

 <?php
   $title = "jqPlot Highlighter and Cursor Plugin Tests";
-  $jspec_title = "jqPlot Data Point Highlighter and Cursor Tracking Plugin Tests and Examples";
+  $jspec_title = "jqPlot Data Point Highlighter and Cursor Tracking Plugin";
   $jqplot_js_includes = array();
   $jqplot_js_includes[] = "../src/plugins/jqplot.dateAxisRenderer.js";
   $jqplot_js_includes[] = "../src/plugins/jqplot.canvasTextRenderer.js";

File tests/index.html

         <div id="jspec-top">
           <div id="jspec-title">jqPlot Unit Tests and Examples</div>
           <div class="nav top">
-            <a href="highlighterTests.php"><img src="images/arrow_left_48.png" /></a>  
+            <a href="canvasAxisTests.php"><img src="images/arrow_left_48.png" /></a>  
             <a href="./index.html"><img src="images/arrow_up_48.png" /></a>
             <a href="coretests.php"><img src="images/arrow_right_48.png" /></a>
           </div>
               <tr class="description"><td><a href="multipleYAxesTests.php">Multiple Y Axes</a></td></tr>
               <tr class="description"><td><a href="logAxisTests.php">Log Axes</a></td></tr>
               <tr class="description"><td><a href="dateAxisTests.php">Date Axes</a></td></tr>
+              <tr class="description"><td><a href="highlighterTests.php">Data Point Highlighter</a></td></tr>
+              <tr class="description"><td><a href="zoomTests.php">Plot Zooming</a></td></tr>
               <tr class="description"><td><a href="categoryAxisTests.php">Category Axes</a></td></tr>
               <tr class="description"><td><a href="barRendererTests.php">Bar Charts</a></td></tr>
               <tr class="description"><td><a href="dragableTests.php">Drag and Drop and Trend Lines</a></td></tr>
               <tr class="description"><td><a href="stackedTests.php">Stacked Bar and Line Charts</a></td></tr>
               <tr class="description"><td><a href="canvasAxisTests.php">Rotated Axis Text</a></td></tr>
-              <tr class="description"><td><a href="highlighterTests.php">Data Point Highlighter</a></td></tr>
             </table>
           </div>
         </div>

File tests/zoomTests.php

   require("opener.php");
 ?>
   <script language="javascript" type="text/javascript">
-var goog = [["6/22/2009",425.32],["6/15/2009",420.09],["6/8/2009",424.84],["6/1/2009",444.32],["5/26/2009",417.23],["5/18/2009",393.5],["5/11/2009",390],["5/4/2009",407.33],["4/27/2009",393.69],["4/20/2009",389.49],["4/13/2009",392.24],["4/6/2009",372.5],["3/30/2009",369.78],["3/23/2009",347.7],["3/16/2009",330.16],
-["3/9/2009",324.42],["3/2/2009",308.57],["2/23/2009",337.99],["2/17/2009",346.45],["2/9/2009",357.68],["2/2/2009",371.28],["1/26/2009",338.53],["1/20/2009",324.7],["1/12/2009",299.67],["1/5/2009",315.07],["12/29/2008",321.32],["12/22/2008",300.36],["12/15/2008",310.17],["12/8/2008",315.76],["12/1/2008",283.99],["11/24/2008",292.96],["11/17/2008",262.43],["11/10/2008",310.02],["11/3/2008",331.14],["10/27/2008",359.36],["10/20/2008",339.29],["10/13/2008",372.54],["10/6/2008",332],["9/29/2008",386.91],["9/22/2008",431.04],["9/15/2008",449.15],["9/8/2008",437.66],["9/2/2008",444.25],["8/25/2008",463.29],
-["8/18/2008",490.59],["8/11/2008",510.15],["8/4/2008",495.01],["7/28/2008",467.86],["7/21/2008",491.98],["7/14/2008",481.32],["7/7/2008",533.8],["6/30/2008",537],["6/23/2008",528.07],["6/16/2008",546.43],["6/9/2008",571.51],["6/2/2008",567],["5/27/2008",585.8],["5/19/2008",544.62],["5/12/2008",580.07],["5/5/2008",573.2],["4/28/2008",581.29],["4/21/2008",544.06],["4/14/2008",539.41],["4/7/2008",457.45],["3/31/2008",471.09],["3/24/2008",438.08],["3/17/2008",433.55],["3/10/2008",437.92],["3/3/2008",433.35],["2/25/2008",471.18],["2/19/2008",507.8],["2/11/2008",529.64],["2/4/2008",516.69],["1/28/2008",515.9],
-["1/22/2008",566.4],["1/14/2008",600.25],["1/7/2008",638.25],["12/31/2007",657],["12/24/2007",702.53],["12/17/2007",696.69],["12/10/2007",689.96],["12/3/2007",714.87],["11/26/2007",693],["11/19/2007",676.7],["11/12/2007",633.63],["11/5/2007",663.97],["10/29/2007",711.25],["10/22/2007",674.6],["10/15/2007",644.71],["10/8/2007",637.39],["10/1/2007",594.05],["9/24/2007",567.27],["9/17/2007",560.1],["9/10/2007",528.75],["9/4/2007",519.35],["8/27/2007",515.25],["8/20/2007",515]];
+var goog = [["6/22/2009",425.32],
+["6/8/2009",424.84],
+["5/26/2009",417.23],
+["5/11/2009",390],
+["4/27/2009",393.69],
+["4/13/2009",392.24],
+["3/30/2009",369.78],
+["3/16/2009",330.16],
+["3/2/2009",308.57],
+["2/17/2009",346.45],
+["2/2/2009",371.28],
+["1/20/2009",324.7],
+["1/5/2009",315.07],
+["12/22/2008",300.36],
+["12/8/2008",315.76],
+["11/24/2008",292.96],
+["11/10/2008",310.02],
+["10/27/2008",359.36],
+["10/13/2008",372.54],
+["9/29/2008",386.91],
+["9/15/2008",449.15],
+["9/2/2008",444.25],
+["8/25/2008",463.29],
+["8/11/2008",510.15],
+["7/28/2008",467.86],
+["7/14/2008",481.32],
+["6/30/2008",537],
+["6/16/2008",546.43],
+["6/2/2008",567],
+["5/19/2008",544.62],
+["5/5/2008",573.2],
+["4/21/2008",544.06],
+["4/7/2008",457.45],
+["3/24/2008",438.08],
+["3/10/2008",437.92],
+["2/25/2008",471.18],
+["2/11/2008",529.64],
+["1/28/2008",515.9],
+["1/14/2008",600.25],
+["12/31/2007",657],
+["12/17/2007",696.69],
+["12/3/2007",714.87],
+["11/19/2007",676.7],
+["11/5/2007",663.97],
+["10/22/2007",674.6],
+["10/8/2007",637.39],
+["9/24/2007",567.27],
+["9/10/2007",528.75],
+["8/27/2007",515.25]];
 var InPr = [[0.0,85.0],[10.0,87.4],[20.0,90.0],[30.0,91.3],[40.0,93.5],[50.0,94.1],[60.0,95.4],[70.0,95.8],[80.0,96.1],[90.0,97.6],[100.0,97.4],[110.0,97.7],[120.0,97.9],[130.0,98.3],[140.0,97.9],[150.0,98.4],[160.0,99.8],[170.0,100.5],[180.0,100.4],[190.0,100.3],[200.0,102.9],[210.0,104.1],[220.0,104.4],[230.0,103.9],[240.0,104.4],[250.0,104.0],[260.0,103.9],[270.0,103.5],[280.0,105.4],[290.0,105.7],[300.0,105.7],[310.0,105.3],[320.0,105.0],[330.0,105.1],[340.0,105.0],[350.0,105.1],[360.0,104.7],[370.0,104.4],[380.0,104.3],[390.0,105.7],[400.0,106.4],[410.0,105.7],[420.0,105.4],[430.0,105.7],[440.0,105.7],[450.0,105.9],[460.0,105.3],[470.0,105.7],[480.0,105.8],[490.0,105.4],[500.0,105.4],[510.0,105.4],[520.0,105.6],[530.0,104.9],[540.0,104.8],[550.0,105.2],[560.0,105.2],[570.0,105.1],[580.0,104.8],[590.0,104.6],[600.0,104.3],[610.0,104.2],[620.0,104.1],[630.0,104.7],[640.0,104.6],[650.0,104.7],[660.0,104.6],[670.0,104.4],[680.0,106.8],[690.0,106.6],
 [700.0,106.3],[710.0,107.1],[720.0,106.2],[730.0,106.1],[740.0,106.7],[750.0,106.5],[760.0,106.8],[770.0,106.7],[780.0,106.6],[790.0,106.7],[800.0,106.8],[810.0,106.4],[820.0,106.7],[830.0,106.5],[840.0,106.9],[850.0,106.7],[860.0,106.7],[870.0,106.8],[880.0,107.1],[890.0,106.6],[900.0,106.8],[910.0,106.9],[920.0,106.8],[930.0,107.3],[940.0,106.9],[950.0,106.5],[960.0,107.2],[970.0,107.0],[980.0,106.9],[990.0,107.2],[1000.0,107.7],[1010.0,107.6],[1020.0,107.1],[1030.0,107.6],[1040.0,107.2],[1050.0,107.2],[1060.0,107.5],[1070.0,107.7],[1080.0,107.3],[1090.0,107.0],[1100.0,107.7],[1110.0,107.0],[1120.0,107.8],[1130.0,107.8],[1140.0,107.7],[1150.0,107.4],[1160.0,107.8],[1170.0,107.8],[1180.0,107.6],[1190.0,107.7],[1200.0,107.4],[1210.0,108.0],[1220.0,372.6],[1230.0,90.4],[1240.0,125.0],[1250.0,110.4],[1260.0,108.5],[1270.0,109.7],[1280.0,108.9],[1290.0,109.6],[1300.0,110.2],[1310.0,110.0],[1320.0,110.7],[1330.0,110.3],[1340.0,110.6],[1350.0,110.5],
 [1360.0,110.8],[1370.0,110.6],[1380.0,111.0],[1390.0,113.0],[1400.0,112.1],[1410.0,112.3],[1420.0,112.3],[1430.0,137.6],[1440.0,179.0],[1450.0,216.9],[1460.0,399.2],[1470.0,433.6],[1480.0,203.5],[1490.0,223.3],[1500.0,229.8],[1510.0,416.9],[1520.0,198.8],[1530.0,208.7],[1540.0,172.0],[1550.0,145.7],[1560.0,119.2],[1570.0,104.8],[1580.0,100.1],[1590.0,97.7],[1600.0,97.2],[1610.0,98.8],[1620.0,98.1],[1630.0,98.1],[1640.0,98.8],[1650.0,98.7],[1660.0,98.5],[1670.0,98.8],[1680.0,98.2],[1690.0,98.2],[1700.0,97.7],[1710.0,98.1],[1720.0,97.1],[1730.0,97.6],[1740.0,97.7],[1750.0,97.4],[1760.0,97.6],[1770.0,98.0],[1780.0,97.6],[1790.0,97.7],[1800.0,97.8],[1810.0,97.6],[1820.0,97.9],