From 5a7c740369d6afdfc3b4c32795c7d21162ec1c0e Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 11 Apr 2019 16:49:02 +0200 Subject: [PATCH] feat: add band area chart (#157) This PR adds a `y0Accessors` prop for each `SeriesSpec`: this property can be used to describe a dataset with bands ( with a min and max value for each data point). It's mainly used for with `AreaSeries` to describe a bounded area chart, bounded on the y axis. The `y0` value, is usually a lower value than the `y1`, it will be rendered perpendicularly to the `y1` point. On a standard area chart, the `y0` value usually correspond to `0` or to the previous value in the stack. In a band-area chart, the `y0` can be any value below the `y1` value. It can also be applied to bar charts, with some limitations as described below. On a barchart, the `y0` value is the bottom edge of the bar. On a stacked bar/area chart a series with a `y0Accessor` will be stacked on top of the below series stacking the below series `y1` value with the band series `y0` value. This means that if the below series at a point X has an height of `10`, and the bound series has the following values: `y0: 2, y1: 5` the resulting chart will push the bound series to the top starting using the following values: `y0:12, y1: 15`. The `IndexedGeometry` object is also refactored. To limit amount of redundant code/memory object we used the same `Geometry` elements used on the highlight/hover process. The structure of `IndexedGeometry` is slightly changed, to avoid duplicate values and to simplify tooltip formatting when rendering either y1 and y0 values. I've currently removed from the `indexedGeometries` map all geometry with `null` values on `y1`. This leads to a minor problem: we are not showing any tooltip on that interval, the tooltip of the crosshair is never shown. close #144 --- .../osd-charts/src/components/highlighter.tsx | 24 +- .../react_canvas/area_geometries.tsx | 59 +- .../utils/rendering_props_utils.test.ts | 5 +- .../utils/rendering_props_utils.ts | 8 +- .../series/__snapshots__/series.test.ts.snap | 4771 ++++++++++++++++- .../src/lib/series/domains/y_domain.test.ts | 52 +- .../src/lib/series/domains/y_domain.ts | 18 +- .../series/nonstacked_series_utils.test.ts | 343 ++ .../src/lib/series/nonstacked_series_utils.ts | 54 + .../src/lib/series/rendering.areas.test.ts | 252 +- .../src/lib/series/rendering.bands.test.ts | 403 ++ .../src/lib/series/rendering.bars.test.ts | 98 +- .../src/lib/series/rendering.lines.test.ts | 233 +- .../src/lib/series/rendering.test.ts | 39 +- .../osd-charts/src/lib/series/rendering.ts | 203 +- .../osd-charts/src/lib/series/scales.test.ts | 5 - .../osd-charts/src/lib/series/series.test.ts | 155 +- packages/osd-charts/src/lib/series/series.ts | 167 +- packages/osd-charts/src/lib/series/specs.ts | 2 + .../lib/series/stacked_series_utils.test.ts | 365 ++ .../src/lib/series/stacked_series_utils.ts | 113 + .../osd-charts/src/lib/series/tooltip.test.ts | 109 + packages/osd-charts/src/lib/series/tooltip.ts | 110 +- .../src/lib/utils/interactions.test.ts | 123 +- .../osd-charts/src/lib/utils/interactions.ts | 42 +- .../state/__snapshots__/utils.test.ts.snap | 52 +- .../src/state/annotation_marker.test.tsx | 51 +- .../osd-charts/src/state/chart_state.test.ts | 42 +- .../src/state/chart_state.timescales.test.ts | 36 +- packages/osd-charts/src/state/chart_state.ts | 18 +- .../src/state/test/interactions.test.ts | 56 +- packages/osd-charts/src/state/utils.ts | 3 + packages/osd-charts/stories/area_chart.tsx | 135 + packages/osd-charts/stories/bar_chart.tsx | 184 +- packages/osd-charts/stories/mixed.tsx | 13 +- 35 files changed, 7493 insertions(+), 850 deletions(-) create mode 100644 packages/osd-charts/src/lib/series/nonstacked_series_utils.test.ts create mode 100644 packages/osd-charts/src/lib/series/nonstacked_series_utils.ts create mode 100644 packages/osd-charts/src/lib/series/rendering.bands.test.ts create mode 100644 packages/osd-charts/src/lib/series/stacked_series_utils.test.ts create mode 100644 packages/osd-charts/src/lib/series/stacked_series_utils.ts create mode 100644 packages/osd-charts/src/lib/series/tooltip.test.ts diff --git a/packages/osd-charts/src/components/highlighter.tsx b/packages/osd-charts/src/components/highlighter.tsx index 53bd4e7748be..95a0d3efa0dc 100644 --- a/packages/osd-charts/src/components/highlighter.tsx +++ b/packages/osd-charts/src/components/highlighter.tsx @@ -1,5 +1,6 @@ import { inject, observer } from 'mobx-react'; import React from 'react'; +import { isPointGeometry } from '../lib/series/rendering'; import { ChartStore } from '../state/chart_state'; interface HighlighterProps { @@ -21,18 +22,15 @@ class HighlighterComponent extends React.Component { return ( - {highlightedGeometries.map((highlightedGeometry, i) => { - const { - color, - geom: { x, y, width, height, isPoint }, - } = highlightedGeometry; - if (isPoint) { + {highlightedGeometries.map((geom, i) => { + const { color, x, y } = geom; + if (isPointGeometry(geom)) { return ( { ); } return ( - + ); })} diff --git a/packages/osd-charts/src/components/react_canvas/area_geometries.tsx b/packages/osd-charts/src/components/react_canvas/area_geometries.tsx index 6dfcb000bbeb..26de28bad608 100644 --- a/packages/osd-charts/src/components/react_canvas/area_geometries.tsx +++ b/packages/osd-charts/src/components/react_canvas/area_geometries.tsx @@ -42,7 +42,7 @@ export class AreaGeometries extends React.PureComponent< return ( {area.visible && this.renderAreaGeoms()} - {line.visible && this.renderAreaLine()} + {line.visible && this.renderAreaLines()} {point.visible && this.renderAreaPoints()} ); @@ -132,12 +132,12 @@ export class AreaGeometries extends React.PureComponent< } }); } - private renderAreaLine = (): JSX.Element[] => { + private renderAreaLines = (): JSX.Element[] => { const { areas, sharedStyle } = this.props; const { strokeWidth } = this.props.style.line; - - return areas.map((glyph, i) => { - const { line, color, transform, geometryId } = glyph; + const linesToRender: JSX.Element[] = []; + areas.forEach((glyph, areaIndex) => { + const { lines, color, geometryId } = glyph; const geometryStyle = getGeometryStyle( geometryId, @@ -145,33 +145,38 @@ export class AreaGeometries extends React.PureComponent< sharedStyle, ); - if (this.props.animated) { - return ( - - - {(props: { line: string }) => { - const lineProps = buildAreaLineProps({ - index: i, - linePath: props.line, - color, - strokeWidth, - geometryStyle, - }); - return ; - }} - - - ); - } else { + lines.forEach((linePath, lineIndex) => { const lineProps = buildAreaLineProps({ - index: i, - linePath: line, + areaIndex, + lineIndex, + linePath, color, strokeWidth, geometryStyle, }); - return ; - } + linesToRender.push(); + }); }); + return linesToRender; + // if (this.props.animated) { + // return ( + // + // + // {(props: { line: string }) => { + // const lineProps = buildAreaLineProps({ + // index: i, + // linePath: props.line, + // color, + // strokeWidth, + // geometryStyle, + // }); + // return ; + // }} + // + // + // ); + // } else { + + // } } } diff --git a/packages/osd-charts/src/components/react_canvas/utils/rendering_props_utils.test.ts b/packages/osd-charts/src/components/react_canvas/utils/rendering_props_utils.test.ts index 1829601a5fa2..511effb12014 100644 --- a/packages/osd-charts/src/components/react_canvas/utils/rendering_props_utils.test.ts +++ b/packages/osd-charts/src/components/react_canvas/utils/rendering_props_utils.test.ts @@ -80,7 +80,8 @@ describe('[canvas] Area Geometries props', () => { }); test('can build area line path props', () => { const props = buildAreaLineProps({ - index: 1, + areaIndex: 1, + lineIndex: 2, linePath: 'M0,0L10,10Z', color: 'red', strokeWidth: 1, @@ -89,7 +90,7 @@ describe('[canvas] Area Geometries props', () => { }, }); expect(props).toEqual({ - key: `area-line-1`, + key: `area-1-line-2`, data: 'M0,0L10,10Z', stroke: 'red', strokeWidth: 1, diff --git a/packages/osd-charts/src/components/react_canvas/utils/rendering_props_utils.ts b/packages/osd-charts/src/components/react_canvas/utils/rendering_props_utils.ts index 4cc23101a9b0..742344d9804f 100644 --- a/packages/osd-charts/src/components/react_canvas/utils/rendering_props_utils.ts +++ b/packages/osd-charts/src/components/react_canvas/utils/rendering_props_utils.ts @@ -57,20 +57,22 @@ export function buildAreaProps({ } export function buildAreaLineProps({ - index, + areaIndex, + lineIndex, linePath, color, strokeWidth, geometryStyle, }: { - index: number; + areaIndex: number; + lineIndex: number; linePath: string; color: string; strokeWidth: number; geometryStyle: GeometryStyle; }) { return { - key: `area-line-${index}`, + key: `area-${areaIndex}-line-${lineIndex}`, data: linePath, stroke: color, strokeWidth, diff --git a/packages/osd-charts/src/lib/series/__snapshots__/series.test.ts.snap b/packages/osd-charts/src/lib/series/__snapshots__/series.test.ts.snap index c12d168b6402..fa861ab91443 100644 --- a/packages/osd-charts/src/lib/series/__snapshots__/series.test.ts.snap +++ b/packages/osd-charts/src/lib/series/__snapshots__/series.test.ts.snap @@ -10,7 +10,8 @@ Array [ "y": 1, }, "x": 0, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -18,7 +19,8 @@ Array [ "y": 2, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -26,7 +28,8 @@ Array [ "y": 10, }, "x": 2, - "y": 10, + "y0": null, + "y1": 10, }, Object { "datum": Object { @@ -34,7 +37,8 @@ Array [ "y": 6, }, "x": 3, - "y": 6, + "y0": null, + "y1": 6, }, ], "key": Array [], @@ -55,7 +59,8 @@ Array [ "y": 1, }, "x": 0, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -64,7 +69,8 @@ Array [ "y": 2, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -73,7 +79,8 @@ Array [ "y": 3, }, "x": 2, - "y": 3, + "y0": null, + "y1": 3, }, Object { "datum": Object { @@ -82,7 +89,8 @@ Array [ "y": 4, }, "x": 3, - "y": 4, + "y0": null, + "y1": 4, }, ], "key": Array [ @@ -100,7 +108,8 @@ Array [ "y": 2, }, "x": 0, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -109,7 +118,8 @@ Array [ "y": 3, }, "x": 1, - "y": 3, + "y0": null, + "y1": 3, }, Object { "datum": Object { @@ -118,7 +128,8 @@ Array [ "y": 4, }, "x": 2, - "y": 4, + "y0": null, + "y1": 4, }, Object { "datum": Object { @@ -127,7 +138,8 @@ Array [ "y": 5, }, "x": 3, - "y": 5, + "y0": null, + "y1": 5, }, ], "key": Array [ @@ -151,7 +163,8 @@ Array [ "y": 1, }, "x": 0, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -161,7 +174,8 @@ Array [ "y": 2, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -171,7 +185,8 @@ Array [ "y": 1, }, "x": 2, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -181,7 +196,8 @@ Array [ "y": 6, }, "x": 3, - "y": 6, + "y0": null, + "y1": 6, }, ], "key": Array [ @@ -201,7 +217,8 @@ Array [ "y": 1, }, "x": 0, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -211,7 +228,8 @@ Array [ "y": 2, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -221,7 +239,8 @@ Array [ "y": 2, }, "x": 2, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -231,7 +250,8 @@ Array [ "y": 6, }, "x": 3, - "y": 6, + "y0": null, + "y1": 6, }, ], "key": Array [ @@ -251,7 +271,8 @@ Array [ "y": 1, }, "x": 0, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -261,7 +282,8 @@ Array [ "y": 2, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -271,7 +293,8 @@ Array [ "y": 3, }, "x": 2, - "y": 3, + "y0": null, + "y1": 3, }, Object { "datum": Object { @@ -281,7 +304,8 @@ Array [ "y": 6, }, "x": 3, - "y": 6, + "y0": null, + "y1": 6, }, ], "key": Array [ @@ -301,7 +325,8 @@ Array [ "y": 1, }, "x": 0, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -311,7 +336,8 @@ Array [ "y": 2, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -321,7 +347,8 @@ Array [ "y": 4, }, "x": 2, - "y": 4, + "y0": null, + "y1": 4, }, Object { "datum": Object { @@ -331,7 +358,8 @@ Array [ "y": 6, }, "x": 3, - "y": 6, + "y0": null, + "y1": 6, }, ], "key": Array [ @@ -355,7 +383,8 @@ Array [ "y2": 3, }, "x": 0, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -364,7 +393,8 @@ Array [ "y2": 7, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -373,7 +403,8 @@ Array [ "y2": 2, }, "x": 2, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -382,7 +413,8 @@ Array [ "y2": 10, }, "x": 3, - "y": 6, + "y0": null, + "y1": 6, }, ], "key": Array [ @@ -400,7 +432,8 @@ Array [ "y2": 3, }, "x": 0, - "y": 3, + "y0": null, + "y1": 3, }, Object { "datum": Object { @@ -409,7 +442,8 @@ Array [ "y2": 7, }, "x": 1, - "y": 7, + "y0": null, + "y1": 7, }, Object { "datum": Object { @@ -418,7 +452,8 @@ Array [ "y2": 2, }, "x": 2, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -427,7 +462,8 @@ Array [ "y2": 10, }, "x": 3, - "y": 10, + "y0": null, + "y1": 10, }, ], "key": Array [ @@ -451,7 +487,8 @@ Array [ "y2": 4, }, "x": 0, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -461,7 +498,8 @@ Array [ "y2": 1, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -471,7 +509,8 @@ Array [ "y2": 5, }, "x": 2, - "y": 10, + "y0": null, + "y1": 10, }, Object { "datum": Object { @@ -481,7 +520,8 @@ Array [ "y2": 3, }, "x": 3, - "y": 7, + "y0": null, + "y1": 7, }, ], "key": Array [ @@ -501,7 +541,8 @@ Array [ "y2": 4, }, "x": 0, - "y": 4, + "y0": null, + "y1": 4, }, Object { "datum": Object { @@ -511,7 +552,8 @@ Array [ "y2": 1, }, "x": 1, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -521,7 +563,8 @@ Array [ "y2": 5, }, "x": 2, - "y": 5, + "y0": null, + "y1": 5, }, Object { "datum": Object { @@ -531,7 +574,8 @@ Array [ "y2": 3, }, "x": 3, - "y": 3, + "y0": null, + "y1": 3, }, ], "key": Array [ @@ -551,7 +595,8 @@ Array [ "y2": 6, }, "x": 0, - "y": 3, + "y0": null, + "y1": 3, }, Object { "datum": Object { @@ -561,7 +606,8 @@ Array [ "y2": 5, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -571,7 +617,8 @@ Array [ "y2": 1, }, "x": 2, - "y": 3, + "y0": null, + "y1": 3, }, Object { "datum": Object { @@ -581,7 +628,8 @@ Array [ "y2": 4, }, "x": 3, - "y": 6, + "y0": null, + "y1": 6, }, ], "key": Array [ @@ -601,7 +649,8 @@ Array [ "y2": 6, }, "x": 0, - "y": 6, + "y0": null, + "y1": 6, }, Object { "datum": Object { @@ -611,7 +660,8 @@ Array [ "y2": 5, }, "x": 1, - "y": 5, + "y0": null, + "y1": 5, }, Object { "datum": Object { @@ -621,7 +671,8 @@ Array [ "y2": 1, }, "x": 2, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -631,7 +682,8 @@ Array [ "y2": 4, }, "x": 3, - "y": 4, + "y0": null, + "y1": 4, }, ], "key": Array [ @@ -657,7 +709,8 @@ Array [ "y2": 4, }, "x": 0, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -668,7 +721,8 @@ Array [ "y2": 1, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -679,7 +733,8 @@ Array [ "y2": 5, }, "x": 2, - "y": 10, + "y0": null, + "y1": 10, }, Object { "datum": Object { @@ -690,7 +745,8 @@ Array [ "y2": 3, }, "x": 3, - "y": 7, + "y0": null, + "y1": 7, }, Object { "datum": Object { @@ -701,7 +757,8 @@ Array [ "y2": 3, }, "x": 6, - "y": 7, + "y0": null, + "y1": 7, }, ], "key": Array [ @@ -723,7 +780,8 @@ Array [ "y2": 4, }, "x": 0, - "y": 4, + "y0": null, + "y1": 4, }, Object { "datum": Object { @@ -734,7 +792,8 @@ Array [ "y2": 1, }, "x": 1, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -745,7 +804,8 @@ Array [ "y2": 5, }, "x": 2, - "y": 5, + "y0": null, + "y1": 5, }, Object { "datum": Object { @@ -756,7 +816,8 @@ Array [ "y2": 3, }, "x": 3, - "y": 3, + "y0": null, + "y1": 3, }, Object { "datum": Object { @@ -767,7 +828,8 @@ Array [ "y2": 3, }, "x": 6, - "y": 3, + "y0": null, + "y1": 3, }, ], "key": Array [ @@ -789,7 +851,8 @@ Array [ "y2": 4, }, "x": 0, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -800,7 +863,8 @@ Array [ "y2": 1, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -811,7 +875,8 @@ Array [ "y2": 5, }, "x": 2, - "y": 10, + "y0": null, + "y1": 10, }, Object { "datum": Object { @@ -822,7 +887,8 @@ Array [ "y2": 3, }, "x": 3, - "y": 7, + "y0": null, + "y1": 7, }, Object { "datum": Object { @@ -833,7 +899,8 @@ Array [ "y2": 3, }, "x": 6, - "y": 7, + "y0": null, + "y1": 7, }, ], "key": Array [ @@ -855,7 +922,8 @@ Array [ "y2": 4, }, "x": 0, - "y": 4, + "y0": null, + "y1": 4, }, Object { "datum": Object { @@ -866,7 +934,8 @@ Array [ "y2": 1, }, "x": 1, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -877,7 +946,8 @@ Array [ "y2": 5, }, "x": 2, - "y": 5, + "y0": null, + "y1": 5, }, Object { "datum": Object { @@ -888,7 +958,8 @@ Array [ "y2": 3, }, "x": 3, - "y": 3, + "y0": null, + "y1": 3, }, Object { "datum": Object { @@ -899,7 +970,8 @@ Array [ "y2": 3, }, "x": 6, - "y": 3, + "y0": null, + "y1": 3, }, ], "key": Array [ @@ -921,7 +993,8 @@ Array [ "y2": 6, }, "x": 0, - "y": 3, + "y0": null, + "y1": 3, }, Object { "datum": Object { @@ -932,7 +1005,8 @@ Array [ "y2": 5, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -943,7 +1017,8 @@ Array [ "y2": 1, }, "x": 2, - "y": 3, + "y0": null, + "y1": 3, }, Object { "datum": Object { @@ -954,7 +1029,8 @@ Array [ "y2": 4, }, "x": 3, - "y": 6, + "y0": null, + "y1": 6, }, Object { "datum": Object { @@ -965,7 +1041,8 @@ Array [ "y2": 4, }, "x": 6, - "y": 6, + "y0": null, + "y1": 6, }, ], "key": Array [ @@ -987,7 +1064,8 @@ Array [ "y2": 6, }, "x": 0, - "y": 6, + "y0": null, + "y1": 6, }, Object { "datum": Object { @@ -998,7 +1076,8 @@ Array [ "y2": 5, }, "x": 1, - "y": 5, + "y0": null, + "y1": 5, }, Object { "datum": Object { @@ -1009,7 +1088,8 @@ Array [ "y2": 1, }, "x": 2, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -1020,7 +1100,8 @@ Array [ "y2": 4, }, "x": 3, - "y": 4, + "y0": null, + "y1": 4, }, Object { "datum": Object { @@ -1031,7 +1112,8 @@ Array [ "y2": 4, }, "x": 6, - "y": 4, + "y0": null, + "y1": 4, }, ], "key": Array [ @@ -1053,7 +1135,8 @@ Array [ "y2": 6, }, "x": 0, - "y": 3, + "y0": null, + "y1": 3, }, Object { "datum": Object { @@ -1064,7 +1147,8 @@ Array [ "y2": 5, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -1075,7 +1159,8 @@ Array [ "y2": 1, }, "x": 2, - "y": 3, + "y0": null, + "y1": 3, }, Object { "datum": Object { @@ -1086,7 +1171,8 @@ Array [ "y2": 4, }, "x": 3, - "y": 6, + "y0": null, + "y1": 6, }, Object { "datum": Object { @@ -1097,7 +1183,8 @@ Array [ "y2": 4, }, "x": 6, - "y": 6, + "y0": null, + "y1": 6, }, ], "key": Array [ @@ -1119,7 +1206,8 @@ Array [ "y2": 6, }, "x": 0, - "y": 6, + "y0": null, + "y1": 6, }, Object { "datum": Object { @@ -1130,7 +1218,8 @@ Array [ "y2": 5, }, "x": 1, - "y": 5, + "y0": null, + "y1": 5, }, Object { "datum": Object { @@ -1141,7 +1230,8 @@ Array [ "y2": 1, }, "x": 2, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -1152,7 +1242,8 @@ Array [ "y2": 4, }, "x": 3, - "y": 4, + "y0": null, + "y1": 4, }, Object { "datum": Object { @@ -1163,7 +1254,8 @@ Array [ "y2": 4, }, "x": 6, - "y": 4, + "y0": null, + "y1": 4, }, ], "key": Array [ @@ -1183,6000 +1275,8000 @@ Array [ "data": Array [ Object { "datum": undefined, + "initialY0": null, + "initialY1": 0, "x": 0, "y0": 0, "y1": 0, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 1, "x": 1, "y0": 0, "y1": 1, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 2, "x": 2, "y0": 0, "y1": 2, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 3, "x": 3, "y0": 0, "y1": 3, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 4, "x": 4, "y0": 0, "y1": 4, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 5, "x": 5, "y0": 0, "y1": 5, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 6, "x": 6, "y0": 0, "y1": 6, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 7, "x": 7, "y0": 0, "y1": 7, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 8, "x": 8, "y0": 0, "y1": 8, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 9, "x": 9, "y0": 0, "y1": 9, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 10, "x": 10, "y0": 0, "y1": 10, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 11, "x": 11, "y0": 0, "y1": 11, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 12, "x": 12, "y0": 0, "y1": 12, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 13, "x": 13, "y0": 0, "y1": 13, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 14, "x": 14, "y0": 0, "y1": 14, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 15, "x": 15, "y0": 0, "y1": 15, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 16, "x": 16, "y0": 0, "y1": 16, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 17, "x": 17, "y0": 0, "y1": 17, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 18, "x": 18, "y0": 0, "y1": 18, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 19, "x": 19, "y0": 0, "y1": 19, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 20, "x": 20, "y0": 0, "y1": 20, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 21, "x": 21, "y0": 0, "y1": 21, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 22, "x": 22, "y0": 0, "y1": 22, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 23, "x": 23, "y0": 0, "y1": 23, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 24, "x": 24, "y0": 0, "y1": 24, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 25, "x": 25, "y0": 0, "y1": 25, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 26, "x": 26, "y0": 0, "y1": 26, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 27, "x": 27, "y0": 0, "y1": 27, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 28, "x": 28, "y0": 0, "y1": 28, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 29, "x": 29, "y0": 0, "y1": 29, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 30, "x": 30, "y0": 0, "y1": 30, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 31, "x": 31, "y0": 0, "y1": 31, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 32, "x": 32, "y0": 0, "y1": 32, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 33, "x": 33, "y0": 0, "y1": 33, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 34, "x": 34, "y0": 0, "y1": 34, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 35, "x": 35, "y0": 0, "y1": 35, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 36, "x": 36, "y0": 0, "y1": 36, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 37, "x": 37, "y0": 0, "y1": 37, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 38, "x": 38, "y0": 0, "y1": 38, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 39, "x": 39, "y0": 0, "y1": 39, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 40, "x": 40, "y0": 0, "y1": 40, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 41, "x": 41, "y0": 0, "y1": 41, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 42, "x": 42, "y0": 0, "y1": 42, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 43, "x": 43, "y0": 0, "y1": 43, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 44, "x": 44, "y0": 0, "y1": 44, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 45, "x": 45, "y0": 0, "y1": 45, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 46, "x": 46, "y0": 0, "y1": 46, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 47, "x": 47, "y0": 0, "y1": 47, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 48, "x": 48, "y0": 0, "y1": 48, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 49, "x": 49, "y0": 0, "y1": 49, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 50, "x": 50, "y0": 0, "y1": 50, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 51, "x": 51, "y0": 0, "y1": 51, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 52, "x": 52, "y0": 0, "y1": 52, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 53, "x": 53, "y0": 0, "y1": 53, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 54, "x": 54, "y0": 0, "y1": 54, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 55, "x": 55, "y0": 0, "y1": 55, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 56, "x": 56, "y0": 0, "y1": 56, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 57, "x": 57, "y0": 0, "y1": 57, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 58, "x": 58, "y0": 0, "y1": 58, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 59, "x": 59, "y0": 0, "y1": 59, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 60, "x": 60, "y0": 0, "y1": 60, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 61, "x": 61, "y0": 0, "y1": 61, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 62, "x": 62, "y0": 0, "y1": 62, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 63, "x": 63, "y0": 0, "y1": 63, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 64, "x": 64, "y0": 0, "y1": 64, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 65, "x": 65, "y0": 0, "y1": 65, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 66, "x": 66, "y0": 0, "y1": 66, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 67, "x": 67, "y0": 0, "y1": 67, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 68, "x": 68, "y0": 0, "y1": 68, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 69, "x": 69, "y0": 0, "y1": 69, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 70, "x": 70, "y0": 0, "y1": 70, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 71, "x": 71, "y0": 0, "y1": 71, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 72, "x": 72, "y0": 0, "y1": 72, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 73, "x": 73, "y0": 0, "y1": 73, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 74, "x": 74, "y0": 0, "y1": 74, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 75, "x": 75, "y0": 0, "y1": 75, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 76, "x": 76, "y0": 0, "y1": 76, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 77, "x": 77, "y0": 0, "y1": 77, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 78, "x": 78, "y0": 0, "y1": 78, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 79, "x": 79, "y0": 0, "y1": 79, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 80, "x": 80, "y0": 0, "y1": 80, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 81, "x": 81, "y0": 0, "y1": 81, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 82, "x": 82, "y0": 0, "y1": 82, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 83, "x": 83, "y0": 0, "y1": 83, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 84, "x": 84, "y0": 0, "y1": 84, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 85, "x": 85, "y0": 0, "y1": 85, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 86, "x": 86, "y0": 0, "y1": 86, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 87, "x": 87, "y0": 0, "y1": 87, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 88, "x": 88, "y0": 0, "y1": 88, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 89, "x": 89, "y0": 0, "y1": 89, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 90, "x": 90, "y0": 0, "y1": 90, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 91, "x": 91, "y0": 0, "y1": 91, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 92, "x": 92, "y0": 0, "y1": 92, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 93, "x": 93, "y0": 0, "y1": 93, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 94, "x": 94, "y0": 0, "y1": 94, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 95, "x": 95, "y0": 0, "y1": 95, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 96, "x": 96, "y0": 0, "y1": 96, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 97, "x": 97, "y0": 0, "y1": 97, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 98, "x": 98, "y0": 0, "y1": 98, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 99, "x": 99, "y0": 0, "y1": 99, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 100, "x": 100, "y0": 0, "y1": 100, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 101, "x": 101, "y0": 0, "y1": 101, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 102, "x": 102, "y0": 0, "y1": 102, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 103, "x": 103, "y0": 0, "y1": 103, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 104, "x": 104, "y0": 0, "y1": 104, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 105, "x": 105, "y0": 0, "y1": 105, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 106, "x": 106, "y0": 0, "y1": 106, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 107, "x": 107, "y0": 0, "y1": 107, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 108, "x": 108, "y0": 0, "y1": 108, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 109, "x": 109, "y0": 0, "y1": 109, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 110, "x": 110, "y0": 0, "y1": 110, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 111, "x": 111, "y0": 0, "y1": 111, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 112, "x": 112, "y0": 0, "y1": 112, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 113, "x": 113, "y0": 0, "y1": 113, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 114, "x": 114, "y0": 0, "y1": 114, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 115, "x": 115, "y0": 0, "y1": 115, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 116, "x": 116, "y0": 0, "y1": 116, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 117, "x": 117, "y0": 0, "y1": 117, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 118, "x": 118, "y0": 0, "y1": 118, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 119, "x": 119, "y0": 0, "y1": 119, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 120, "x": 120, "y0": 0, "y1": 120, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 121, "x": 121, "y0": 0, "y1": 121, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 122, "x": 122, "y0": 0, "y1": 122, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 123, "x": 123, "y0": 0, "y1": 123, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 124, "x": 124, "y0": 0, "y1": 124, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 125, "x": 125, "y0": 0, "y1": 125, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 126, "x": 126, "y0": 0, "y1": 126, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 127, "x": 127, "y0": 0, "y1": 127, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 128, "x": 128, "y0": 0, "y1": 128, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 129, "x": 129, "y0": 0, "y1": 129, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 130, "x": 130, "y0": 0, "y1": 130, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 131, "x": 131, "y0": 0, "y1": 131, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 132, "x": 132, "y0": 0, "y1": 132, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 133, "x": 133, "y0": 0, "y1": 133, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 134, "x": 134, "y0": 0, "y1": 134, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 135, "x": 135, "y0": 0, "y1": 135, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 136, "x": 136, "y0": 0, "y1": 136, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 137, "x": 137, "y0": 0, "y1": 137, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 138, "x": 138, "y0": 0, "y1": 138, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 139, "x": 139, "y0": 0, "y1": 139, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 140, "x": 140, "y0": 0, "y1": 140, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 141, "x": 141, "y0": 0, "y1": 141, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 142, "x": 142, "y0": 0, "y1": 142, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 143, "x": 143, "y0": 0, "y1": 143, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 144, "x": 144, "y0": 0, "y1": 144, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 145, "x": 145, "y0": 0, "y1": 145, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 146, "x": 146, "y0": 0, "y1": 146, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 147, "x": 147, "y0": 0, "y1": 147, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 148, "x": 148, "y0": 0, "y1": 148, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 149, "x": 149, "y0": 0, "y1": 149, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 150, "x": 150, "y0": 0, "y1": 150, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 151, "x": 151, "y0": 0, "y1": 151, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 152, "x": 152, "y0": 0, "y1": 152, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 153, "x": 153, "y0": 0, "y1": 153, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 154, "x": 154, "y0": 0, "y1": 154, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 155, "x": 155, "y0": 0, "y1": 155, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 156, "x": 156, "y0": 0, "y1": 156, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 157, "x": 157, "y0": 0, "y1": 157, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 158, "x": 158, "y0": 0, "y1": 158, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 159, "x": 159, "y0": 0, "y1": 159, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 160, "x": 160, "y0": 0, "y1": 160, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 161, "x": 161, "y0": 0, "y1": 161, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 162, "x": 162, "y0": 0, "y1": 162, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 163, "x": 163, "y0": 0, "y1": 163, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 164, "x": 164, "y0": 0, "y1": 164, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 165, "x": 165, "y0": 0, "y1": 165, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 166, "x": 166, "y0": 0, "y1": 166, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 167, "x": 167, "y0": 0, "y1": 167, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 168, "x": 168, "y0": 0, "y1": 168, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 169, "x": 169, "y0": 0, "y1": 169, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 170, "x": 170, "y0": 0, "y1": 170, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 171, "x": 171, "y0": 0, "y1": 171, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 172, "x": 172, "y0": 0, "y1": 172, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 173, "x": 173, "y0": 0, "y1": 173, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 174, "x": 174, "y0": 0, "y1": 174, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 175, "x": 175, "y0": 0, "y1": 175, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 176, "x": 176, "y0": 0, "y1": 176, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 177, "x": 177, "y0": 0, "y1": 177, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 178, "x": 178, "y0": 0, "y1": 178, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 179, "x": 179, "y0": 0, "y1": 179, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 180, "x": 180, "y0": 0, "y1": 180, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 181, "x": 181, "y0": 0, "y1": 181, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 182, "x": 182, "y0": 0, "y1": 182, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 183, "x": 183, "y0": 0, "y1": 183, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 184, "x": 184, "y0": 0, "y1": 184, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 185, "x": 185, "y0": 0, "y1": 185, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 186, "x": 186, "y0": 0, "y1": 186, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 187, "x": 187, "y0": 0, "y1": 187, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 188, "x": 188, "y0": 0, "y1": 188, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 189, "x": 189, "y0": 0, "y1": 189, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 190, "x": 190, "y0": 0, "y1": 190, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 191, "x": 191, "y0": 0, "y1": 191, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 192, "x": 192, "y0": 0, "y1": 192, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 193, "x": 193, "y0": 0, "y1": 193, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 194, "x": 194, "y0": 0, "y1": 194, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 195, "x": 195, "y0": 0, "y1": 195, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 196, "x": 196, "y0": 0, "y1": 196, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 197, "x": 197, "y0": 0, "y1": 197, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 198, "x": 198, "y0": 0, "y1": 198, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 199, "x": 199, "y0": 0, "y1": 199, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 200, "x": 200, "y0": 0, "y1": 200, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 201, "x": 201, "y0": 0, "y1": 201, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 202, "x": 202, "y0": 0, "y1": 202, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 203, "x": 203, "y0": 0, "y1": 203, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 204, "x": 204, "y0": 0, "y1": 204, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 205, "x": 205, "y0": 0, "y1": 205, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 206, "x": 206, "y0": 0, "y1": 206, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 207, "x": 207, "y0": 0, "y1": 207, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 208, "x": 208, "y0": 0, "y1": 208, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 209, "x": 209, "y0": 0, "y1": 209, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 210, "x": 210, "y0": 0, "y1": 210, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 211, "x": 211, "y0": 0, "y1": 211, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 212, "x": 212, "y0": 0, "y1": 212, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 213, "x": 213, "y0": 0, "y1": 213, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 214, "x": 214, "y0": 0, "y1": 214, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 215, "x": 215, "y0": 0, "y1": 215, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 216, "x": 216, "y0": 0, "y1": 216, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 217, "x": 217, "y0": 0, "y1": 217, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 218, "x": 218, "y0": 0, "y1": 218, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 219, "x": 219, "y0": 0, "y1": 219, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 220, "x": 220, "y0": 0, "y1": 220, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 221, "x": 221, "y0": 0, "y1": 221, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 222, "x": 222, "y0": 0, "y1": 222, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 223, "x": 223, "y0": 0, "y1": 223, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 224, "x": 224, "y0": 0, "y1": 224, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 225, "x": 225, "y0": 0, "y1": 225, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 226, "x": 226, "y0": 0, "y1": 226, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 227, "x": 227, "y0": 0, "y1": 227, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 228, "x": 228, "y0": 0, "y1": 228, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 229, "x": 229, "y0": 0, "y1": 229, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 230, "x": 230, "y0": 0, "y1": 230, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 231, "x": 231, "y0": 0, "y1": 231, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 232, "x": 232, "y0": 0, "y1": 232, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 233, "x": 233, "y0": 0, "y1": 233, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 234, "x": 234, "y0": 0, "y1": 234, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 235, "x": 235, "y0": 0, "y1": 235, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 236, "x": 236, "y0": 0, "y1": 236, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 237, "x": 237, "y0": 0, "y1": 237, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 238, "x": 238, "y0": 0, "y1": 238, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 239, "x": 239, "y0": 0, "y1": 239, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 240, "x": 240, "y0": 0, "y1": 240, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 241, "x": 241, "y0": 0, "y1": 241, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 242, "x": 242, "y0": 0, "y1": 242, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 243, "x": 243, "y0": 0, "y1": 243, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 244, "x": 244, "y0": 0, "y1": 244, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 245, "x": 245, "y0": 0, "y1": 245, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 246, "x": 246, "y0": 0, "y1": 246, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 247, "x": 247, "y0": 0, "y1": 247, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 248, "x": 248, "y0": 0, "y1": 248, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 249, "x": 249, "y0": 0, "y1": 249, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 250, "x": 250, "y0": 0, "y1": 250, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 251, "x": 251, "y0": 0, "y1": 251, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 252, "x": 252, "y0": 0, "y1": 252, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 253, "x": 253, "y0": 0, "y1": 253, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 254, "x": 254, "y0": 0, "y1": 254, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 255, "x": 255, "y0": 0, "y1": 255, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 256, "x": 256, "y0": 0, "y1": 256, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 257, "x": 257, "y0": 0, "y1": 257, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 258, "x": 258, "y0": 0, "y1": 258, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 259, "x": 259, "y0": 0, "y1": 259, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 260, "x": 260, "y0": 0, "y1": 260, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 261, "x": 261, "y0": 0, "y1": 261, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 262, "x": 262, "y0": 0, "y1": 262, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 263, "x": 263, "y0": 0, "y1": 263, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 264, "x": 264, "y0": 0, "y1": 264, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 265, "x": 265, "y0": 0, "y1": 265, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 266, "x": 266, "y0": 0, "y1": 266, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 267, "x": 267, "y0": 0, "y1": 267, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 268, "x": 268, "y0": 0, "y1": 268, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 269, "x": 269, "y0": 0, "y1": 269, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 270, "x": 270, "y0": 0, "y1": 270, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 271, "x": 271, "y0": 0, "y1": 271, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 272, "x": 272, "y0": 0, "y1": 272, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 273, "x": 273, "y0": 0, "y1": 273, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 274, "x": 274, "y0": 0, "y1": 274, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 275, "x": 275, "y0": 0, "y1": 275, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 276, "x": 276, "y0": 0, "y1": 276, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 277, "x": 277, "y0": 0, "y1": 277, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 278, "x": 278, "y0": 0, "y1": 278, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 279, "x": 279, "y0": 0, "y1": 279, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 280, "x": 280, "y0": 0, "y1": 280, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 281, "x": 281, "y0": 0, "y1": 281, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 282, "x": 282, "y0": 0, "y1": 282, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 283, "x": 283, "y0": 0, "y1": 283, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 284, "x": 284, "y0": 0, "y1": 284, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 285, "x": 285, "y0": 0, "y1": 285, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 286, "x": 286, "y0": 0, "y1": 286, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 287, "x": 287, "y0": 0, "y1": 287, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 288, "x": 288, "y0": 0, "y1": 288, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 289, "x": 289, "y0": 0, "y1": 289, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 290, "x": 290, "y0": 0, "y1": 290, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 291, "x": 291, "y0": 0, "y1": 291, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 292, "x": 292, "y0": 0, "y1": 292, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 293, "x": 293, "y0": 0, "y1": 293, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 294, "x": 294, "y0": 0, "y1": 294, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 295, "x": 295, "y0": 0, "y1": 295, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 296, "x": 296, "y0": 0, "y1": 296, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 297, "x": 297, "y0": 0, "y1": 297, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 298, "x": 298, "y0": 0, "y1": 298, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 299, "x": 299, "y0": 0, "y1": 299, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 300, "x": 300, "y0": 0, "y1": 300, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 301, "x": 301, "y0": 0, "y1": 301, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 302, "x": 302, "y0": 0, "y1": 302, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 303, "x": 303, "y0": 0, "y1": 303, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 304, "x": 304, "y0": 0, "y1": 304, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 305, "x": 305, "y0": 0, "y1": 305, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 306, "x": 306, "y0": 0, "y1": 306, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 307, "x": 307, "y0": 0, "y1": 307, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 308, "x": 308, "y0": 0, "y1": 308, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 309, "x": 309, "y0": 0, "y1": 309, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 310, "x": 310, "y0": 0, "y1": 310, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 311, "x": 311, "y0": 0, "y1": 311, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 312, "x": 312, "y0": 0, "y1": 312, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 313, "x": 313, "y0": 0, "y1": 313, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 314, "x": 314, "y0": 0, "y1": 314, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 315, "x": 315, "y0": 0, "y1": 315, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 316, "x": 316, "y0": 0, "y1": 316, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 317, "x": 317, "y0": 0, "y1": 317, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 318, "x": 318, "y0": 0, "y1": 318, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 319, "x": 319, "y0": 0, "y1": 319, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 320, "x": 320, "y0": 0, "y1": 320, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 321, "x": 321, "y0": 0, "y1": 321, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 322, "x": 322, "y0": 0, "y1": 322, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 323, "x": 323, "y0": 0, "y1": 323, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 324, "x": 324, "y0": 0, "y1": 324, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 325, "x": 325, "y0": 0, "y1": 325, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 326, "x": 326, "y0": 0, "y1": 326, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 327, "x": 327, "y0": 0, "y1": 327, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 328, "x": 328, "y0": 0, "y1": 328, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 329, "x": 329, "y0": 0, "y1": 329, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 330, "x": 330, "y0": 0, "y1": 330, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 331, "x": 331, "y0": 0, "y1": 331, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 332, "x": 332, "y0": 0, "y1": 332, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 333, "x": 333, "y0": 0, "y1": 333, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 334, "x": 334, "y0": 0, "y1": 334, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 335, "x": 335, "y0": 0, "y1": 335, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 336, "x": 336, "y0": 0, "y1": 336, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 337, "x": 337, "y0": 0, "y1": 337, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 338, "x": 338, "y0": 0, "y1": 338, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 339, "x": 339, "y0": 0, "y1": 339, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 340, "x": 340, "y0": 0, "y1": 340, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 341, "x": 341, "y0": 0, "y1": 341, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 342, "x": 342, "y0": 0, "y1": 342, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 343, "x": 343, "y0": 0, "y1": 343, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 344, "x": 344, "y0": 0, "y1": 344, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 345, "x": 345, "y0": 0, "y1": 345, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 346, "x": 346, "y0": 0, "y1": 346, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 347, "x": 347, "y0": 0, "y1": 347, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 348, "x": 348, "y0": 0, "y1": 348, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 349, "x": 349, "y0": 0, "y1": 349, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 350, "x": 350, "y0": 0, "y1": 350, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 351, "x": 351, "y0": 0, "y1": 351, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 352, "x": 352, "y0": 0, "y1": 352, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 353, "x": 353, "y0": 0, "y1": 353, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 354, "x": 354, "y0": 0, "y1": 354, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 355, "x": 355, "y0": 0, "y1": 355, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 356, "x": 356, "y0": 0, "y1": 356, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 357, "x": 357, "y0": 0, "y1": 357, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 358, "x": 358, "y0": 0, "y1": 358, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 359, "x": 359, "y0": 0, "y1": 359, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 360, "x": 360, "y0": 0, "y1": 360, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 361, "x": 361, "y0": 0, "y1": 361, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 362, "x": 362, "y0": 0, "y1": 362, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 363, "x": 363, "y0": 0, "y1": 363, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 364, "x": 364, "y0": 0, "y1": 364, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 365, "x": 365, "y0": 0, "y1": 365, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 366, "x": 366, "y0": 0, "y1": 366, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 367, "x": 367, "y0": 0, "y1": 367, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 368, "x": 368, "y0": 0, "y1": 368, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 369, "x": 369, "y0": 0, "y1": 369, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 370, "x": 370, "y0": 0, "y1": 370, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 371, "x": 371, "y0": 0, "y1": 371, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 372, "x": 372, "y0": 0, "y1": 372, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 373, "x": 373, "y0": 0, "y1": 373, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 374, "x": 374, "y0": 0, "y1": 374, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 375, "x": 375, "y0": 0, "y1": 375, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 376, "x": 376, "y0": 0, "y1": 376, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 377, "x": 377, "y0": 0, "y1": 377, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 378, "x": 378, "y0": 0, "y1": 378, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 379, "x": 379, "y0": 0, "y1": 379, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 380, "x": 380, "y0": 0, "y1": 380, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 381, "x": 381, "y0": 0, "y1": 381, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 382, "x": 382, "y0": 0, "y1": 382, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 383, "x": 383, "y0": 0, "y1": 383, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 384, "x": 384, "y0": 0, "y1": 384, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 385, "x": 385, "y0": 0, "y1": 385, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 386, "x": 386, "y0": 0, "y1": 386, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 387, "x": 387, "y0": 0, "y1": 387, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 388, "x": 388, "y0": 0, "y1": 388, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 389, "x": 389, "y0": 0, "y1": 389, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 390, "x": 390, "y0": 0, "y1": 390, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 391, "x": 391, "y0": 0, "y1": 391, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 392, "x": 392, "y0": 0, "y1": 392, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 393, "x": 393, "y0": 0, "y1": 393, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 394, "x": 394, "y0": 0, "y1": 394, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 395, "x": 395, "y0": 0, "y1": 395, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 396, "x": 396, "y0": 0, "y1": 396, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 397, "x": 397, "y0": 0, "y1": 397, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 398, "x": 398, "y0": 0, "y1": 398, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 399, "x": 399, "y0": 0, "y1": 399, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 400, "x": 400, "y0": 0, "y1": 400, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 401, "x": 401, "y0": 0, "y1": 401, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 402, "x": 402, "y0": 0, "y1": 402, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 403, "x": 403, "y0": 0, "y1": 403, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 404, "x": 404, "y0": 0, "y1": 404, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 405, "x": 405, "y0": 0, "y1": 405, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 406, "x": 406, "y0": 0, "y1": 406, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 407, "x": 407, "y0": 0, "y1": 407, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 408, "x": 408, "y0": 0, "y1": 408, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 409, "x": 409, "y0": 0, "y1": 409, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 410, "x": 410, "y0": 0, "y1": 410, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 411, "x": 411, "y0": 0, "y1": 411, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 412, "x": 412, "y0": 0, "y1": 412, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 413, "x": 413, "y0": 0, "y1": 413, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 414, "x": 414, "y0": 0, "y1": 414, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 415, "x": 415, "y0": 0, "y1": 415, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 416, "x": 416, "y0": 0, "y1": 416, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 417, "x": 417, "y0": 0, "y1": 417, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 418, "x": 418, "y0": 0, "y1": 418, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 419, "x": 419, "y0": 0, "y1": 419, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 420, "x": 420, "y0": 0, "y1": 420, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 421, "x": 421, "y0": 0, "y1": 421, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 422, "x": 422, "y0": 0, "y1": 422, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 423, "x": 423, "y0": 0, "y1": 423, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 424, "x": 424, "y0": 0, "y1": 424, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 425, "x": 425, "y0": 0, "y1": 425, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 426, "x": 426, "y0": 0, "y1": 426, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 427, "x": 427, "y0": 0, "y1": 427, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 428, "x": 428, "y0": 0, "y1": 428, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 429, "x": 429, "y0": 0, "y1": 429, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 430, "x": 430, "y0": 0, "y1": 430, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 431, "x": 431, "y0": 0, "y1": 431, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 432, "x": 432, "y0": 0, "y1": 432, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 433, "x": 433, "y0": 0, "y1": 433, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 434, "x": 434, "y0": 0, "y1": 434, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 435, "x": 435, "y0": 0, "y1": 435, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 436, "x": 436, "y0": 0, "y1": 436, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 437, "x": 437, "y0": 0, "y1": 437, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 438, "x": 438, "y0": 0, "y1": 438, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 439, "x": 439, "y0": 0, "y1": 439, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 440, "x": 440, "y0": 0, "y1": 440, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 441, "x": 441, "y0": 0, "y1": 441, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 442, "x": 442, "y0": 0, "y1": 442, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 443, "x": 443, "y0": 0, "y1": 443, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 444, "x": 444, "y0": 0, "y1": 444, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 445, "x": 445, "y0": 0, "y1": 445, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 446, "x": 446, "y0": 0, "y1": 446, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 447, "x": 447, "y0": 0, "y1": 447, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 448, "x": 448, "y0": 0, "y1": 448, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 449, "x": 449, "y0": 0, "y1": 449, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 450, "x": 450, "y0": 0, "y1": 450, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 451, "x": 451, "y0": 0, "y1": 451, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 452, "x": 452, "y0": 0, "y1": 452, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 453, "x": 453, "y0": 0, "y1": 453, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 454, "x": 454, "y0": 0, "y1": 454, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 455, "x": 455, "y0": 0, "y1": 455, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 456, "x": 456, "y0": 0, "y1": 456, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 457, "x": 457, "y0": 0, "y1": 457, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 458, "x": 458, "y0": 0, "y1": 458, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 459, "x": 459, "y0": 0, "y1": 459, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 460, "x": 460, "y0": 0, "y1": 460, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 461, "x": 461, "y0": 0, "y1": 461, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 462, "x": 462, "y0": 0, "y1": 462, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 463, "x": 463, "y0": 0, "y1": 463, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 464, "x": 464, "y0": 0, "y1": 464, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 465, "x": 465, "y0": 0, "y1": 465, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 466, "x": 466, "y0": 0, "y1": 466, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 467, "x": 467, "y0": 0, "y1": 467, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 468, "x": 468, "y0": 0, "y1": 468, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 469, "x": 469, "y0": 0, "y1": 469, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 470, "x": 470, "y0": 0, "y1": 470, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 471, "x": 471, "y0": 0, "y1": 471, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 472, "x": 472, "y0": 0, "y1": 472, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 473, "x": 473, "y0": 0, "y1": 473, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 474, "x": 474, "y0": 0, "y1": 474, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 475, "x": 475, "y0": 0, "y1": 475, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 476, "x": 476, "y0": 0, "y1": 476, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 477, "x": 477, "y0": 0, "y1": 477, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 478, "x": 478, "y0": 0, "y1": 478, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 479, "x": 479, "y0": 0, "y1": 479, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 480, "x": 480, "y0": 0, "y1": 480, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 481, "x": 481, "y0": 0, "y1": 481, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 482, "x": 482, "y0": 0, "y1": 482, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 483, "x": 483, "y0": 0, "y1": 483, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 484, "x": 484, "y0": 0, "y1": 484, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 485, "x": 485, "y0": 0, "y1": 485, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 486, "x": 486, "y0": 0, "y1": 486, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 487, "x": 487, "y0": 0, "y1": 487, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 488, "x": 488, "y0": 0, "y1": 488, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 489, "x": 489, "y0": 0, "y1": 489, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 490, "x": 490, "y0": 0, "y1": 490, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 491, "x": 491, "y0": 0, "y1": 491, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 492, "x": 492, "y0": 0, "y1": 492, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 493, "x": 493, "y0": 0, "y1": 493, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 494, "x": 494, "y0": 0, "y1": 494, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 495, "x": 495, "y0": 0, "y1": 495, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 496, "x": 496, "y0": 0, "y1": 496, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 497, "x": 497, "y0": 0, "y1": 497, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 498, "x": 498, "y0": 0, "y1": 498, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 499, "x": 499, "y0": 0, "y1": 499, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 500, "x": 500, "y0": 0, "y1": 500, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 501, "x": 501, "y0": 0, "y1": 501, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 502, "x": 502, "y0": 0, "y1": 502, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 503, "x": 503, "y0": 0, "y1": 503, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 504, "x": 504, "y0": 0, "y1": 504, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 505, "x": 505, "y0": 0, "y1": 505, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 506, "x": 506, "y0": 0, "y1": 506, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 507, "x": 507, "y0": 0, "y1": 507, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 508, "x": 508, "y0": 0, "y1": 508, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 509, "x": 509, "y0": 0, "y1": 509, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 510, "x": 510, "y0": 0, "y1": 510, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 511, "x": 511, "y0": 0, "y1": 511, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 512, "x": 512, "y0": 0, "y1": 512, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 513, "x": 513, "y0": 0, "y1": 513, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 514, "x": 514, "y0": 0, "y1": 514, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 515, "x": 515, "y0": 0, "y1": 515, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 516, "x": 516, "y0": 0, "y1": 516, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 517, "x": 517, "y0": 0, "y1": 517, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 518, "x": 518, "y0": 0, "y1": 518, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 519, "x": 519, "y0": 0, "y1": 519, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 520, "x": 520, "y0": 0, "y1": 520, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 521, "x": 521, "y0": 0, "y1": 521, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 522, "x": 522, "y0": 0, "y1": 522, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 523, "x": 523, "y0": 0, "y1": 523, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 524, "x": 524, "y0": 0, "y1": 524, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 525, "x": 525, "y0": 0, "y1": 525, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 526, "x": 526, "y0": 0, "y1": 526, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 527, "x": 527, "y0": 0, "y1": 527, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 528, "x": 528, "y0": 0, "y1": 528, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 529, "x": 529, "y0": 0, "y1": 529, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 530, "x": 530, "y0": 0, "y1": 530, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 531, "x": 531, "y0": 0, "y1": 531, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 532, "x": 532, "y0": 0, "y1": 532, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 533, "x": 533, "y0": 0, "y1": 533, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 534, "x": 534, "y0": 0, "y1": 534, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 535, "x": 535, "y0": 0, "y1": 535, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 536, "x": 536, "y0": 0, "y1": 536, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 537, "x": 537, "y0": 0, "y1": 537, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 538, "x": 538, "y0": 0, "y1": 538, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 539, "x": 539, "y0": 0, "y1": 539, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 540, "x": 540, "y0": 0, "y1": 540, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 541, "x": 541, "y0": 0, "y1": 541, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 542, "x": 542, "y0": 0, "y1": 542, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 543, "x": 543, "y0": 0, "y1": 543, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 544, "x": 544, "y0": 0, "y1": 544, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 545, "x": 545, "y0": 0, "y1": 545, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 546, "x": 546, "y0": 0, "y1": 546, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 547, "x": 547, "y0": 0, "y1": 547, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 548, "x": 548, "y0": 0, "y1": 548, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 549, "x": 549, "y0": 0, "y1": 549, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 550, "x": 550, "y0": 0, "y1": 550, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 551, "x": 551, "y0": 0, "y1": 551, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 552, "x": 552, "y0": 0, "y1": 552, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 553, "x": 553, "y0": 0, "y1": 553, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 554, "x": 554, "y0": 0, "y1": 554, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 555, "x": 555, "y0": 0, "y1": 555, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 556, "x": 556, "y0": 0, "y1": 556, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 557, "x": 557, "y0": 0, "y1": 557, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 558, "x": 558, "y0": 0, "y1": 558, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 559, "x": 559, "y0": 0, "y1": 559, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 560, "x": 560, "y0": 0, "y1": 560, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 561, "x": 561, "y0": 0, "y1": 561, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 562, "x": 562, "y0": 0, "y1": 562, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 563, "x": 563, "y0": 0, "y1": 563, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 564, "x": 564, "y0": 0, "y1": 564, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 565, "x": 565, "y0": 0, "y1": 565, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 566, "x": 566, "y0": 0, "y1": 566, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 567, "x": 567, "y0": 0, "y1": 567, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 568, "x": 568, "y0": 0, "y1": 568, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 569, "x": 569, "y0": 0, "y1": 569, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 570, "x": 570, "y0": 0, "y1": 570, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 571, "x": 571, "y0": 0, "y1": 571, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 572, "x": 572, "y0": 0, "y1": 572, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 573, "x": 573, "y0": 0, "y1": 573, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 574, "x": 574, "y0": 0, "y1": 574, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 575, "x": 575, "y0": 0, "y1": 575, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 576, "x": 576, "y0": 0, "y1": 576, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 577, "x": 577, "y0": 0, "y1": 577, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 578, "x": 578, "y0": 0, "y1": 578, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 579, "x": 579, "y0": 0, "y1": 579, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 580, "x": 580, "y0": 0, "y1": 580, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 581, "x": 581, "y0": 0, "y1": 581, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 582, "x": 582, "y0": 0, "y1": 582, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 583, "x": 583, "y0": 0, "y1": 583, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 584, "x": 584, "y0": 0, "y1": 584, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 585, "x": 585, "y0": 0, "y1": 585, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 586, "x": 586, "y0": 0, "y1": 586, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 587, "x": 587, "y0": 0, "y1": 587, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 588, "x": 588, "y0": 0, "y1": 588, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 589, "x": 589, "y0": 0, "y1": 589, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 590, "x": 590, "y0": 0, "y1": 590, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 591, "x": 591, "y0": 0, "y1": 591, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 592, "x": 592, "y0": 0, "y1": 592, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 593, "x": 593, "y0": 0, "y1": 593, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 594, "x": 594, "y0": 0, "y1": 594, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 595, "x": 595, "y0": 0, "y1": 595, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 596, "x": 596, "y0": 0, "y1": 596, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 597, "x": 597, "y0": 0, "y1": 597, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 598, "x": 598, "y0": 0, "y1": 598, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 599, "x": 599, "y0": 0, "y1": 599, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 600, "x": 600, "y0": 0, "y1": 600, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 601, "x": 601, "y0": 0, "y1": 601, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 602, "x": 602, "y0": 0, "y1": 602, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 603, "x": 603, "y0": 0, "y1": 603, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 604, "x": 604, "y0": 0, "y1": 604, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 605, "x": 605, "y0": 0, "y1": 605, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 606, "x": 606, "y0": 0, "y1": 606, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 607, "x": 607, "y0": 0, "y1": 607, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 608, "x": 608, "y0": 0, "y1": 608, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 609, "x": 609, "y0": 0, "y1": 609, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 610, "x": 610, "y0": 0, "y1": 610, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 611, "x": 611, "y0": 0, "y1": 611, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 612, "x": 612, "y0": 0, "y1": 612, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 613, "x": 613, "y0": 0, "y1": 613, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 614, "x": 614, "y0": 0, "y1": 614, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 615, "x": 615, "y0": 0, "y1": 615, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 616, "x": 616, "y0": 0, "y1": 616, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 617, "x": 617, "y0": 0, "y1": 617, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 618, "x": 618, "y0": 0, "y1": 618, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 619, "x": 619, "y0": 0, "y1": 619, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 620, "x": 620, "y0": 0, "y1": 620, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 621, "x": 621, "y0": 0, "y1": 621, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 622, "x": 622, "y0": 0, "y1": 622, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 623, "x": 623, "y0": 0, "y1": 623, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 624, "x": 624, "y0": 0, "y1": 624, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 625, "x": 625, "y0": 0, "y1": 625, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 626, "x": 626, "y0": 0, "y1": 626, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 627, "x": 627, "y0": 0, "y1": 627, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 628, "x": 628, "y0": 0, "y1": 628, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 629, "x": 629, "y0": 0, "y1": 629, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 630, "x": 630, "y0": 0, "y1": 630, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 631, "x": 631, "y0": 0, "y1": 631, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 632, "x": 632, "y0": 0, "y1": 632, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 633, "x": 633, "y0": 0, "y1": 633, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 634, "x": 634, "y0": 0, "y1": 634, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 635, "x": 635, "y0": 0, "y1": 635, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 636, "x": 636, "y0": 0, "y1": 636, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 637, "x": 637, "y0": 0, "y1": 637, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 638, "x": 638, "y0": 0, "y1": 638, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 639, "x": 639, "y0": 0, "y1": 639, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 640, "x": 640, "y0": 0, "y1": 640, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 641, "x": 641, "y0": 0, "y1": 641, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 642, "x": 642, "y0": 0, "y1": 642, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 643, "x": 643, "y0": 0, "y1": 643, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 644, "x": 644, "y0": 0, "y1": 644, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 645, "x": 645, "y0": 0, "y1": 645, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 646, "x": 646, "y0": 0, "y1": 646, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 647, "x": 647, "y0": 0, "y1": 647, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 648, "x": 648, "y0": 0, "y1": 648, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 649, "x": 649, "y0": 0, "y1": 649, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 650, "x": 650, "y0": 0, "y1": 650, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 651, "x": 651, "y0": 0, "y1": 651, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 652, "x": 652, "y0": 0, "y1": 652, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 653, "x": 653, "y0": 0, "y1": 653, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 654, "x": 654, "y0": 0, "y1": 654, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 655, "x": 655, "y0": 0, "y1": 655, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 656, "x": 656, "y0": 0, "y1": 656, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 657, "x": 657, "y0": 0, "y1": 657, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 658, "x": 658, "y0": 0, "y1": 658, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 659, "x": 659, "y0": 0, "y1": 659, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 660, "x": 660, "y0": 0, "y1": 660, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 661, "x": 661, "y0": 0, "y1": 661, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 662, "x": 662, "y0": 0, "y1": 662, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 663, "x": 663, "y0": 0, "y1": 663, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 664, "x": 664, "y0": 0, "y1": 664, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 665, "x": 665, "y0": 0, "y1": 665, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 666, "x": 666, "y0": 0, "y1": 666, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 667, "x": 667, "y0": 0, "y1": 667, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 668, "x": 668, "y0": 0, "y1": 668, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 669, "x": 669, "y0": 0, "y1": 669, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 670, "x": 670, "y0": 0, "y1": 670, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 671, "x": 671, "y0": 0, "y1": 671, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 672, "x": 672, "y0": 0, "y1": 672, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 673, "x": 673, "y0": 0, "y1": 673, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 674, "x": 674, "y0": 0, "y1": 674, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 675, "x": 675, "y0": 0, "y1": 675, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 676, "x": 676, "y0": 0, "y1": 676, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 677, "x": 677, "y0": 0, "y1": 677, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 678, "x": 678, "y0": 0, "y1": 678, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 679, "x": 679, "y0": 0, "y1": 679, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 680, "x": 680, "y0": 0, "y1": 680, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 681, "x": 681, "y0": 0, "y1": 681, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 682, "x": 682, "y0": 0, "y1": 682, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 683, "x": 683, "y0": 0, "y1": 683, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 684, "x": 684, "y0": 0, "y1": 684, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 685, "x": 685, "y0": 0, "y1": 685, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 686, "x": 686, "y0": 0, "y1": 686, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 687, "x": 687, "y0": 0, "y1": 687, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 688, "x": 688, "y0": 0, "y1": 688, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 689, "x": 689, "y0": 0, "y1": 689, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 690, "x": 690, "y0": 0, "y1": 690, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 691, "x": 691, "y0": 0, "y1": 691, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 692, "x": 692, "y0": 0, "y1": 692, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 693, "x": 693, "y0": 0, "y1": 693, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 694, "x": 694, "y0": 0, "y1": 694, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 695, "x": 695, "y0": 0, "y1": 695, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 696, "x": 696, "y0": 0, "y1": 696, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 697, "x": 697, "y0": 0, "y1": 697, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 698, "x": 698, "y0": 0, "y1": 698, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 699, "x": 699, "y0": 0, "y1": 699, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 700, "x": 700, "y0": 0, "y1": 700, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 701, "x": 701, "y0": 0, "y1": 701, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 702, "x": 702, "y0": 0, "y1": 702, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 703, "x": 703, "y0": 0, "y1": 703, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 704, "x": 704, "y0": 0, "y1": 704, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 705, "x": 705, "y0": 0, "y1": 705, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 706, "x": 706, "y0": 0, "y1": 706, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 707, "x": 707, "y0": 0, "y1": 707, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 708, "x": 708, "y0": 0, "y1": 708, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 709, "x": 709, "y0": 0, "y1": 709, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 710, "x": 710, "y0": 0, "y1": 710, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 711, "x": 711, "y0": 0, "y1": 711, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 712, "x": 712, "y0": 0, "y1": 712, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 713, "x": 713, "y0": 0, "y1": 713, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 714, "x": 714, "y0": 0, "y1": 714, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 715, "x": 715, "y0": 0, "y1": 715, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 716, "x": 716, "y0": 0, "y1": 716, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 717, "x": 717, "y0": 0, "y1": 717, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 718, "x": 718, "y0": 0, "y1": 718, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 719, "x": 719, "y0": 0, "y1": 719, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 720, "x": 720, "y0": 0, "y1": 720, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 721, "x": 721, "y0": 0, "y1": 721, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 722, "x": 722, "y0": 0, "y1": 722, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 723, "x": 723, "y0": 0, "y1": 723, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 724, "x": 724, "y0": 0, "y1": 724, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 725, "x": 725, "y0": 0, "y1": 725, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 726, "x": 726, "y0": 0, "y1": 726, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 727, "x": 727, "y0": 0, "y1": 727, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 728, "x": 728, "y0": 0, "y1": 728, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 729, "x": 729, "y0": 0, "y1": 729, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 730, "x": 730, "y0": 0, "y1": 730, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 731, "x": 731, "y0": 0, "y1": 731, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 732, "x": 732, "y0": 0, "y1": 732, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 733, "x": 733, "y0": 0, "y1": 733, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 734, "x": 734, "y0": 0, "y1": 734, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 735, "x": 735, "y0": 0, "y1": 735, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 736, "x": 736, "y0": 0, "y1": 736, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 737, "x": 737, "y0": 0, "y1": 737, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 738, "x": 738, "y0": 0, "y1": 738, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 739, "x": 739, "y0": 0, "y1": 739, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 740, "x": 740, "y0": 0, "y1": 740, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 741, "x": 741, "y0": 0, "y1": 741, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 742, "x": 742, "y0": 0, "y1": 742, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 743, "x": 743, "y0": 0, "y1": 743, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 744, "x": 744, "y0": 0, "y1": 744, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 745, "x": 745, "y0": 0, "y1": 745, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 746, "x": 746, "y0": 0, "y1": 746, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 747, "x": 747, "y0": 0, "y1": 747, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 748, "x": 748, "y0": 0, "y1": 748, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 749, "x": 749, "y0": 0, "y1": 749, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 750, "x": 750, "y0": 0, "y1": 750, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 751, "x": 751, "y0": 0, "y1": 751, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 752, "x": 752, "y0": 0, "y1": 752, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 753, "x": 753, "y0": 0, "y1": 753, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 754, "x": 754, "y0": 0, "y1": 754, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 755, "x": 755, "y0": 0, "y1": 755, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 756, "x": 756, "y0": 0, "y1": 756, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 757, "x": 757, "y0": 0, "y1": 757, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 758, "x": 758, "y0": 0, "y1": 758, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 759, "x": 759, "y0": 0, "y1": 759, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 760, "x": 760, "y0": 0, "y1": 760, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 761, "x": 761, "y0": 0, "y1": 761, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 762, "x": 762, "y0": 0, "y1": 762, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 763, "x": 763, "y0": 0, "y1": 763, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 764, "x": 764, "y0": 0, "y1": 764, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 765, "x": 765, "y0": 0, "y1": 765, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 766, "x": 766, "y0": 0, "y1": 766, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 767, "x": 767, "y0": 0, "y1": 767, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 768, "x": 768, "y0": 0, "y1": 768, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 769, "x": 769, "y0": 0, "y1": 769, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 770, "x": 770, "y0": 0, "y1": 770, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 771, "x": 771, "y0": 0, "y1": 771, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 772, "x": 772, "y0": 0, "y1": 772, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 773, "x": 773, "y0": 0, "y1": 773, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 774, "x": 774, "y0": 0, "y1": 774, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 775, "x": 775, "y0": 0, "y1": 775, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 776, "x": 776, "y0": 0, "y1": 776, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 777, "x": 777, "y0": 0, "y1": 777, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 778, "x": 778, "y0": 0, "y1": 778, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 779, "x": 779, "y0": 0, "y1": 779, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 780, "x": 780, "y0": 0, "y1": 780, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 781, "x": 781, "y0": 0, "y1": 781, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 782, "x": 782, "y0": 0, "y1": 782, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 783, "x": 783, "y0": 0, "y1": 783, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 784, "x": 784, "y0": 0, "y1": 784, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 785, "x": 785, "y0": 0, "y1": 785, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 786, "x": 786, "y0": 0, "y1": 786, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 787, "x": 787, "y0": 0, "y1": 787, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 788, "x": 788, "y0": 0, "y1": 788, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 789, "x": 789, "y0": 0, "y1": 789, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 790, "x": 790, "y0": 0, "y1": 790, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 791, "x": 791, "y0": 0, "y1": 791, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 792, "x": 792, "y0": 0, "y1": 792, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 793, "x": 793, "y0": 0, "y1": 793, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 794, "x": 794, "y0": 0, "y1": 794, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 795, "x": 795, "y0": 0, "y1": 795, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 796, "x": 796, "y0": 0, "y1": 796, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 797, "x": 797, "y0": 0, "y1": 797, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 798, "x": 798, "y0": 0, "y1": 798, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 799, "x": 799, "y0": 0, "y1": 799, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 800, "x": 800, "y0": 0, "y1": 800, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 801, "x": 801, "y0": 0, "y1": 801, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 802, "x": 802, "y0": 0, "y1": 802, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 803, "x": 803, "y0": 0, "y1": 803, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 804, "x": 804, "y0": 0, "y1": 804, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 805, "x": 805, "y0": 0, "y1": 805, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 806, "x": 806, "y0": 0, "y1": 806, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 807, "x": 807, "y0": 0, "y1": 807, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 808, "x": 808, "y0": 0, "y1": 808, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 809, "x": 809, "y0": 0, "y1": 809, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 810, "x": 810, "y0": 0, "y1": 810, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 811, "x": 811, "y0": 0, "y1": 811, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 812, "x": 812, "y0": 0, "y1": 812, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 813, "x": 813, "y0": 0, "y1": 813, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 814, "x": 814, "y0": 0, "y1": 814, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 815, "x": 815, "y0": 0, "y1": 815, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 816, "x": 816, "y0": 0, "y1": 816, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 817, "x": 817, "y0": 0, "y1": 817, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 818, "x": 818, "y0": 0, "y1": 818, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 819, "x": 819, "y0": 0, "y1": 819, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 820, "x": 820, "y0": 0, "y1": 820, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 821, "x": 821, "y0": 0, "y1": 821, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 822, "x": 822, "y0": 0, "y1": 822, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 823, "x": 823, "y0": 0, "y1": 823, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 824, "x": 824, "y0": 0, "y1": 824, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 825, "x": 825, "y0": 0, "y1": 825, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 826, "x": 826, "y0": 0, "y1": 826, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 827, "x": 827, "y0": 0, "y1": 827, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 828, "x": 828, "y0": 0, "y1": 828, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 829, "x": 829, "y0": 0, "y1": 829, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 830, "x": 830, "y0": 0, "y1": 830, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 831, "x": 831, "y0": 0, "y1": 831, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 832, "x": 832, "y0": 0, "y1": 832, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 833, "x": 833, "y0": 0, "y1": 833, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 834, "x": 834, "y0": 0, "y1": 834, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 835, "x": 835, "y0": 0, "y1": 835, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 836, "x": 836, "y0": 0, "y1": 836, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 837, "x": 837, "y0": 0, "y1": 837, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 838, "x": 838, "y0": 0, "y1": 838, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 839, "x": 839, "y0": 0, "y1": 839, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 840, "x": 840, "y0": 0, "y1": 840, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 841, "x": 841, "y0": 0, "y1": 841, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 842, "x": 842, "y0": 0, "y1": 842, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 843, "x": 843, "y0": 0, "y1": 843, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 844, "x": 844, "y0": 0, "y1": 844, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 845, "x": 845, "y0": 0, "y1": 845, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 846, "x": 846, "y0": 0, "y1": 846, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 847, "x": 847, "y0": 0, "y1": 847, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 848, "x": 848, "y0": 0, "y1": 848, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 849, "x": 849, "y0": 0, "y1": 849, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 850, "x": 850, "y0": 0, "y1": 850, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 851, "x": 851, "y0": 0, "y1": 851, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 852, "x": 852, "y0": 0, "y1": 852, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 853, "x": 853, "y0": 0, "y1": 853, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 854, "x": 854, "y0": 0, "y1": 854, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 855, "x": 855, "y0": 0, "y1": 855, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 856, "x": 856, "y0": 0, "y1": 856, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 857, "x": 857, "y0": 0, "y1": 857, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 858, "x": 858, "y0": 0, "y1": 858, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 859, "x": 859, "y0": 0, "y1": 859, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 860, "x": 860, "y0": 0, "y1": 860, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 861, "x": 861, "y0": 0, "y1": 861, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 862, "x": 862, "y0": 0, "y1": 862, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 863, "x": 863, "y0": 0, "y1": 863, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 864, "x": 864, "y0": 0, "y1": 864, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 865, "x": 865, "y0": 0, "y1": 865, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 866, "x": 866, "y0": 0, "y1": 866, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 867, "x": 867, "y0": 0, "y1": 867, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 868, "x": 868, "y0": 0, "y1": 868, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 869, "x": 869, "y0": 0, "y1": 869, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 870, "x": 870, "y0": 0, "y1": 870, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 871, "x": 871, "y0": 0, "y1": 871, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 872, "x": 872, "y0": 0, "y1": 872, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 873, "x": 873, "y0": 0, "y1": 873, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 874, "x": 874, "y0": 0, "y1": 874, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 875, "x": 875, "y0": 0, "y1": 875, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 876, "x": 876, "y0": 0, "y1": 876, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 877, "x": 877, "y0": 0, "y1": 877, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 878, "x": 878, "y0": 0, "y1": 878, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 879, "x": 879, "y0": 0, "y1": 879, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 880, "x": 880, "y0": 0, "y1": 880, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 881, "x": 881, "y0": 0, "y1": 881, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 882, "x": 882, "y0": 0, "y1": 882, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 883, "x": 883, "y0": 0, "y1": 883, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 884, "x": 884, "y0": 0, "y1": 884, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 885, "x": 885, "y0": 0, "y1": 885, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 886, "x": 886, "y0": 0, "y1": 886, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 887, "x": 887, "y0": 0, "y1": 887, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 888, "x": 888, "y0": 0, "y1": 888, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 889, "x": 889, "y0": 0, "y1": 889, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 890, "x": 890, "y0": 0, "y1": 890, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 891, "x": 891, "y0": 0, "y1": 891, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 892, "x": 892, "y0": 0, "y1": 892, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 893, "x": 893, "y0": 0, "y1": 893, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 894, "x": 894, "y0": 0, "y1": 894, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 895, "x": 895, "y0": 0, "y1": 895, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 896, "x": 896, "y0": 0, "y1": 896, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 897, "x": 897, "y0": 0, "y1": 897, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 898, "x": 898, "y0": 0, "y1": 898, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 899, "x": 899, "y0": 0, "y1": 899, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 900, "x": 900, "y0": 0, "y1": 900, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 901, "x": 901, "y0": 0, "y1": 901, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 902, "x": 902, "y0": 0, "y1": 902, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 903, "x": 903, "y0": 0, "y1": 903, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 904, "x": 904, "y0": 0, "y1": 904, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 905, "x": 905, "y0": 0, "y1": 905, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 906, "x": 906, "y0": 0, "y1": 906, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 907, "x": 907, "y0": 0, "y1": 907, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 908, "x": 908, "y0": 0, "y1": 908, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 909, "x": 909, "y0": 0, "y1": 909, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 910, "x": 910, "y0": 0, "y1": 910, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 911, "x": 911, "y0": 0, "y1": 911, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 912, "x": 912, "y0": 0, "y1": 912, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 913, "x": 913, "y0": 0, "y1": 913, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 914, "x": 914, "y0": 0, "y1": 914, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 915, "x": 915, "y0": 0, "y1": 915, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 916, "x": 916, "y0": 0, "y1": 916, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 917, "x": 917, "y0": 0, "y1": 917, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 918, "x": 918, "y0": 0, "y1": 918, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 919, "x": 919, "y0": 0, "y1": 919, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 920, "x": 920, "y0": 0, "y1": 920, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 921, "x": 921, "y0": 0, "y1": 921, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 922, "x": 922, "y0": 0, "y1": 922, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 923, "x": 923, "y0": 0, "y1": 923, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 924, "x": 924, "y0": 0, "y1": 924, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 925, "x": 925, "y0": 0, "y1": 925, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 926, "x": 926, "y0": 0, "y1": 926, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 927, "x": 927, "y0": 0, "y1": 927, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 928, "x": 928, "y0": 0, "y1": 928, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 929, "x": 929, "y0": 0, "y1": 929, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 930, "x": 930, "y0": 0, "y1": 930, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 931, "x": 931, "y0": 0, "y1": 931, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 932, "x": 932, "y0": 0, "y1": 932, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 933, "x": 933, "y0": 0, "y1": 933, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 934, "x": 934, "y0": 0, "y1": 934, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 935, "x": 935, "y0": 0, "y1": 935, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 936, "x": 936, "y0": 0, "y1": 936, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 937, "x": 937, "y0": 0, "y1": 937, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 938, "x": 938, "y0": 0, "y1": 938, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 939, "x": 939, "y0": 0, "y1": 939, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 940, "x": 940, "y0": 0, "y1": 940, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 941, "x": 941, "y0": 0, "y1": 941, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 942, "x": 942, "y0": 0, "y1": 942, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 943, "x": 943, "y0": 0, "y1": 943, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 944, "x": 944, "y0": 0, "y1": 944, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 945, "x": 945, "y0": 0, "y1": 945, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 946, "x": 946, "y0": 0, "y1": 946, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 947, "x": 947, "y0": 0, "y1": 947, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 948, "x": 948, "y0": 0, "y1": 948, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 949, "x": 949, "y0": 0, "y1": 949, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 950, "x": 950, "y0": 0, "y1": 950, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 951, "x": 951, "y0": 0, "y1": 951, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 952, "x": 952, "y0": 0, "y1": 952, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 953, "x": 953, "y0": 0, "y1": 953, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 954, "x": 954, "y0": 0, "y1": 954, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 955, "x": 955, "y0": 0, "y1": 955, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 956, "x": 956, "y0": 0, "y1": 956, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 957, "x": 957, "y0": 0, "y1": 957, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 958, "x": 958, "y0": 0, "y1": 958, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 959, "x": 959, "y0": 0, "y1": 959, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 960, "x": 960, "y0": 0, "y1": 960, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 961, "x": 961, "y0": 0, "y1": 961, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 962, "x": 962, "y0": 0, "y1": 962, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 963, "x": 963, "y0": 0, "y1": 963, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 964, "x": 964, "y0": 0, "y1": 964, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 965, "x": 965, "y0": 0, "y1": 965, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 966, "x": 966, "y0": 0, "y1": 966, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 967, "x": 967, "y0": 0, "y1": 967, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 968, "x": 968, "y0": 0, "y1": 968, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 969, "x": 969, "y0": 0, "y1": 969, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 970, "x": 970, "y0": 0, "y1": 970, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 971, "x": 971, "y0": 0, "y1": 971, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 972, "x": 972, "y0": 0, "y1": 972, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 973, "x": 973, "y0": 0, "y1": 973, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 974, "x": 974, "y0": 0, "y1": 974, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 975, "x": 975, "y0": 0, "y1": 975, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 976, "x": 976, "y0": 0, "y1": 976, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 977, "x": 977, "y0": 0, "y1": 977, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 978, "x": 978, "y0": 0, "y1": 978, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 979, "x": 979, "y0": 0, "y1": 979, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 980, "x": 980, "y0": 0, "y1": 980, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 981, "x": 981, "y0": 0, "y1": 981, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 982, "x": 982, "y0": 0, "y1": 982, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 983, "x": 983, "y0": 0, "y1": 983, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 984, "x": 984, "y0": 0, "y1": 984, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 985, "x": 985, "y0": 0, "y1": 985, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 986, "x": 986, "y0": 0, "y1": 986, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 987, "x": 987, "y0": 0, "y1": 987, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 988, "x": 988, "y0": 0, "y1": 988, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 989, "x": 989, "y0": 0, "y1": 989, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 990, "x": 990, "y0": 0, "y1": 990, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 991, "x": 991, "y0": 0, "y1": 991, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 992, "x": 992, "y0": 0, "y1": 992, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 993, "x": 993, "y0": 0, "y1": 993, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 994, "x": 994, "y0": 0, "y1": 994, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 995, "x": 995, "y0": 0, "y1": 995, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 996, "x": 996, "y0": 0, "y1": 996, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 997, "x": 997, "y0": 0, "y1": 997, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 998, "x": 998, "y0": 0, "y1": 998, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 999, "x": 999, "y0": 0, "y1": 999, @@ -7192,6000 +9284,8000 @@ Array [ "data": Array [ Object { "datum": undefined, + "initialY0": null, + "initialY1": 0, "x": 0, "y0": 0, "y1": 0, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 1, "x": 1, "y0": 1, "y1": 2, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 2, "x": 2, "y0": 2, "y1": 4, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 3, "x": 3, "y0": 3, "y1": 6, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 4, "x": 4, "y0": 4, "y1": 8, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 5, "x": 5, "y0": 5, "y1": 10, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 6, "x": 6, "y0": 6, "y1": 12, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 7, "x": 7, "y0": 7, "y1": 14, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 8, "x": 8, "y0": 8, "y1": 16, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 9, "x": 9, "y0": 9, "y1": 18, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 10, "x": 10, "y0": 10, "y1": 20, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 11, "x": 11, "y0": 11, "y1": 22, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 12, "x": 12, "y0": 12, "y1": 24, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 13, "x": 13, "y0": 13, "y1": 26, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 14, "x": 14, "y0": 14, "y1": 28, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 15, "x": 15, "y0": 15, "y1": 30, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 16, "x": 16, "y0": 16, "y1": 32, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 17, "x": 17, "y0": 17, "y1": 34, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 18, "x": 18, "y0": 18, "y1": 36, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 19, "x": 19, "y0": 19, "y1": 38, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 20, "x": 20, "y0": 20, "y1": 40, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 21, "x": 21, "y0": 21, "y1": 42, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 22, "x": 22, "y0": 22, "y1": 44, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 23, "x": 23, "y0": 23, "y1": 46, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 24, "x": 24, "y0": 24, "y1": 48, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 25, "x": 25, "y0": 25, "y1": 50, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 26, "x": 26, "y0": 26, "y1": 52, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 27, "x": 27, "y0": 27, "y1": 54, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 28, "x": 28, "y0": 28, "y1": 56, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 29, "x": 29, "y0": 29, "y1": 58, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 30, "x": 30, "y0": 30, "y1": 60, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 31, "x": 31, "y0": 31, "y1": 62, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 32, "x": 32, "y0": 32, "y1": 64, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 33, "x": 33, "y0": 33, "y1": 66, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 34, "x": 34, "y0": 34, "y1": 68, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 35, "x": 35, "y0": 35, "y1": 70, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 36, "x": 36, "y0": 36, "y1": 72, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 37, "x": 37, "y0": 37, "y1": 74, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 38, "x": 38, "y0": 38, "y1": 76, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 39, "x": 39, "y0": 39, "y1": 78, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 40, "x": 40, "y0": 40, "y1": 80, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 41, "x": 41, "y0": 41, "y1": 82, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 42, "x": 42, "y0": 42, "y1": 84, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 43, "x": 43, "y0": 43, "y1": 86, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 44, "x": 44, "y0": 44, "y1": 88, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 45, "x": 45, "y0": 45, "y1": 90, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 46, "x": 46, "y0": 46, "y1": 92, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 47, "x": 47, "y0": 47, "y1": 94, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 48, "x": 48, "y0": 48, "y1": 96, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 49, "x": 49, "y0": 49, "y1": 98, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 50, "x": 50, "y0": 50, "y1": 100, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 51, "x": 51, "y0": 51, "y1": 102, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 52, "x": 52, "y0": 52, "y1": 104, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 53, "x": 53, "y0": 53, "y1": 106, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 54, "x": 54, "y0": 54, "y1": 108, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 55, "x": 55, "y0": 55, "y1": 110, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 56, "x": 56, "y0": 56, "y1": 112, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 57, "x": 57, "y0": 57, "y1": 114, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 58, "x": 58, "y0": 58, "y1": 116, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 59, "x": 59, "y0": 59, "y1": 118, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 60, "x": 60, "y0": 60, "y1": 120, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 61, "x": 61, "y0": 61, "y1": 122, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 62, "x": 62, "y0": 62, "y1": 124, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 63, "x": 63, "y0": 63, "y1": 126, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 64, "x": 64, "y0": 64, "y1": 128, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 65, "x": 65, "y0": 65, "y1": 130, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 66, "x": 66, "y0": 66, "y1": 132, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 67, "x": 67, "y0": 67, "y1": 134, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 68, "x": 68, "y0": 68, "y1": 136, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 69, "x": 69, "y0": 69, "y1": 138, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 70, "x": 70, "y0": 70, "y1": 140, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 71, "x": 71, "y0": 71, "y1": 142, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 72, "x": 72, "y0": 72, "y1": 144, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 73, "x": 73, "y0": 73, "y1": 146, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 74, "x": 74, "y0": 74, "y1": 148, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 75, "x": 75, "y0": 75, "y1": 150, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 76, "x": 76, "y0": 76, "y1": 152, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 77, "x": 77, "y0": 77, "y1": 154, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 78, "x": 78, "y0": 78, "y1": 156, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 79, "x": 79, "y0": 79, "y1": 158, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 80, "x": 80, "y0": 80, "y1": 160, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 81, "x": 81, "y0": 81, "y1": 162, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 82, "x": 82, "y0": 82, "y1": 164, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 83, "x": 83, "y0": 83, "y1": 166, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 84, "x": 84, "y0": 84, "y1": 168, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 85, "x": 85, "y0": 85, "y1": 170, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 86, "x": 86, "y0": 86, "y1": 172, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 87, "x": 87, "y0": 87, "y1": 174, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 88, "x": 88, "y0": 88, "y1": 176, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 89, "x": 89, "y0": 89, "y1": 178, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 90, "x": 90, "y0": 90, "y1": 180, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 91, "x": 91, "y0": 91, "y1": 182, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 92, "x": 92, "y0": 92, "y1": 184, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 93, "x": 93, "y0": 93, "y1": 186, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 94, "x": 94, "y0": 94, "y1": 188, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 95, "x": 95, "y0": 95, "y1": 190, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 96, "x": 96, "y0": 96, "y1": 192, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 97, "x": 97, "y0": 97, "y1": 194, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 98, "x": 98, "y0": 98, "y1": 196, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 99, "x": 99, "y0": 99, "y1": 198, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 100, "x": 100, "y0": 100, "y1": 200, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 101, "x": 101, "y0": 101, "y1": 202, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 102, "x": 102, "y0": 102, "y1": 204, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 103, "x": 103, "y0": 103, "y1": 206, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 104, "x": 104, "y0": 104, "y1": 208, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 105, "x": 105, "y0": 105, "y1": 210, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 106, "x": 106, "y0": 106, "y1": 212, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 107, "x": 107, "y0": 107, "y1": 214, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 108, "x": 108, "y0": 108, "y1": 216, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 109, "x": 109, "y0": 109, "y1": 218, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 110, "x": 110, "y0": 110, "y1": 220, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 111, "x": 111, "y0": 111, "y1": 222, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 112, "x": 112, "y0": 112, "y1": 224, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 113, "x": 113, "y0": 113, "y1": 226, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 114, "x": 114, "y0": 114, "y1": 228, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 115, "x": 115, "y0": 115, "y1": 230, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 116, "x": 116, "y0": 116, "y1": 232, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 117, "x": 117, "y0": 117, "y1": 234, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 118, "x": 118, "y0": 118, "y1": 236, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 119, "x": 119, "y0": 119, "y1": 238, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 120, "x": 120, "y0": 120, "y1": 240, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 121, "x": 121, "y0": 121, "y1": 242, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 122, "x": 122, "y0": 122, "y1": 244, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 123, "x": 123, "y0": 123, "y1": 246, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 124, "x": 124, "y0": 124, "y1": 248, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 125, "x": 125, "y0": 125, "y1": 250, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 126, "x": 126, "y0": 126, "y1": 252, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 127, "x": 127, "y0": 127, "y1": 254, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 128, "x": 128, "y0": 128, "y1": 256, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 129, "x": 129, "y0": 129, "y1": 258, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 130, "x": 130, "y0": 130, "y1": 260, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 131, "x": 131, "y0": 131, "y1": 262, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 132, "x": 132, "y0": 132, "y1": 264, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 133, "x": 133, "y0": 133, "y1": 266, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 134, "x": 134, "y0": 134, "y1": 268, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 135, "x": 135, "y0": 135, "y1": 270, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 136, "x": 136, "y0": 136, "y1": 272, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 137, "x": 137, "y0": 137, "y1": 274, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 138, "x": 138, "y0": 138, "y1": 276, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 139, "x": 139, "y0": 139, "y1": 278, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 140, "x": 140, "y0": 140, "y1": 280, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 141, "x": 141, "y0": 141, "y1": 282, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 142, "x": 142, "y0": 142, "y1": 284, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 143, "x": 143, "y0": 143, "y1": 286, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 144, "x": 144, "y0": 144, "y1": 288, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 145, "x": 145, "y0": 145, "y1": 290, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 146, "x": 146, "y0": 146, "y1": 292, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 147, "x": 147, "y0": 147, "y1": 294, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 148, "x": 148, "y0": 148, "y1": 296, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 149, "x": 149, "y0": 149, "y1": 298, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 150, "x": 150, "y0": 150, "y1": 300, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 151, "x": 151, "y0": 151, "y1": 302, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 152, "x": 152, "y0": 152, "y1": 304, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 153, "x": 153, "y0": 153, "y1": 306, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 154, "x": 154, "y0": 154, "y1": 308, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 155, "x": 155, "y0": 155, "y1": 310, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 156, "x": 156, "y0": 156, "y1": 312, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 157, "x": 157, "y0": 157, "y1": 314, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 158, "x": 158, "y0": 158, "y1": 316, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 159, "x": 159, "y0": 159, "y1": 318, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 160, "x": 160, "y0": 160, "y1": 320, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 161, "x": 161, "y0": 161, "y1": 322, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 162, "x": 162, "y0": 162, "y1": 324, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 163, "x": 163, "y0": 163, "y1": 326, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 164, "x": 164, "y0": 164, "y1": 328, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 165, "x": 165, "y0": 165, "y1": 330, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 166, "x": 166, "y0": 166, "y1": 332, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 167, "x": 167, "y0": 167, "y1": 334, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 168, "x": 168, "y0": 168, "y1": 336, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 169, "x": 169, "y0": 169, "y1": 338, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 170, "x": 170, "y0": 170, "y1": 340, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 171, "x": 171, "y0": 171, "y1": 342, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 172, "x": 172, "y0": 172, "y1": 344, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 173, "x": 173, "y0": 173, "y1": 346, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 174, "x": 174, "y0": 174, "y1": 348, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 175, "x": 175, "y0": 175, "y1": 350, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 176, "x": 176, "y0": 176, "y1": 352, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 177, "x": 177, "y0": 177, "y1": 354, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 178, "x": 178, "y0": 178, "y1": 356, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 179, "x": 179, "y0": 179, "y1": 358, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 180, "x": 180, "y0": 180, "y1": 360, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 181, "x": 181, "y0": 181, "y1": 362, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 182, "x": 182, "y0": 182, "y1": 364, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 183, "x": 183, "y0": 183, "y1": 366, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 184, "x": 184, "y0": 184, "y1": 368, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 185, "x": 185, "y0": 185, "y1": 370, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 186, "x": 186, "y0": 186, "y1": 372, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 187, "x": 187, "y0": 187, "y1": 374, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 188, "x": 188, "y0": 188, "y1": 376, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 189, "x": 189, "y0": 189, "y1": 378, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 190, "x": 190, "y0": 190, "y1": 380, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 191, "x": 191, "y0": 191, "y1": 382, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 192, "x": 192, "y0": 192, "y1": 384, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 193, "x": 193, "y0": 193, "y1": 386, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 194, "x": 194, "y0": 194, "y1": 388, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 195, "x": 195, "y0": 195, "y1": 390, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 196, "x": 196, "y0": 196, "y1": 392, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 197, "x": 197, "y0": 197, "y1": 394, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 198, "x": 198, "y0": 198, "y1": 396, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 199, "x": 199, "y0": 199, "y1": 398, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 200, "x": 200, "y0": 200, "y1": 400, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 201, "x": 201, "y0": 201, "y1": 402, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 202, "x": 202, "y0": 202, "y1": 404, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 203, "x": 203, "y0": 203, "y1": 406, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 204, "x": 204, "y0": 204, "y1": 408, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 205, "x": 205, "y0": 205, "y1": 410, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 206, "x": 206, "y0": 206, "y1": 412, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 207, "x": 207, "y0": 207, "y1": 414, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 208, "x": 208, "y0": 208, "y1": 416, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 209, "x": 209, "y0": 209, "y1": 418, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 210, "x": 210, "y0": 210, "y1": 420, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 211, "x": 211, "y0": 211, "y1": 422, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 212, "x": 212, "y0": 212, "y1": 424, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 213, "x": 213, "y0": 213, "y1": 426, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 214, "x": 214, "y0": 214, "y1": 428, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 215, "x": 215, "y0": 215, "y1": 430, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 216, "x": 216, "y0": 216, "y1": 432, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 217, "x": 217, "y0": 217, "y1": 434, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 218, "x": 218, "y0": 218, "y1": 436, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 219, "x": 219, "y0": 219, "y1": 438, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 220, "x": 220, "y0": 220, "y1": 440, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 221, "x": 221, "y0": 221, "y1": 442, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 222, "x": 222, "y0": 222, "y1": 444, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 223, "x": 223, "y0": 223, "y1": 446, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 224, "x": 224, "y0": 224, "y1": 448, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 225, "x": 225, "y0": 225, "y1": 450, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 226, "x": 226, "y0": 226, "y1": 452, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 227, "x": 227, "y0": 227, "y1": 454, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 228, "x": 228, "y0": 228, "y1": 456, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 229, "x": 229, "y0": 229, "y1": 458, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 230, "x": 230, "y0": 230, "y1": 460, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 231, "x": 231, "y0": 231, "y1": 462, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 232, "x": 232, "y0": 232, "y1": 464, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 233, "x": 233, "y0": 233, "y1": 466, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 234, "x": 234, "y0": 234, "y1": 468, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 235, "x": 235, "y0": 235, "y1": 470, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 236, "x": 236, "y0": 236, "y1": 472, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 237, "x": 237, "y0": 237, "y1": 474, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 238, "x": 238, "y0": 238, "y1": 476, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 239, "x": 239, "y0": 239, "y1": 478, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 240, "x": 240, "y0": 240, "y1": 480, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 241, "x": 241, "y0": 241, "y1": 482, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 242, "x": 242, "y0": 242, "y1": 484, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 243, "x": 243, "y0": 243, "y1": 486, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 244, "x": 244, "y0": 244, "y1": 488, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 245, "x": 245, "y0": 245, "y1": 490, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 246, "x": 246, "y0": 246, "y1": 492, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 247, "x": 247, "y0": 247, "y1": 494, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 248, "x": 248, "y0": 248, "y1": 496, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 249, "x": 249, "y0": 249, "y1": 498, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 250, "x": 250, "y0": 250, "y1": 500, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 251, "x": 251, "y0": 251, "y1": 502, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 252, "x": 252, "y0": 252, "y1": 504, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 253, "x": 253, "y0": 253, "y1": 506, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 254, "x": 254, "y0": 254, "y1": 508, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 255, "x": 255, "y0": 255, "y1": 510, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 256, "x": 256, "y0": 256, "y1": 512, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 257, "x": 257, "y0": 257, "y1": 514, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 258, "x": 258, "y0": 258, "y1": 516, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 259, "x": 259, "y0": 259, "y1": 518, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 260, "x": 260, "y0": 260, "y1": 520, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 261, "x": 261, "y0": 261, "y1": 522, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 262, "x": 262, "y0": 262, "y1": 524, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 263, "x": 263, "y0": 263, "y1": 526, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 264, "x": 264, "y0": 264, "y1": 528, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 265, "x": 265, "y0": 265, "y1": 530, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 266, "x": 266, "y0": 266, "y1": 532, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 267, "x": 267, "y0": 267, "y1": 534, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 268, "x": 268, "y0": 268, "y1": 536, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 269, "x": 269, "y0": 269, "y1": 538, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 270, "x": 270, "y0": 270, "y1": 540, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 271, "x": 271, "y0": 271, "y1": 542, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 272, "x": 272, "y0": 272, "y1": 544, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 273, "x": 273, "y0": 273, "y1": 546, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 274, "x": 274, "y0": 274, "y1": 548, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 275, "x": 275, "y0": 275, "y1": 550, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 276, "x": 276, "y0": 276, "y1": 552, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 277, "x": 277, "y0": 277, "y1": 554, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 278, "x": 278, "y0": 278, "y1": 556, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 279, "x": 279, "y0": 279, "y1": 558, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 280, "x": 280, "y0": 280, "y1": 560, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 281, "x": 281, "y0": 281, "y1": 562, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 282, "x": 282, "y0": 282, "y1": 564, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 283, "x": 283, "y0": 283, "y1": 566, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 284, "x": 284, "y0": 284, "y1": 568, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 285, "x": 285, "y0": 285, "y1": 570, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 286, "x": 286, "y0": 286, "y1": 572, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 287, "x": 287, "y0": 287, "y1": 574, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 288, "x": 288, "y0": 288, "y1": 576, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 289, "x": 289, "y0": 289, "y1": 578, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 290, "x": 290, "y0": 290, "y1": 580, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 291, "x": 291, "y0": 291, "y1": 582, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 292, "x": 292, "y0": 292, "y1": 584, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 293, "x": 293, "y0": 293, "y1": 586, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 294, "x": 294, "y0": 294, "y1": 588, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 295, "x": 295, "y0": 295, "y1": 590, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 296, "x": 296, "y0": 296, "y1": 592, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 297, "x": 297, "y0": 297, "y1": 594, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 298, "x": 298, "y0": 298, "y1": 596, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 299, "x": 299, "y0": 299, "y1": 598, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 300, "x": 300, "y0": 300, "y1": 600, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 301, "x": 301, "y0": 301, "y1": 602, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 302, "x": 302, "y0": 302, "y1": 604, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 303, "x": 303, "y0": 303, "y1": 606, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 304, "x": 304, "y0": 304, "y1": 608, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 305, "x": 305, "y0": 305, "y1": 610, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 306, "x": 306, "y0": 306, "y1": 612, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 307, "x": 307, "y0": 307, "y1": 614, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 308, "x": 308, "y0": 308, "y1": 616, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 309, "x": 309, "y0": 309, "y1": 618, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 310, "x": 310, "y0": 310, "y1": 620, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 311, "x": 311, "y0": 311, "y1": 622, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 312, "x": 312, "y0": 312, "y1": 624, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 313, "x": 313, "y0": 313, "y1": 626, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 314, "x": 314, "y0": 314, "y1": 628, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 315, "x": 315, "y0": 315, "y1": 630, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 316, "x": 316, "y0": 316, "y1": 632, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 317, "x": 317, "y0": 317, "y1": 634, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 318, "x": 318, "y0": 318, "y1": 636, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 319, "x": 319, "y0": 319, "y1": 638, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 320, "x": 320, "y0": 320, "y1": 640, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 321, "x": 321, "y0": 321, "y1": 642, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 322, "x": 322, "y0": 322, "y1": 644, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 323, "x": 323, "y0": 323, "y1": 646, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 324, "x": 324, "y0": 324, "y1": 648, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 325, "x": 325, "y0": 325, "y1": 650, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 326, "x": 326, "y0": 326, "y1": 652, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 327, "x": 327, "y0": 327, "y1": 654, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 328, "x": 328, "y0": 328, "y1": 656, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 329, "x": 329, "y0": 329, "y1": 658, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 330, "x": 330, "y0": 330, "y1": 660, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 331, "x": 331, "y0": 331, "y1": 662, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 332, "x": 332, "y0": 332, "y1": 664, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 333, "x": 333, "y0": 333, "y1": 666, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 334, "x": 334, "y0": 334, "y1": 668, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 335, "x": 335, "y0": 335, "y1": 670, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 336, "x": 336, "y0": 336, "y1": 672, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 337, "x": 337, "y0": 337, "y1": 674, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 338, "x": 338, "y0": 338, "y1": 676, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 339, "x": 339, "y0": 339, "y1": 678, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 340, "x": 340, "y0": 340, "y1": 680, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 341, "x": 341, "y0": 341, "y1": 682, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 342, "x": 342, "y0": 342, "y1": 684, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 343, "x": 343, "y0": 343, "y1": 686, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 344, "x": 344, "y0": 344, "y1": 688, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 345, "x": 345, "y0": 345, "y1": 690, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 346, "x": 346, "y0": 346, "y1": 692, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 347, "x": 347, "y0": 347, "y1": 694, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 348, "x": 348, "y0": 348, "y1": 696, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 349, "x": 349, "y0": 349, "y1": 698, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 350, "x": 350, "y0": 350, "y1": 700, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 351, "x": 351, "y0": 351, "y1": 702, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 352, "x": 352, "y0": 352, "y1": 704, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 353, "x": 353, "y0": 353, "y1": 706, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 354, "x": 354, "y0": 354, "y1": 708, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 355, "x": 355, "y0": 355, "y1": 710, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 356, "x": 356, "y0": 356, "y1": 712, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 357, "x": 357, "y0": 357, "y1": 714, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 358, "x": 358, "y0": 358, "y1": 716, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 359, "x": 359, "y0": 359, "y1": 718, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 360, "x": 360, "y0": 360, "y1": 720, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 361, "x": 361, "y0": 361, "y1": 722, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 362, "x": 362, "y0": 362, "y1": 724, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 363, "x": 363, "y0": 363, "y1": 726, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 364, "x": 364, "y0": 364, "y1": 728, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 365, "x": 365, "y0": 365, "y1": 730, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 366, "x": 366, "y0": 366, "y1": 732, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 367, "x": 367, "y0": 367, "y1": 734, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 368, "x": 368, "y0": 368, "y1": 736, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 369, "x": 369, "y0": 369, "y1": 738, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 370, "x": 370, "y0": 370, "y1": 740, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 371, "x": 371, "y0": 371, "y1": 742, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 372, "x": 372, "y0": 372, "y1": 744, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 373, "x": 373, "y0": 373, "y1": 746, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 374, "x": 374, "y0": 374, "y1": 748, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 375, "x": 375, "y0": 375, "y1": 750, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 376, "x": 376, "y0": 376, "y1": 752, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 377, "x": 377, "y0": 377, "y1": 754, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 378, "x": 378, "y0": 378, "y1": 756, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 379, "x": 379, "y0": 379, "y1": 758, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 380, "x": 380, "y0": 380, "y1": 760, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 381, "x": 381, "y0": 381, "y1": 762, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 382, "x": 382, "y0": 382, "y1": 764, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 383, "x": 383, "y0": 383, "y1": 766, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 384, "x": 384, "y0": 384, "y1": 768, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 385, "x": 385, "y0": 385, "y1": 770, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 386, "x": 386, "y0": 386, "y1": 772, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 387, "x": 387, "y0": 387, "y1": 774, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 388, "x": 388, "y0": 388, "y1": 776, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 389, "x": 389, "y0": 389, "y1": 778, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 390, "x": 390, "y0": 390, "y1": 780, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 391, "x": 391, "y0": 391, "y1": 782, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 392, "x": 392, "y0": 392, "y1": 784, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 393, "x": 393, "y0": 393, "y1": 786, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 394, "x": 394, "y0": 394, "y1": 788, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 395, "x": 395, "y0": 395, "y1": 790, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 396, "x": 396, "y0": 396, "y1": 792, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 397, "x": 397, "y0": 397, "y1": 794, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 398, "x": 398, "y0": 398, "y1": 796, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 399, "x": 399, "y0": 399, "y1": 798, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 400, "x": 400, "y0": 400, "y1": 800, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 401, "x": 401, "y0": 401, "y1": 802, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 402, "x": 402, "y0": 402, "y1": 804, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 403, "x": 403, "y0": 403, "y1": 806, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 404, "x": 404, "y0": 404, "y1": 808, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 405, "x": 405, "y0": 405, "y1": 810, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 406, "x": 406, "y0": 406, "y1": 812, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 407, "x": 407, "y0": 407, "y1": 814, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 408, "x": 408, "y0": 408, "y1": 816, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 409, "x": 409, "y0": 409, "y1": 818, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 410, "x": 410, "y0": 410, "y1": 820, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 411, "x": 411, "y0": 411, "y1": 822, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 412, "x": 412, "y0": 412, "y1": 824, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 413, "x": 413, "y0": 413, "y1": 826, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 414, "x": 414, "y0": 414, "y1": 828, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 415, "x": 415, "y0": 415, "y1": 830, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 416, "x": 416, "y0": 416, "y1": 832, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 417, "x": 417, "y0": 417, "y1": 834, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 418, "x": 418, "y0": 418, "y1": 836, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 419, "x": 419, "y0": 419, "y1": 838, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 420, "x": 420, "y0": 420, "y1": 840, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 421, "x": 421, "y0": 421, "y1": 842, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 422, "x": 422, "y0": 422, "y1": 844, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 423, "x": 423, "y0": 423, "y1": 846, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 424, "x": 424, "y0": 424, "y1": 848, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 425, "x": 425, "y0": 425, "y1": 850, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 426, "x": 426, "y0": 426, "y1": 852, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 427, "x": 427, "y0": 427, "y1": 854, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 428, "x": 428, "y0": 428, "y1": 856, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 429, "x": 429, "y0": 429, "y1": 858, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 430, "x": 430, "y0": 430, "y1": 860, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 431, "x": 431, "y0": 431, "y1": 862, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 432, "x": 432, "y0": 432, "y1": 864, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 433, "x": 433, "y0": 433, "y1": 866, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 434, "x": 434, "y0": 434, "y1": 868, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 435, "x": 435, "y0": 435, "y1": 870, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 436, "x": 436, "y0": 436, "y1": 872, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 437, "x": 437, "y0": 437, "y1": 874, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 438, "x": 438, "y0": 438, "y1": 876, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 439, "x": 439, "y0": 439, "y1": 878, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 440, "x": 440, "y0": 440, "y1": 880, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 441, "x": 441, "y0": 441, "y1": 882, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 442, "x": 442, "y0": 442, "y1": 884, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 443, "x": 443, "y0": 443, "y1": 886, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 444, "x": 444, "y0": 444, "y1": 888, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 445, "x": 445, "y0": 445, "y1": 890, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 446, "x": 446, "y0": 446, "y1": 892, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 447, "x": 447, "y0": 447, "y1": 894, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 448, "x": 448, "y0": 448, "y1": 896, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 449, "x": 449, "y0": 449, "y1": 898, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 450, "x": 450, "y0": 450, "y1": 900, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 451, "x": 451, "y0": 451, "y1": 902, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 452, "x": 452, "y0": 452, "y1": 904, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 453, "x": 453, "y0": 453, "y1": 906, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 454, "x": 454, "y0": 454, "y1": 908, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 455, "x": 455, "y0": 455, "y1": 910, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 456, "x": 456, "y0": 456, "y1": 912, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 457, "x": 457, "y0": 457, "y1": 914, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 458, "x": 458, "y0": 458, "y1": 916, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 459, "x": 459, "y0": 459, "y1": 918, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 460, "x": 460, "y0": 460, "y1": 920, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 461, "x": 461, "y0": 461, "y1": 922, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 462, "x": 462, "y0": 462, "y1": 924, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 463, "x": 463, "y0": 463, "y1": 926, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 464, "x": 464, "y0": 464, "y1": 928, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 465, "x": 465, "y0": 465, "y1": 930, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 466, "x": 466, "y0": 466, "y1": 932, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 467, "x": 467, "y0": 467, "y1": 934, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 468, "x": 468, "y0": 468, "y1": 936, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 469, "x": 469, "y0": 469, "y1": 938, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 470, "x": 470, "y0": 470, "y1": 940, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 471, "x": 471, "y0": 471, "y1": 942, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 472, "x": 472, "y0": 472, "y1": 944, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 473, "x": 473, "y0": 473, "y1": 946, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 474, "x": 474, "y0": 474, "y1": 948, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 475, "x": 475, "y0": 475, "y1": 950, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 476, "x": 476, "y0": 476, "y1": 952, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 477, "x": 477, "y0": 477, "y1": 954, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 478, "x": 478, "y0": 478, "y1": 956, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 479, "x": 479, "y0": 479, "y1": 958, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 480, "x": 480, "y0": 480, "y1": 960, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 481, "x": 481, "y0": 481, "y1": 962, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 482, "x": 482, "y0": 482, "y1": 964, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 483, "x": 483, "y0": 483, "y1": 966, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 484, "x": 484, "y0": 484, "y1": 968, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 485, "x": 485, "y0": 485, "y1": 970, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 486, "x": 486, "y0": 486, "y1": 972, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 487, "x": 487, "y0": 487, "y1": 974, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 488, "x": 488, "y0": 488, "y1": 976, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 489, "x": 489, "y0": 489, "y1": 978, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 490, "x": 490, "y0": 490, "y1": 980, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 491, "x": 491, "y0": 491, "y1": 982, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 492, "x": 492, "y0": 492, "y1": 984, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 493, "x": 493, "y0": 493, "y1": 986, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 494, "x": 494, "y0": 494, "y1": 988, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 495, "x": 495, "y0": 495, "y1": 990, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 496, "x": 496, "y0": 496, "y1": 992, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 497, "x": 497, "y0": 497, "y1": 994, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 498, "x": 498, "y0": 498, "y1": 996, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 499, "x": 499, "y0": 499, "y1": 998, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 500, "x": 500, "y0": 500, "y1": 1000, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 501, "x": 501, "y0": 501, "y1": 1002, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 502, "x": 502, "y0": 502, "y1": 1004, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 503, "x": 503, "y0": 503, "y1": 1006, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 504, "x": 504, "y0": 504, "y1": 1008, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 505, "x": 505, "y0": 505, "y1": 1010, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 506, "x": 506, "y0": 506, "y1": 1012, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 507, "x": 507, "y0": 507, "y1": 1014, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 508, "x": 508, "y0": 508, "y1": 1016, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 509, "x": 509, "y0": 509, "y1": 1018, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 510, "x": 510, "y0": 510, "y1": 1020, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 511, "x": 511, "y0": 511, "y1": 1022, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 512, "x": 512, "y0": 512, "y1": 1024, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 513, "x": 513, "y0": 513, "y1": 1026, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 514, "x": 514, "y0": 514, "y1": 1028, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 515, "x": 515, "y0": 515, "y1": 1030, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 516, "x": 516, "y0": 516, "y1": 1032, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 517, "x": 517, "y0": 517, "y1": 1034, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 518, "x": 518, "y0": 518, "y1": 1036, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 519, "x": 519, "y0": 519, "y1": 1038, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 520, "x": 520, "y0": 520, "y1": 1040, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 521, "x": 521, "y0": 521, "y1": 1042, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 522, "x": 522, "y0": 522, "y1": 1044, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 523, "x": 523, "y0": 523, "y1": 1046, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 524, "x": 524, "y0": 524, "y1": 1048, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 525, "x": 525, "y0": 525, "y1": 1050, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 526, "x": 526, "y0": 526, "y1": 1052, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 527, "x": 527, "y0": 527, "y1": 1054, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 528, "x": 528, "y0": 528, "y1": 1056, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 529, "x": 529, "y0": 529, "y1": 1058, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 530, "x": 530, "y0": 530, "y1": 1060, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 531, "x": 531, "y0": 531, "y1": 1062, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 532, "x": 532, "y0": 532, "y1": 1064, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 533, "x": 533, "y0": 533, "y1": 1066, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 534, "x": 534, "y0": 534, "y1": 1068, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 535, "x": 535, "y0": 535, "y1": 1070, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 536, "x": 536, "y0": 536, "y1": 1072, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 537, "x": 537, "y0": 537, "y1": 1074, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 538, "x": 538, "y0": 538, "y1": 1076, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 539, "x": 539, "y0": 539, "y1": 1078, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 540, "x": 540, "y0": 540, "y1": 1080, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 541, "x": 541, "y0": 541, "y1": 1082, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 542, "x": 542, "y0": 542, "y1": 1084, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 543, "x": 543, "y0": 543, "y1": 1086, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 544, "x": 544, "y0": 544, "y1": 1088, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 545, "x": 545, "y0": 545, "y1": 1090, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 546, "x": 546, "y0": 546, "y1": 1092, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 547, "x": 547, "y0": 547, "y1": 1094, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 548, "x": 548, "y0": 548, "y1": 1096, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 549, "x": 549, "y0": 549, "y1": 1098, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 550, "x": 550, "y0": 550, "y1": 1100, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 551, "x": 551, "y0": 551, "y1": 1102, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 552, "x": 552, "y0": 552, "y1": 1104, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 553, "x": 553, "y0": 553, "y1": 1106, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 554, "x": 554, "y0": 554, "y1": 1108, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 555, "x": 555, "y0": 555, "y1": 1110, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 556, "x": 556, "y0": 556, "y1": 1112, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 557, "x": 557, "y0": 557, "y1": 1114, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 558, "x": 558, "y0": 558, "y1": 1116, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 559, "x": 559, "y0": 559, "y1": 1118, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 560, "x": 560, "y0": 560, "y1": 1120, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 561, "x": 561, "y0": 561, "y1": 1122, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 562, "x": 562, "y0": 562, "y1": 1124, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 563, "x": 563, "y0": 563, "y1": 1126, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 564, "x": 564, "y0": 564, "y1": 1128, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 565, "x": 565, "y0": 565, "y1": 1130, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 566, "x": 566, "y0": 566, "y1": 1132, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 567, "x": 567, "y0": 567, "y1": 1134, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 568, "x": 568, "y0": 568, "y1": 1136, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 569, "x": 569, "y0": 569, "y1": 1138, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 570, "x": 570, "y0": 570, "y1": 1140, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 571, "x": 571, "y0": 571, "y1": 1142, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 572, "x": 572, "y0": 572, "y1": 1144, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 573, "x": 573, "y0": 573, "y1": 1146, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 574, "x": 574, "y0": 574, "y1": 1148, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 575, "x": 575, "y0": 575, "y1": 1150, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 576, "x": 576, "y0": 576, "y1": 1152, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 577, "x": 577, "y0": 577, "y1": 1154, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 578, "x": 578, "y0": 578, "y1": 1156, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 579, "x": 579, "y0": 579, "y1": 1158, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 580, "x": 580, "y0": 580, "y1": 1160, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 581, "x": 581, "y0": 581, "y1": 1162, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 582, "x": 582, "y0": 582, "y1": 1164, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 583, "x": 583, "y0": 583, "y1": 1166, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 584, "x": 584, "y0": 584, "y1": 1168, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 585, "x": 585, "y0": 585, "y1": 1170, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 586, "x": 586, "y0": 586, "y1": 1172, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 587, "x": 587, "y0": 587, "y1": 1174, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 588, "x": 588, "y0": 588, "y1": 1176, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 589, "x": 589, "y0": 589, "y1": 1178, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 590, "x": 590, "y0": 590, "y1": 1180, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 591, "x": 591, "y0": 591, "y1": 1182, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 592, "x": 592, "y0": 592, "y1": 1184, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 593, "x": 593, "y0": 593, "y1": 1186, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 594, "x": 594, "y0": 594, "y1": 1188, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 595, "x": 595, "y0": 595, "y1": 1190, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 596, "x": 596, "y0": 596, "y1": 1192, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 597, "x": 597, "y0": 597, "y1": 1194, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 598, "x": 598, "y0": 598, "y1": 1196, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 599, "x": 599, "y0": 599, "y1": 1198, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 600, "x": 600, "y0": 600, "y1": 1200, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 601, "x": 601, "y0": 601, "y1": 1202, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 602, "x": 602, "y0": 602, "y1": 1204, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 603, "x": 603, "y0": 603, "y1": 1206, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 604, "x": 604, "y0": 604, "y1": 1208, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 605, "x": 605, "y0": 605, "y1": 1210, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 606, "x": 606, "y0": 606, "y1": 1212, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 607, "x": 607, "y0": 607, "y1": 1214, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 608, "x": 608, "y0": 608, "y1": 1216, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 609, "x": 609, "y0": 609, "y1": 1218, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 610, "x": 610, "y0": 610, "y1": 1220, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 611, "x": 611, "y0": 611, "y1": 1222, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 612, "x": 612, "y0": 612, "y1": 1224, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 613, "x": 613, "y0": 613, "y1": 1226, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 614, "x": 614, "y0": 614, "y1": 1228, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 615, "x": 615, "y0": 615, "y1": 1230, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 616, "x": 616, "y0": 616, "y1": 1232, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 617, "x": 617, "y0": 617, "y1": 1234, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 618, "x": 618, "y0": 618, "y1": 1236, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 619, "x": 619, "y0": 619, "y1": 1238, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 620, "x": 620, "y0": 620, "y1": 1240, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 621, "x": 621, "y0": 621, "y1": 1242, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 622, "x": 622, "y0": 622, "y1": 1244, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 623, "x": 623, "y0": 623, "y1": 1246, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 624, "x": 624, "y0": 624, "y1": 1248, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 625, "x": 625, "y0": 625, "y1": 1250, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 626, "x": 626, "y0": 626, "y1": 1252, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 627, "x": 627, "y0": 627, "y1": 1254, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 628, "x": 628, "y0": 628, "y1": 1256, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 629, "x": 629, "y0": 629, "y1": 1258, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 630, "x": 630, "y0": 630, "y1": 1260, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 631, "x": 631, "y0": 631, "y1": 1262, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 632, "x": 632, "y0": 632, "y1": 1264, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 633, "x": 633, "y0": 633, "y1": 1266, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 634, "x": 634, "y0": 634, "y1": 1268, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 635, "x": 635, "y0": 635, "y1": 1270, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 636, "x": 636, "y0": 636, "y1": 1272, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 637, "x": 637, "y0": 637, "y1": 1274, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 638, "x": 638, "y0": 638, "y1": 1276, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 639, "x": 639, "y0": 639, "y1": 1278, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 640, "x": 640, "y0": 640, "y1": 1280, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 641, "x": 641, "y0": 641, "y1": 1282, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 642, "x": 642, "y0": 642, "y1": 1284, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 643, "x": 643, "y0": 643, "y1": 1286, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 644, "x": 644, "y0": 644, "y1": 1288, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 645, "x": 645, "y0": 645, "y1": 1290, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 646, "x": 646, "y0": 646, "y1": 1292, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 647, "x": 647, "y0": 647, "y1": 1294, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 648, "x": 648, "y0": 648, "y1": 1296, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 649, "x": 649, "y0": 649, "y1": 1298, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 650, "x": 650, "y0": 650, "y1": 1300, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 651, "x": 651, "y0": 651, "y1": 1302, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 652, "x": 652, "y0": 652, "y1": 1304, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 653, "x": 653, "y0": 653, "y1": 1306, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 654, "x": 654, "y0": 654, "y1": 1308, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 655, "x": 655, "y0": 655, "y1": 1310, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 656, "x": 656, "y0": 656, "y1": 1312, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 657, "x": 657, "y0": 657, "y1": 1314, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 658, "x": 658, "y0": 658, "y1": 1316, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 659, "x": 659, "y0": 659, "y1": 1318, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 660, "x": 660, "y0": 660, "y1": 1320, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 661, "x": 661, "y0": 661, "y1": 1322, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 662, "x": 662, "y0": 662, "y1": 1324, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 663, "x": 663, "y0": 663, "y1": 1326, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 664, "x": 664, "y0": 664, "y1": 1328, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 665, "x": 665, "y0": 665, "y1": 1330, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 666, "x": 666, "y0": 666, "y1": 1332, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 667, "x": 667, "y0": 667, "y1": 1334, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 668, "x": 668, "y0": 668, "y1": 1336, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 669, "x": 669, "y0": 669, "y1": 1338, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 670, "x": 670, "y0": 670, "y1": 1340, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 671, "x": 671, "y0": 671, "y1": 1342, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 672, "x": 672, "y0": 672, "y1": 1344, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 673, "x": 673, "y0": 673, "y1": 1346, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 674, "x": 674, "y0": 674, "y1": 1348, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 675, "x": 675, "y0": 675, "y1": 1350, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 676, "x": 676, "y0": 676, "y1": 1352, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 677, "x": 677, "y0": 677, "y1": 1354, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 678, "x": 678, "y0": 678, "y1": 1356, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 679, "x": 679, "y0": 679, "y1": 1358, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 680, "x": 680, "y0": 680, "y1": 1360, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 681, "x": 681, "y0": 681, "y1": 1362, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 682, "x": 682, "y0": 682, "y1": 1364, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 683, "x": 683, "y0": 683, "y1": 1366, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 684, "x": 684, "y0": 684, "y1": 1368, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 685, "x": 685, "y0": 685, "y1": 1370, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 686, "x": 686, "y0": 686, "y1": 1372, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 687, "x": 687, "y0": 687, "y1": 1374, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 688, "x": 688, "y0": 688, "y1": 1376, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 689, "x": 689, "y0": 689, "y1": 1378, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 690, "x": 690, "y0": 690, "y1": 1380, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 691, "x": 691, "y0": 691, "y1": 1382, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 692, "x": 692, "y0": 692, "y1": 1384, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 693, "x": 693, "y0": 693, "y1": 1386, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 694, "x": 694, "y0": 694, "y1": 1388, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 695, "x": 695, "y0": 695, "y1": 1390, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 696, "x": 696, "y0": 696, "y1": 1392, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 697, "x": 697, "y0": 697, "y1": 1394, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 698, "x": 698, "y0": 698, "y1": 1396, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 699, "x": 699, "y0": 699, "y1": 1398, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 700, "x": 700, "y0": 700, "y1": 1400, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 701, "x": 701, "y0": 701, "y1": 1402, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 702, "x": 702, "y0": 702, "y1": 1404, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 703, "x": 703, "y0": 703, "y1": 1406, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 704, "x": 704, "y0": 704, "y1": 1408, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 705, "x": 705, "y0": 705, "y1": 1410, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 706, "x": 706, "y0": 706, "y1": 1412, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 707, "x": 707, "y0": 707, "y1": 1414, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 708, "x": 708, "y0": 708, "y1": 1416, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 709, "x": 709, "y0": 709, "y1": 1418, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 710, "x": 710, "y0": 710, "y1": 1420, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 711, "x": 711, "y0": 711, "y1": 1422, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 712, "x": 712, "y0": 712, "y1": 1424, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 713, "x": 713, "y0": 713, "y1": 1426, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 714, "x": 714, "y0": 714, "y1": 1428, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 715, "x": 715, "y0": 715, "y1": 1430, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 716, "x": 716, "y0": 716, "y1": 1432, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 717, "x": 717, "y0": 717, "y1": 1434, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 718, "x": 718, "y0": 718, "y1": 1436, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 719, "x": 719, "y0": 719, "y1": 1438, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 720, "x": 720, "y0": 720, "y1": 1440, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 721, "x": 721, "y0": 721, "y1": 1442, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 722, "x": 722, "y0": 722, "y1": 1444, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 723, "x": 723, "y0": 723, "y1": 1446, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 724, "x": 724, "y0": 724, "y1": 1448, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 725, "x": 725, "y0": 725, "y1": 1450, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 726, "x": 726, "y0": 726, "y1": 1452, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 727, "x": 727, "y0": 727, "y1": 1454, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 728, "x": 728, "y0": 728, "y1": 1456, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 729, "x": 729, "y0": 729, "y1": 1458, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 730, "x": 730, "y0": 730, "y1": 1460, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 731, "x": 731, "y0": 731, "y1": 1462, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 732, "x": 732, "y0": 732, "y1": 1464, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 733, "x": 733, "y0": 733, "y1": 1466, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 734, "x": 734, "y0": 734, "y1": 1468, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 735, "x": 735, "y0": 735, "y1": 1470, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 736, "x": 736, "y0": 736, "y1": 1472, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 737, "x": 737, "y0": 737, "y1": 1474, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 738, "x": 738, "y0": 738, "y1": 1476, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 739, "x": 739, "y0": 739, "y1": 1478, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 740, "x": 740, "y0": 740, "y1": 1480, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 741, "x": 741, "y0": 741, "y1": 1482, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 742, "x": 742, "y0": 742, "y1": 1484, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 743, "x": 743, "y0": 743, "y1": 1486, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 744, "x": 744, "y0": 744, "y1": 1488, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 745, "x": 745, "y0": 745, "y1": 1490, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 746, "x": 746, "y0": 746, "y1": 1492, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 747, "x": 747, "y0": 747, "y1": 1494, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 748, "x": 748, "y0": 748, "y1": 1496, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 749, "x": 749, "y0": 749, "y1": 1498, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 750, "x": 750, "y0": 750, "y1": 1500, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 751, "x": 751, "y0": 751, "y1": 1502, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 752, "x": 752, "y0": 752, "y1": 1504, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 753, "x": 753, "y0": 753, "y1": 1506, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 754, "x": 754, "y0": 754, "y1": 1508, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 755, "x": 755, "y0": 755, "y1": 1510, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 756, "x": 756, "y0": 756, "y1": 1512, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 757, "x": 757, "y0": 757, "y1": 1514, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 758, "x": 758, "y0": 758, "y1": 1516, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 759, "x": 759, "y0": 759, "y1": 1518, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 760, "x": 760, "y0": 760, "y1": 1520, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 761, "x": 761, "y0": 761, "y1": 1522, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 762, "x": 762, "y0": 762, "y1": 1524, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 763, "x": 763, "y0": 763, "y1": 1526, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 764, "x": 764, "y0": 764, "y1": 1528, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 765, "x": 765, "y0": 765, "y1": 1530, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 766, "x": 766, "y0": 766, "y1": 1532, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 767, "x": 767, "y0": 767, "y1": 1534, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 768, "x": 768, "y0": 768, "y1": 1536, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 769, "x": 769, "y0": 769, "y1": 1538, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 770, "x": 770, "y0": 770, "y1": 1540, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 771, "x": 771, "y0": 771, "y1": 1542, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 772, "x": 772, "y0": 772, "y1": 1544, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 773, "x": 773, "y0": 773, "y1": 1546, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 774, "x": 774, "y0": 774, "y1": 1548, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 775, "x": 775, "y0": 775, "y1": 1550, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 776, "x": 776, "y0": 776, "y1": 1552, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 777, "x": 777, "y0": 777, "y1": 1554, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 778, "x": 778, "y0": 778, "y1": 1556, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 779, "x": 779, "y0": 779, "y1": 1558, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 780, "x": 780, "y0": 780, "y1": 1560, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 781, "x": 781, "y0": 781, "y1": 1562, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 782, "x": 782, "y0": 782, "y1": 1564, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 783, "x": 783, "y0": 783, "y1": 1566, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 784, "x": 784, "y0": 784, "y1": 1568, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 785, "x": 785, "y0": 785, "y1": 1570, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 786, "x": 786, "y0": 786, "y1": 1572, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 787, "x": 787, "y0": 787, "y1": 1574, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 788, "x": 788, "y0": 788, "y1": 1576, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 789, "x": 789, "y0": 789, "y1": 1578, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 790, "x": 790, "y0": 790, "y1": 1580, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 791, "x": 791, "y0": 791, "y1": 1582, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 792, "x": 792, "y0": 792, "y1": 1584, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 793, "x": 793, "y0": 793, "y1": 1586, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 794, "x": 794, "y0": 794, "y1": 1588, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 795, "x": 795, "y0": 795, "y1": 1590, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 796, "x": 796, "y0": 796, "y1": 1592, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 797, "x": 797, "y0": 797, "y1": 1594, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 798, "x": 798, "y0": 798, "y1": 1596, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 799, "x": 799, "y0": 799, "y1": 1598, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 800, "x": 800, "y0": 800, "y1": 1600, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 801, "x": 801, "y0": 801, "y1": 1602, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 802, "x": 802, "y0": 802, "y1": 1604, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 803, "x": 803, "y0": 803, "y1": 1606, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 804, "x": 804, "y0": 804, "y1": 1608, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 805, "x": 805, "y0": 805, "y1": 1610, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 806, "x": 806, "y0": 806, "y1": 1612, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 807, "x": 807, "y0": 807, "y1": 1614, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 808, "x": 808, "y0": 808, "y1": 1616, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 809, "x": 809, "y0": 809, "y1": 1618, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 810, "x": 810, "y0": 810, "y1": 1620, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 811, "x": 811, "y0": 811, "y1": 1622, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 812, "x": 812, "y0": 812, "y1": 1624, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 813, "x": 813, "y0": 813, "y1": 1626, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 814, "x": 814, "y0": 814, "y1": 1628, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 815, "x": 815, "y0": 815, "y1": 1630, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 816, "x": 816, "y0": 816, "y1": 1632, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 817, "x": 817, "y0": 817, "y1": 1634, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 818, "x": 818, "y0": 818, "y1": 1636, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 819, "x": 819, "y0": 819, "y1": 1638, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 820, "x": 820, "y0": 820, "y1": 1640, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 821, "x": 821, "y0": 821, "y1": 1642, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 822, "x": 822, "y0": 822, "y1": 1644, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 823, "x": 823, "y0": 823, "y1": 1646, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 824, "x": 824, "y0": 824, "y1": 1648, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 825, "x": 825, "y0": 825, "y1": 1650, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 826, "x": 826, "y0": 826, "y1": 1652, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 827, "x": 827, "y0": 827, "y1": 1654, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 828, "x": 828, "y0": 828, "y1": 1656, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 829, "x": 829, "y0": 829, "y1": 1658, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 830, "x": 830, "y0": 830, "y1": 1660, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 831, "x": 831, "y0": 831, "y1": 1662, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 832, "x": 832, "y0": 832, "y1": 1664, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 833, "x": 833, "y0": 833, "y1": 1666, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 834, "x": 834, "y0": 834, "y1": 1668, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 835, "x": 835, "y0": 835, "y1": 1670, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 836, "x": 836, "y0": 836, "y1": 1672, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 837, "x": 837, "y0": 837, "y1": 1674, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 838, "x": 838, "y0": 838, "y1": 1676, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 839, "x": 839, "y0": 839, "y1": 1678, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 840, "x": 840, "y0": 840, "y1": 1680, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 841, "x": 841, "y0": 841, "y1": 1682, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 842, "x": 842, "y0": 842, "y1": 1684, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 843, "x": 843, "y0": 843, "y1": 1686, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 844, "x": 844, "y0": 844, "y1": 1688, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 845, "x": 845, "y0": 845, "y1": 1690, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 846, "x": 846, "y0": 846, "y1": 1692, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 847, "x": 847, "y0": 847, "y1": 1694, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 848, "x": 848, "y0": 848, "y1": 1696, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 849, "x": 849, "y0": 849, "y1": 1698, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 850, "x": 850, "y0": 850, "y1": 1700, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 851, "x": 851, "y0": 851, "y1": 1702, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 852, "x": 852, "y0": 852, "y1": 1704, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 853, "x": 853, "y0": 853, "y1": 1706, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 854, "x": 854, "y0": 854, "y1": 1708, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 855, "x": 855, "y0": 855, "y1": 1710, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 856, "x": 856, "y0": 856, "y1": 1712, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 857, "x": 857, "y0": 857, "y1": 1714, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 858, "x": 858, "y0": 858, "y1": 1716, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 859, "x": 859, "y0": 859, "y1": 1718, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 860, "x": 860, "y0": 860, "y1": 1720, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 861, "x": 861, "y0": 861, "y1": 1722, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 862, "x": 862, "y0": 862, "y1": 1724, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 863, "x": 863, "y0": 863, "y1": 1726, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 864, "x": 864, "y0": 864, "y1": 1728, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 865, "x": 865, "y0": 865, "y1": 1730, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 866, "x": 866, "y0": 866, "y1": 1732, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 867, "x": 867, "y0": 867, "y1": 1734, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 868, "x": 868, "y0": 868, "y1": 1736, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 869, "x": 869, "y0": 869, "y1": 1738, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 870, "x": 870, "y0": 870, "y1": 1740, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 871, "x": 871, "y0": 871, "y1": 1742, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 872, "x": 872, "y0": 872, "y1": 1744, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 873, "x": 873, "y0": 873, "y1": 1746, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 874, "x": 874, "y0": 874, "y1": 1748, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 875, "x": 875, "y0": 875, "y1": 1750, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 876, "x": 876, "y0": 876, "y1": 1752, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 877, "x": 877, "y0": 877, "y1": 1754, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 878, "x": 878, "y0": 878, "y1": 1756, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 879, "x": 879, "y0": 879, "y1": 1758, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 880, "x": 880, "y0": 880, "y1": 1760, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 881, "x": 881, "y0": 881, "y1": 1762, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 882, "x": 882, "y0": 882, "y1": 1764, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 883, "x": 883, "y0": 883, "y1": 1766, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 884, "x": 884, "y0": 884, "y1": 1768, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 885, "x": 885, "y0": 885, "y1": 1770, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 886, "x": 886, "y0": 886, "y1": 1772, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 887, "x": 887, "y0": 887, "y1": 1774, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 888, "x": 888, "y0": 888, "y1": 1776, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 889, "x": 889, "y0": 889, "y1": 1778, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 890, "x": 890, "y0": 890, "y1": 1780, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 891, "x": 891, "y0": 891, "y1": 1782, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 892, "x": 892, "y0": 892, "y1": 1784, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 893, "x": 893, "y0": 893, "y1": 1786, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 894, "x": 894, "y0": 894, "y1": 1788, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 895, "x": 895, "y0": 895, "y1": 1790, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 896, "x": 896, "y0": 896, "y1": 1792, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 897, "x": 897, "y0": 897, "y1": 1794, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 898, "x": 898, "y0": 898, "y1": 1796, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 899, "x": 899, "y0": 899, "y1": 1798, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 900, "x": 900, "y0": 900, "y1": 1800, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 901, "x": 901, "y0": 901, "y1": 1802, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 902, "x": 902, "y0": 902, "y1": 1804, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 903, "x": 903, "y0": 903, "y1": 1806, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 904, "x": 904, "y0": 904, "y1": 1808, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 905, "x": 905, "y0": 905, "y1": 1810, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 906, "x": 906, "y0": 906, "y1": 1812, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 907, "x": 907, "y0": 907, "y1": 1814, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 908, "x": 908, "y0": 908, "y1": 1816, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 909, "x": 909, "y0": 909, "y1": 1818, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 910, "x": 910, "y0": 910, "y1": 1820, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 911, "x": 911, "y0": 911, "y1": 1822, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 912, "x": 912, "y0": 912, "y1": 1824, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 913, "x": 913, "y0": 913, "y1": 1826, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 914, "x": 914, "y0": 914, "y1": 1828, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 915, "x": 915, "y0": 915, "y1": 1830, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 916, "x": 916, "y0": 916, "y1": 1832, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 917, "x": 917, "y0": 917, "y1": 1834, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 918, "x": 918, "y0": 918, "y1": 1836, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 919, "x": 919, "y0": 919, "y1": 1838, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 920, "x": 920, "y0": 920, "y1": 1840, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 921, "x": 921, "y0": 921, "y1": 1842, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 922, "x": 922, "y0": 922, "y1": 1844, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 923, "x": 923, "y0": 923, "y1": 1846, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 924, "x": 924, "y0": 924, "y1": 1848, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 925, "x": 925, "y0": 925, "y1": 1850, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 926, "x": 926, "y0": 926, "y1": 1852, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 927, "x": 927, "y0": 927, "y1": 1854, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 928, "x": 928, "y0": 928, "y1": 1856, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 929, "x": 929, "y0": 929, "y1": 1858, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 930, "x": 930, "y0": 930, "y1": 1860, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 931, "x": 931, "y0": 931, "y1": 1862, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 932, "x": 932, "y0": 932, "y1": 1864, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 933, "x": 933, "y0": 933, "y1": 1866, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 934, "x": 934, "y0": 934, "y1": 1868, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 935, "x": 935, "y0": 935, "y1": 1870, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 936, "x": 936, "y0": 936, "y1": 1872, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 937, "x": 937, "y0": 937, "y1": 1874, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 938, "x": 938, "y0": 938, "y1": 1876, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 939, "x": 939, "y0": 939, "y1": 1878, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 940, "x": 940, "y0": 940, "y1": 1880, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 941, "x": 941, "y0": 941, "y1": 1882, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 942, "x": 942, "y0": 942, "y1": 1884, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 943, "x": 943, "y0": 943, "y1": 1886, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 944, "x": 944, "y0": 944, "y1": 1888, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 945, "x": 945, "y0": 945, "y1": 1890, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 946, "x": 946, "y0": 946, "y1": 1892, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 947, "x": 947, "y0": 947, "y1": 1894, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 948, "x": 948, "y0": 948, "y1": 1896, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 949, "x": 949, "y0": 949, "y1": 1898, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 950, "x": 950, "y0": 950, "y1": 1900, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 951, "x": 951, "y0": 951, "y1": 1902, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 952, "x": 952, "y0": 952, "y1": 1904, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 953, "x": 953, "y0": 953, "y1": 1906, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 954, "x": 954, "y0": 954, "y1": 1908, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 955, "x": 955, "y0": 955, "y1": 1910, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 956, "x": 956, "y0": 956, "y1": 1912, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 957, "x": 957, "y0": 957, "y1": 1914, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 958, "x": 958, "y0": 958, "y1": 1916, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 959, "x": 959, "y0": 959, "y1": 1918, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 960, "x": 960, "y0": 960, "y1": 1920, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 961, "x": 961, "y0": 961, "y1": 1922, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 962, "x": 962, "y0": 962, "y1": 1924, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 963, "x": 963, "y0": 963, "y1": 1926, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 964, "x": 964, "y0": 964, "y1": 1928, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 965, "x": 965, "y0": 965, "y1": 1930, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 966, "x": 966, "y0": 966, "y1": 1932, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 967, "x": 967, "y0": 967, "y1": 1934, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 968, "x": 968, "y0": 968, "y1": 1936, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 969, "x": 969, "y0": 969, "y1": 1938, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 970, "x": 970, "y0": 970, "y1": 1940, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 971, "x": 971, "y0": 971, "y1": 1942, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 972, "x": 972, "y0": 972, "y1": 1944, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 973, "x": 973, "y0": 973, "y1": 1946, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 974, "x": 974, "y0": 974, "y1": 1948, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 975, "x": 975, "y0": 975, "y1": 1950, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 976, "x": 976, "y0": 976, "y1": 1952, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 977, "x": 977, "y0": 977, "y1": 1954, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 978, "x": 978, "y0": 978, "y1": 1956, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 979, "x": 979, "y0": 979, "y1": 1958, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 980, "x": 980, "y0": 980, "y1": 1960, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 981, "x": 981, "y0": 981, "y1": 1962, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 982, "x": 982, "y0": 982, "y1": 1964, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 983, "x": 983, "y0": 983, "y1": 1966, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 984, "x": 984, "y0": 984, "y1": 1968, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 985, "x": 985, "y0": 985, "y1": 1970, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 986, "x": 986, "y0": 986, "y1": 1972, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 987, "x": 987, "y0": 987, "y1": 1974, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 988, "x": 988, "y0": 988, "y1": 1976, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 989, "x": 989, "y0": 989, "y1": 1978, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 990, "x": 990, "y0": 990, "y1": 1980, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 991, "x": 991, "y0": 991, "y1": 1982, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 992, "x": 992, "y0": 992, "y1": 1984, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 993, "x": 993, "y0": 993, "y1": 1986, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 994, "x": 994, "y0": 994, "y1": 1988, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 995, "x": 995, "y0": 995, "y1": 1990, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 996, "x": 996, "y0": 996, "y1": 1992, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 997, "x": 997, "y0": 997, "y1": 1994, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 998, "x": 998, "y0": 998, "y1": 1996, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 999, "x": 999, "y0": 999, "y1": 1998, @@ -13206,24 +17298,32 @@ Array [ "data": Array [ Object { "datum": undefined, + "initialY0": null, + "initialY1": 1, "x": 1, "y0": 0, "y1": 1, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 2, "x": 2, "y0": 0, "y1": 2, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 3, "x": 3, "y0": 0, "y1": 3, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 4, "x": 4, "y0": 0, "y1": 4, @@ -13239,24 +17339,201 @@ Array [ "data": Array [ Object { "datum": undefined, + "initialY0": null, + "initialY1": 1, + "x": 1, + "y0": 1, + "y1": 2, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 2, + "x": 2, + "y0": 2, + "y1": 4, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 3, + "x": 3, + "y0": 3, + "y1": 6, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 4, + "x": 4, + "y0": 4, + "y1": 8, + }, + ], + "key": Array [ + "b", + ], + "seriesColorKey": "b", + "specId": "spec1", + }, + Object { + "data": Array [ + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 1, + "x": 1, + "y0": 2, + "y1": 3, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 2, + "x": 2, + "y0": 4, + "y1": 6, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 3, + "x": 3, + "y0": 6, + "y1": 9, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 4, + "x": 4, + "y0": 8, + "y1": 12, + }, + ], + "key": Array [ + "b", + ], + "seriesColorKey": "b", + "specId": "spec1", + }, + Object { + "data": Array [ + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 1, + "x": 1, + "y0": 3, + "y1": 4, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 2, + "x": 2, + "y0": 6, + "y1": 8, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 3, + "x": 3, + "y0": 9, + "y1": 12, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 4, + "x": 4, + "y0": 12, + "y1": 16, + }, + ], + "key": Array [ + "b", + ], + "seriesColorKey": "b", + "specId": "spec1", + }, +] +`; + +exports[`Series Can stack multiple dataseries with scale to extent 1`] = ` +Array [ + Object { + "data": Array [ + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 1, + "x": 1, + "y0": 1, + "y1": 1, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 2, + "x": 2, + "y0": 2, + "y1": 2, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 3, + "x": 3, + "y0": 3, + "y1": 3, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 4, + "x": 4, + "y0": 4, + "y1": 4, + }, + ], + "key": Array [ + "a", + ], + "seriesColorKey": "a", + "specId": "spec1", + }, + Object { + "data": Array [ + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 1, "x": 1, "y0": 1, "y1": 2, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 2, "x": 2, "y0": 2, "y1": 4, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 3, "x": 3, "y0": 3, "y1": 6, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 4, "x": 4, "y0": 4, "y1": 8, @@ -13272,24 +17549,32 @@ Array [ "data": Array [ Object { "datum": undefined, + "initialY0": null, + "initialY1": 1, "x": 1, "y0": 2, "y1": 3, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 2, "x": 2, "y0": 4, "y1": 6, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 3, "x": 3, "y0": 6, "y1": 9, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 4, "x": 4, "y0": 8, "y1": 12, @@ -13305,24 +17590,32 @@ Array [ "data": Array [ Object { "datum": undefined, + "initialY0": null, + "initialY1": 1, "x": 1, "y0": 3, "y1": 4, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 2, "x": 2, "y0": 6, "y1": 8, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 3, "x": 3, "y0": 9, "y1": 12, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 4, "x": 4, "y0": 12, "y1": 16, @@ -13343,18 +17636,24 @@ Array [ "data": Array [ Object { "datum": undefined, + "initialY0": null, + "initialY1": 1, "x": 1, "y0": 0, "y1": 1, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 2, "x": 2, "y0": 0, "y1": 2, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 4, "x": 4, "y0": 0, "y1": 4, @@ -13370,12 +17669,16 @@ Array [ "data": Array [ Object { "datum": undefined, + "initialY0": null, + "initialY1": 21, "x": 1, "y0": 1, "y1": 22, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 23, "x": 3, "y0": 0, "y1": 23, @@ -13390,24 +17693,251 @@ Array [ ] `; +exports[`Series Can stack simple dataseries with scale to extent 1`] = ` +Array [ + Object { + "data": Array [ + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 1, + "x": 1, + "y0": 1, + "y1": 1, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 2, + "x": 2, + "y0": 2, + "y1": 2, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 4, + "x": 4, + "y0": 4, + "y1": 4, + }, + ], + "key": Array [ + "a", + ], + "seriesColorKey": "a", + "specId": "spec1", + }, + Object { + "data": Array [ + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 21, + "x": 1, + "y0": 1, + "y1": 22, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 23, + "x": 3, + "y0": 0, + "y1": 23, + }, + ], + "key": Array [ + "b", + ], + "seriesColorKey": "b", + "specId": "spec1", + }, +] +`; + +exports[`Series Can stack simple dataseries with scale to extent with y0 1`] = ` +Array [ + Object { + "data": Array [ + Object { + "datum": undefined, + "initialY0": 1, + "initialY1": 3, + "x": 1, + "y0": 1, + "y1": 3, + }, + Object { + "datum": undefined, + "initialY0": 2, + "initialY1": 3, + "x": 2, + "y0": 2, + "y1": 3, + }, + Object { + "datum": undefined, + "initialY0": 3, + "initialY1": 4, + "x": 4, + "y0": 3, + "y1": 4, + }, + ], + "key": Array [ + "a", + ], + "seriesColorKey": "a", + "specId": "spec1", + }, + Object { + "data": Array [ + Object { + "datum": undefined, + "initialY0": 1, + "initialY1": 2, + "x": 1, + "y0": 4, + "y1": 5, + }, + Object { + "datum": undefined, + "initialY0": 1, + "initialY1": 3, + "x": 2, + "y0": 4, + "y1": 6, + }, + Object { + "datum": undefined, + "initialY0": 4, + "initialY1": 23, + "x": 3, + "y0": 4, + "y1": 23, + }, + Object { + "datum": undefined, + "initialY0": 1, + "initialY1": 4, + "x": 4, + "y0": 5, + "y1": 8, + }, + ], + "key": Array [ + "b", + ], + "seriesColorKey": "b", + "specId": "spec1", + }, +] +`; + +exports[`Series Can stack simple dataseries with y0 1`] = ` +Array [ + Object { + "data": Array [ + Object { + "datum": undefined, + "initialY0": 1, + "initialY1": 3, + "x": 1, + "y0": 1, + "y1": 3, + }, + Object { + "datum": undefined, + "initialY0": 2, + "initialY1": 3, + "x": 2, + "y0": 2, + "y1": 3, + }, + Object { + "datum": undefined, + "initialY0": 3, + "initialY1": 4, + "x": 4, + "y0": 3, + "y1": 4, + }, + ], + "key": Array [ + "a", + ], + "seriesColorKey": "a", + "specId": "spec1", + }, + Object { + "data": Array [ + Object { + "datum": undefined, + "initialY0": 1, + "initialY1": 2, + "x": 1, + "y0": 4, + "y1": 5, + }, + Object { + "datum": undefined, + "initialY0": 1, + "initialY1": 3, + "x": 2, + "y0": 4, + "y1": 6, + }, + Object { + "datum": undefined, + "initialY0": 4, + "initialY1": 23, + "x": 3, + "y0": 4, + "y1": 23, + }, + Object { + "datum": undefined, + "initialY0": 1, + "initialY1": 4, + "x": 4, + "y0": 5, + "y1": 8, + }, + ], + "key": Array [ + "b", + ], + "seriesColorKey": "b", + "specId": "spec1", + }, +] +`; + exports[`Series Can stack unsorted dataseries 1`] = ` Array [ Object { "data": Array [ Object { "datum": undefined, + "initialY0": null, + "initialY1": 1, "x": 1, "y0": 0, "y1": 1, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 4, "x": 4, "y0": 0, "y1": 4, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 2, "x": 2, "y0": 0, "y1": 2, @@ -13423,12 +17953,16 @@ Array [ "data": Array [ Object { "datum": undefined, + "initialY0": null, + "initialY1": 23, "x": 3, "y0": 0, "y1": 23, }, Object { "datum": undefined, + "initialY0": null, + "initialY1": 21, "x": 1, "y0": 1, "y1": 22, @@ -13449,7 +17983,6 @@ Array [ "counts": Object { "areaSeries": 0, "barSeries": 0, - "basicSeries": 0, "lineSeries": 2, }, "dataSeries": Array [ @@ -13461,6 +17994,8 @@ Array [ "y1": 1, "y2": 3, }, + "initialY0": null, + "initialY1": 1, "x": 0, "y0": 0, "y1": 1, @@ -13471,6 +18006,8 @@ Array [ "y1": 2, "y2": 7, }, + "initialY0": null, + "initialY1": 2, "x": 1, "y0": 0, "y1": 2, @@ -13481,6 +18018,8 @@ Array [ "y1": 1, "y2": 2, }, + "initialY0": null, + "initialY1": 1, "x": 2, "y0": 0, "y1": 1, @@ -13491,6 +18030,8 @@ Array [ "y1": 6, "y2": 10, }, + "initialY0": null, + "initialY1": 6, "x": 3, "y0": 0, "y1": 6, @@ -13510,6 +18051,8 @@ Array [ "y1": 1, "y2": 3, }, + "initialY0": null, + "initialY1": 3, "x": 0, "y0": 1, "y1": 4, @@ -13520,6 +18063,8 @@ Array [ "y1": 2, "y2": 7, }, + "initialY0": null, + "initialY1": 7, "x": 1, "y0": 2, "y1": 9, @@ -13530,6 +18075,8 @@ Array [ "y1": 1, "y2": 2, }, + "initialY0": null, + "initialY1": 2, "x": 2, "y0": 1, "y1": 3, @@ -13540,6 +18087,8 @@ Array [ "y1": 6, "y2": 10, }, + "initialY0": null, + "initialY1": 10, "x": 3, "y0": 6, "y1": 16, @@ -13567,7 +18116,8 @@ Array [ "y": 1, }, "x": 0, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -13575,7 +18125,8 @@ Array [ "y": 2, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -13583,7 +18134,8 @@ Array [ "y": 10, }, "x": 2, - "y": 10, + "y0": null, + "y1": 10, }, Object { "datum": Object { @@ -13591,7 +18143,8 @@ Array [ "y": 6, }, "x": 3, - "y": 6, + "y0": null, + "y1": 6, }, ], "key": Array [], @@ -13612,7 +18165,8 @@ Array [ "y2": 3, }, "x": 0, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -13621,7 +18175,8 @@ Array [ "y2": 7, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -13630,7 +18185,8 @@ Array [ "y2": 2, }, "x": 2, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -13639,7 +18195,8 @@ Array [ "y2": 10, }, "x": 3, - "y": 6, + "y0": null, + "y1": 6, }, ], "key": Array [ @@ -13657,7 +18214,8 @@ Array [ "y2": 3, }, "x": 0, - "y": 3, + "y0": null, + "y1": 3, }, Object { "datum": Object { @@ -13666,7 +18224,8 @@ Array [ "y2": 7, }, "x": 1, - "y": 7, + "y0": null, + "y1": 7, }, Object { "datum": Object { @@ -13675,7 +18234,8 @@ Array [ "y2": 2, }, "x": 2, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -13684,7 +18244,8 @@ Array [ "y2": 10, }, "x": 3, - "y": 10, + "y0": null, + "y1": 10, }, ], "key": Array [ diff --git a/packages/osd-charts/src/lib/series/domains/y_domain.test.ts b/packages/osd-charts/src/lib/series/domains/y_domain.test.ts index e0601a56e2be..998580b9059c 100644 --- a/packages/osd-charts/src/lib/series/domains/y_domain.test.ts +++ b/packages/osd-charts/src/lib/series/domains/y_domain.test.ts @@ -18,13 +18,13 @@ describe('Y Domain', () => { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 2, y: 2 }, { x: 3, y: 2 }, { x: 4, y: 5 }], + data: [{ x: 1, y1: 2 }, { x: 2, y1: 2 }, { x: 3, y1: 2 }, { x: 4, y1: 5 }], }, { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 4, y: 7 }], + data: [{ x: 1, y1: 2 }, { x: 4, y1: 7 }], }, ]; const specDataSeries = new Map(); @@ -59,13 +59,13 @@ describe('Y Domain', () => { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 2, y: 2 }, { x: 3, y: 2 }, { x: 4, y: 5 }], + data: [{ x: 1, y1: 2 }, { x: 2, y1: 2 }, { x: 3, y1: 2 }, { x: 4, y1: 5 }], }, { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 4, y: 7 }], + data: [{ x: 1, y1: 2 }, { x: 4, y1: 7 }], }, ]; const dataSeries2: RawDataSeries[] = [ @@ -73,7 +73,7 @@ describe('Y Domain', () => { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 10 }, { x: 2, y: 10 }, { x: 3, y: 2 }, { x: 4, y: 5 }], + data: [{ x: 1, y1: 10 }, { x: 2, y1: 10 }, { x: 3, y1: 2 }, { x: 4, y1: 5 }], }, ]; const specDataSeries = new Map(); @@ -124,13 +124,13 @@ describe('Y Domain', () => { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 2, y: 2 }, { x: 3, y: 2 }, { x: 4, y: 5 }], + data: [{ x: 1, y1: 2 }, { x: 2, y1: 2 }, { x: 3, y1: 2 }, { x: 4, y1: 5 }], }, { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 4, y: 7 }], + data: [{ x: 1, y1: 2 }, { x: 4, y1: 7 }], }, ]; const dataSeries2: RawDataSeries[] = [ @@ -138,7 +138,7 @@ describe('Y Domain', () => { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 10 }, { x: 2, y: 10 }, { x: 3, y: 2 }, { x: 4, y: 5 }], + data: [{ x: 1, y1: 10 }, { x: 2, y1: 10 }, { x: 3, y1: 2 }, { x: 4, y1: 5 }], }, ]; const specDataSeries = new Map(); @@ -182,13 +182,13 @@ describe('Y Domain', () => { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 2, y: 2 }, { x: 3, y: 2 }, { x: 4, y: 5 }], + data: [{ x: 1, y1: 2 }, { x: 2, y1: 2 }, { x: 3, y1: 2 }, { x: 4, y1: 5 }], }, { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 4, y: 7 }], + data: [{ x: 1, y1: 2 }, { x: 4, y1: 7 }], }, ]; const dataSeries2: RawDataSeries[] = [ @@ -196,7 +196,7 @@ describe('Y Domain', () => { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 10 }, { x: 2, y: 10 }, { x: 3, y: 2 }, { x: 4, y: 5 }], + data: [{ x: 1, y1: 10 }, { x: 2, y1: 10 }, { x: 3, y1: 2 }, { x: 4, y1: 5 }], }, ]; const specDataSeries = new Map(); @@ -240,13 +240,13 @@ describe('Y Domain', () => { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: new Array(maxValues).fill(0).map((d, i) => ({ x: i, y: i })), + data: new Array(maxValues).fill(0).map((d, i) => ({ x: i, y1: i })), }, { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: new Array(maxValues).fill(0).map((d, i) => ({ x: i, y: i })), + data: new Array(maxValues).fill(0).map((d, i) => ({ x: i, y1: i })), }, ]; const dataSeries2: RawDataSeries[] = [ @@ -254,7 +254,7 @@ describe('Y Domain', () => { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: new Array(maxValues).fill(0).map((d, i) => ({ x: i, y: i })), + data: new Array(maxValues).fill(0).map((d, i) => ({ x: i, y1: i })), }, ]; const specDataSeries = new Map(); @@ -443,13 +443,13 @@ describe('Y Domain', () => { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 2, y: 2 }, { x: 3, y: 2 }, { x: 4, y: 5 }], + data: [{ x: 1, y1: 2 }, { x: 2, y1: 2 }, { x: 3, y1: 2 }, { x: 4, y1: 5 }], }, { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 4, y: 7 }], + data: [{ x: 1, y1: 2 }, { x: 4, y1: 7 }], }, ]; const specDataSeries = new Map(); @@ -477,13 +477,13 @@ describe('Y Domain', () => { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 2, y: 2 }, { x: 3, y: 2 }, { x: 4, y: 5 }], + data: [{ x: 1, y1: 2 }, { x: 2, y1: 2 }, { x: 3, y1: 2 }, { x: 4, y1: 5 }], }, { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 4, y: 7 }], + data: [{ x: 1, y1: 2 }, { x: 4, y1: 7 }], }, ]; const specDataSeries = new Map(); @@ -523,13 +523,13 @@ describe('Y Domain', () => { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 2, y: 2 }, { x: 3, y: 2 }, { x: 4, y: 5 }], + data: [{ x: 1, y1: 2 }, { x: 2, y1: 2 }, { x: 3, y1: 2 }, { x: 4, y1: 5 }], }, { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 4, y: 7 }], + data: [{ x: 1, y1: 2 }, { x: 4, y1: 7 }], }, ]; const specDataSeries = new Map(); @@ -569,13 +569,13 @@ describe('Y Domain', () => { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 2, y: 2 }, { x: 3, y: 2 }, { x: 4, y: 5 }], + data: [{ x: 1, y1: 2 }, { x: 2, y1: 2 }, { x: 3, y1: 2 }, { x: 4, y1: 5 }], }, { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 4, y: 7 }], + data: [{ x: 1, y1: 2 }, { x: 4, y1: 7 }], }, ]; const specDataSeries = new Map(); @@ -611,13 +611,13 @@ describe('Y Domain', () => { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 2, y: 2 }, { x: 3, y: 2 }, { x: 4, y: 5 }], + data: [{ x: 1, y1: 2 }, { x: 2, y1: 2 }, { x: 3, y1: 2 }, { x: 4, y1: 5 }], }, { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 4, y: 7 }], + data: [{ x: 1, y1: 2 }, { x: 4, y1: 7 }], }, ]; const specDataSeries = new Map(); @@ -657,13 +657,13 @@ describe('Y Domain', () => { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 2, y: 2 }, { x: 3, y: 2 }, { x: 4, y: 5 }], + data: [{ x: 1, y1: 2 }, { x: 2, y1: 2 }, { x: 3, y1: 2 }, { x: 4, y1: 5 }], }, { specId: getSpecId('a'), key: [''], seriesColorKey: '', - data: [{ x: 1, y: 2 }, { x: 4, y: 7 }], + data: [{ x: 1, y1: 2 }, { x: 4, y1: 7 }], }, ]; const specDataSeries = new Map(); diff --git a/packages/osd-charts/src/lib/series/domains/y_domain.ts b/packages/osd-charts/src/lib/series/domains/y_domain.ts index 0c2006fad48c..3dfa859f9dbe 100644 --- a/packages/osd-charts/src/lib/series/domains/y_domain.ts +++ b/packages/osd-charts/src/lib/series/domains/y_domain.ts @@ -33,7 +33,6 @@ export function mergeYDomain( // group specs by group ids const specsByGroupIds = splitSpecsByGroupId(specs); - // const groupDomains = new Map(); const specsByGroupIdsEntries = [...specsByGroupIds.entries()]; const yDomains = specsByGroupIdsEntries.map( @@ -74,13 +73,17 @@ export function mergeYDomain( domain = [customDomain.min, customDomain.max]; } else if (customDomain && isLowerBound(customDomain)) { if (customDomain.min > computedDomainMax) { - throw new Error(`custom yDomain for ${groupId} is invalid, custom min is greater than computed max`); + throw new Error( + `custom yDomain for ${groupId} is invalid, custom min is greater than computed max`, + ); } domain = [customDomain.min, computedDomainMax]; } else if (customDomain && isUpperBound(customDomain)) { if (computedDomainMin > customDomain.max) { - throw new Error(`custom yDomain for ${groupId} is invalid, computed min is greater than custom max`); + throw new Error( + `custom yDomain for ${groupId} is invalid, computed min is greater than custom max`, + ); } domain = [computedDomainMin, customDomain.max]; @@ -89,7 +92,7 @@ export function mergeYDomain( return { type: 'yDomain', isBandScale: false, - scaleType: groupYScaleType as ScaleContinuousType, + scaleType: groupYScaleType, groupId, domain, }; @@ -117,7 +120,7 @@ function computeYStackedDomain(dataseries: RawDataSeries[], scaleToExtent: boole dataseries.forEach((ds, index) => { ds.data.forEach((datum) => { const stack = stackMap.get(datum.x) || []; - stack[index] = datum.y; + stack[index] = datum.y1; stackMap.set(datum.x, stack); }); }); @@ -137,7 +140,10 @@ function computeYNonStackedDomain(dataseries: RawDataSeries[], scaleToExtent: bo const yValues = new Set(); dataseries.forEach((ds) => { ds.data.forEach((datum) => { - yValues.add(datum.y); + yValues.add(datum.y1); + if (datum.y0 != null) { + yValues.add(datum.y0); + } }); }); if (yValues.size === 0) { diff --git a/packages/osd-charts/src/lib/series/nonstacked_series_utils.test.ts b/packages/osd-charts/src/lib/series/nonstacked_series_utils.test.ts new file mode 100644 index 000000000000..eac49aac9a96 --- /dev/null +++ b/packages/osd-charts/src/lib/series/nonstacked_series_utils.test.ts @@ -0,0 +1,343 @@ +import { getSpecId } from '../utils/ids'; +import { formatNonStackedDataSeriesValues } from './nonstacked_series_utils'; +import { RawDataSeries } from './series'; + +const EMPTY_DATA_SET: RawDataSeries[] = [ + { + data: [], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec1'), + }, +]; +const STANDARD_DATA_SET: RawDataSeries[] = [ + { + data: [ + { + x: 0, + y1: 10, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec1'), + }, + { + data: [ + { + x: 0, + y1: 20, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec2'), + }, + { + data: [ + { + x: 0, + y1: 30, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec3'), + }, +]; +const WITH_NULL_DATASET: RawDataSeries[] = [ + { + data: [ + { + x: 0, + y1: 10, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec1'), + }, + { + data: [ + { + x: 0, + y1: null, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec2'), + }, + { + data: [ + { + x: 0, + y1: 30, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec3'), + }, +]; +const STANDARD_DATA_SET_WY0: RawDataSeries[] = [ + { + data: [ + { + x: 0, + y0: 2, + y1: 10, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec1'), + }, + { + data: [ + { + x: 0, + y0: 4, + y1: 20, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec2'), + }, + { + data: [ + { + x: 0, + y0: 6, + y1: 30, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec3'), + }, +]; +const WITH_NULL_DATASET_WY0: RawDataSeries[] = [ + { + data: [ + { + x: 0, + y0: 2, + y1: 10, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec1'), + }, + { + data: [ + { + x: 0, + y1: null, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec2'), + }, + { + data: [ + { + x: 0, + y0: 6, + y1: 30, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec3'), + }, +]; +const DATA_SET_WITH_NULL_2: RawDataSeries[] = [ + { + specId: getSpecId('spec1'), + key: ['a'], + seriesColorKey: 'a', + data: [{ x: 1, y1: 1 }, { x: 2, y1: 2 }, { x: 4, y1: 4 }], + }, + { + specId: getSpecId('spec1'), + key: ['b'], + seriesColorKey: 'b', + data: [{ x: 1, y1: 21 }, { x: 3, y1: 23 }], + }, +]; +describe('Non-Stacked Series Utils', () => { + describe('Format stacked dataset', () => { + test('empty data', () => { + const formattedData = formatNonStackedDataSeriesValues(EMPTY_DATA_SET, false); + expect(formattedData[0].data.length).toBe(0); + }); + test('format data without nulls', () => { + let formattedData = formatNonStackedDataSeriesValues(STANDARD_DATA_SET, false); + expect(formattedData[0].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 10, + x: 0, + y0: 0, + y1: 10, + }); + expect(formattedData[1].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 20, + x: 0, + y0: 0, + y1: 20, + }); + expect(formattedData[2].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 30, + x: 0, + y0: 0, + y1: 30, + }); + formattedData = formatNonStackedDataSeriesValues(STANDARD_DATA_SET, true); + expect(formattedData[0].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 10, + x: 0, + y0: 10, + y1: 10, + }); + expect(formattedData[1].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 20, + x: 0, + y0: 20, + y1: 20, + }); + expect(formattedData[2].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 30, + x: 0, + y0: 30, + y1: 30, + }); + }); + test('format data with nulls', () => { + const formattedData = formatNonStackedDataSeriesValues(WITH_NULL_DATASET, false); + expect(formattedData[1].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: null, + x: 0, + y1: null, + y0: null, + }); + }); + test('format data without nulls with y0 values', () => { + const formattedData = formatNonStackedDataSeriesValues(STANDARD_DATA_SET_WY0, false); + expect(formattedData[0].data[0]).toEqual({ + datum: undefined, + initialY0: 2, + initialY1: 10, + x: 0, + y0: 2, + y1: 10, + }); + expect(formattedData[1].data[0]).toEqual({ + datum: undefined, + initialY0: 4, + initialY1: 20, + x: 0, + y0: 4, + y1: 20, + }); + expect(formattedData[2].data[0]).toEqual({ + datum: undefined, + initialY0: 6, + initialY1: 30, + x: 0, + y0: 6, + y1: 30, + }); + }); + test('format data with nulls', () => { + const formattedData = formatNonStackedDataSeriesValues(WITH_NULL_DATASET_WY0, false); + expect(formattedData[0].data[0]).toEqual({ + datum: undefined, + initialY0: 2, + initialY1: 10, + x: 0, + y0: 2, + y1: 10, + }); + expect(formattedData[1].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: null, + x: 0, + y1: null, + y0: null, + }); + expect(formattedData[2].data[0]).toEqual({ + datum: undefined, + initialY0: 6, + initialY1: 30, + x: 0, + y0: 6, + y1: 30, + }); + }); + test('format data without nulls on second series', () => { + const formattedData = formatNonStackedDataSeriesValues(DATA_SET_WITH_NULL_2, false); + expect(formattedData.length).toBe(2); + expect(formattedData[0].data.length).toBe(3); + expect(formattedData[1].data.length).toBe(2); + + expect(formattedData[0].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 1, + x: 1, + y0: 0, + y1: 1, + }); + expect(formattedData[0].data[1]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 2, + x: 2, + y0: 0, + y1: 2, + }); + expect(formattedData[0].data[2]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 4, + x: 4, + y0: 0, + y1: 4, + }); + expect(formattedData[1].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 21, + x: 1, + y0: 0, + y1: 21, + }); + expect(formattedData[1].data[1]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 23, + x: 3, + y0: 0, + y1: 23, + }); + }); + }); +}); diff --git a/packages/osd-charts/src/lib/series/nonstacked_series_utils.ts b/packages/osd-charts/src/lib/series/nonstacked_series_utils.ts new file mode 100644 index 000000000000..949db4d82696 --- /dev/null +++ b/packages/osd-charts/src/lib/series/nonstacked_series_utils.ts @@ -0,0 +1,54 @@ +import { DataSeries, DataSeriesDatum, RawDataSeries } from './series'; + +export function formatNonStackedDataSeriesValues( + dataseries: RawDataSeries[], + scaleToExtent: boolean, +): DataSeries[] { + const len = dataseries.length; + let i; + const formattedValues: DataSeries[] = []; + for (i = 0; i < len; i++) { + const formattedValue = formatNonStackedDataValues(dataseries[i], scaleToExtent); + formattedValues.push(formattedValue); + } + return formattedValues; +} + +export function formatNonStackedDataValues( + dataSeries: RawDataSeries, + scaleToExtent: boolean, +): DataSeries { + const len = dataSeries.data.length; + let i; + const formattedValues: DataSeries = { + key: dataSeries.key, + specId: dataSeries.specId, + seriesColorKey: dataSeries.seriesColorKey, + data: [], + }; + for (i = 0; i < len; i++) { + const data = dataSeries.data[i]; + const { x, y1, datum } = data; + let y0: number | null; + if (y1 === null) { + y0 = null; + } else { + if (scaleToExtent) { + y0 = data.y0 ? data.y0 : y1; + } else { + y0 = data.y0 ? data.y0 : 0; + } + } + + const formattedValue: DataSeriesDatum = { + x, + y1, + y0, + initialY1: y1, + initialY0: data.y0 == null || y1 === null ? null : data.y0, + datum, + }; + formattedValues.data.push(formattedValue); + } + return formattedValues; +} diff --git a/packages/osd-charts/src/lib/series/rendering.areas.test.ts b/packages/osd-charts/src/lib/series/rendering.areas.test.ts index 377eab8439fb..3c996fa481f4 100644 --- a/packages/osd-charts/src/lib/series/rendering.areas.test.ts +++ b/packages/osd-charts/src/lib/series/rendering.areas.test.ts @@ -2,7 +2,7 @@ import { computeSeriesDomains } from '../../state/utils'; import { getGroupId, getSpecId } from '../utils/ids'; import { ScaleType } from '../utils/scales/scales'; import { CurveType } from './curves'; -import { AreaGeometry, IndexedGeometry, renderArea } from './rendering'; +import { AreaGeometry, IndexedGeometry, PointGeometry, renderArea } from './rendering'; import { computeXScale, computeYScales } from './scales'; import { AreaSeriesSpec } from './specs'; const SPEC_ID = getSpecId('spec_1'); @@ -40,14 +40,15 @@ describe('Rendering points - areas', () => { 'red', CurveType.LINEAR, SPEC_ID, + false, [], ); }); test('Can render an line and area paths', () => { const { - areaGeometry: { line, area, color, geometryId, transform }, + areaGeometry: { lines, area, color, geometryId, transform }, } = renderedArea; - expect(line).toBe('M0,0L50,50'); + expect(lines[0]).toBe('M0,0L50,50'); expect(area).toBe('M0,0L50,50L50,100L0,100Z'); expect(color).toBe('red'); expect(geometryId.seriesKey).toEqual([]); @@ -64,31 +65,42 @@ describe('Rendering points - areas', () => { expect(points[0]).toEqual({ x: 0, y: 0, + radius: 10, color: 'red', - value: { + geometryId: { specId: SPEC_ID, seriesKey: [], - datum: [0, 10], }, + value: { + accessor: 'y1', + x: 0, + y: 10, + }, + transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 50, y: 50, + radius: 10, color: 'red', - value: { + geometryId: { specId: SPEC_ID, seriesKey: [], - datum: [1, 5], + }, + value: { + accessor: 'y1', + x: 1, + y: 5, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -142,6 +154,7 @@ describe('Rendering points - areas', () => { 'red', CurveType.LINEAR, spec1Id, + false, [], ); secondLine = renderArea( @@ -152,19 +165,20 @@ describe('Rendering points - areas', () => { 'blue', CurveType.LINEAR, spec2Id, + false, [], ); }); test('Can render two ordinal areas', () => { - expect(firstLine.areaGeometry.line).toBe('M0,50L50,75'); + expect(firstLine.areaGeometry.lines[0]).toBe('M0,50L50,75'); expect(firstLine.areaGeometry.area).toBe('M0,50L50,75L50,100L0,100Z'); expect(firstLine.areaGeometry.color).toBe('red'); expect(firstLine.areaGeometry.geometryId.seriesKey).toEqual([]); expect(firstLine.areaGeometry.geometryId.specId).toEqual(spec1Id); expect(firstLine.areaGeometry.transform).toEqual({ x: 25, y: 0 }); - expect(secondLine.areaGeometry.line).toBe('M0,0L50,50'); + expect(secondLine.areaGeometry.lines[0]).toBe('M0,0L50,50'); expect(secondLine.areaGeometry.area).toBe('M0,0L50,50L50,100L0,100Z'); expect(secondLine.areaGeometry.color).toBe('blue'); expect(secondLine.areaGeometry.geometryId.seriesKey).toEqual([]); @@ -180,31 +194,41 @@ describe('Rendering points - areas', () => { expect(points[0]).toEqual({ x: 0, y: 50, + radius: 10, color: 'red', - value: { + geometryId: { specId: spec1Id, seriesKey: [], - datum: [0, 10], + }, + value: { + accessor: 'y1', + x: 0, + y: 10, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 50, y: 75, + radius: 10, color: 'red', - value: { + geometryId: { specId: spec1Id, seriesKey: [], - datum: [1, 5], + }, + value: { + accessor: 'y1', + x: 1, + y: 5, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); test('can render second spec points', () => { @@ -216,31 +240,41 @@ describe('Rendering points - areas', () => { expect(points[0]).toEqual({ x: 0, y: 0, + radius: 10, color: 'blue', - value: { + geometryId: { specId: spec2Id, seriesKey: [], - datum: [0, 20], + }, + value: { + accessor: 'y1', + x: 0, + y: 20, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 50, y: 50, + radius: 10, color: 'blue', - value: { + geometryId: { specId: spec2Id, seriesKey: [], - datum: [1, 10], + }, + value: { + accessor: 'y1', + x: 1, + y: 10, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -276,11 +310,12 @@ describe('Rendering points - areas', () => { 'red', CurveType.LINEAR, SPEC_ID, + false, [], ); }); test('Can render a linear area', () => { - expect(renderedArea.areaGeometry.line).toBe('M0,0L100,50'); + expect(renderedArea.areaGeometry.lines[0]).toBe('M0,0L100,50'); expect(renderedArea.areaGeometry.area).toBe('M0,0L100,50L100,100L0,100Z'); expect(renderedArea.areaGeometry.color).toBe('red'); expect(renderedArea.areaGeometry.geometryId.seriesKey).toEqual([]); @@ -295,31 +330,41 @@ describe('Rendering points - areas', () => { expect(points[0]).toEqual({ x: 0, y: 0, + radius: 10, color: 'red', - value: { + geometryId: { specId: SPEC_ID, seriesKey: [], - datum: [0, 10], + }, + value: { + accessor: 'y1', + x: 0, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 100, y: 50, + radius: 10, color: 'red', - value: { + geometryId: { specId: SPEC_ID, seriesKey: [], - datum: [1, 5], + }, + value: { + accessor: 'y1', + x: 1, + y: 5, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -373,6 +418,7 @@ describe('Rendering points - areas', () => { 'red', CurveType.LINEAR, spec1Id, + false, [], ); secondLine = renderArea( @@ -383,18 +429,19 @@ describe('Rendering points - areas', () => { 'blue', CurveType.LINEAR, spec2Id, + false, [], ); }); test('can render two linear areas', () => { - expect(firstLine.areaGeometry.line).toBe('M0,50L100,75'); + expect(firstLine.areaGeometry.lines[0]).toBe('M0,50L100,75'); expect(firstLine.areaGeometry.area).toBe('M0,50L100,75L100,100L0,100Z'); expect(firstLine.areaGeometry.color).toBe('red'); expect(firstLine.areaGeometry.geometryId.seriesKey).toEqual([]); expect(firstLine.areaGeometry.geometryId.specId).toEqual(spec1Id); expect(firstLine.areaGeometry.transform).toEqual({ x: 0, y: 0 }); - expect(secondLine.areaGeometry.line).toBe('M0,0L100,50'); + expect(secondLine.areaGeometry.lines[0]).toBe('M0,0L100,50'); expect(secondLine.areaGeometry.area).toBe('M0,0L100,50L100,100L0,100Z'); expect(secondLine.areaGeometry.color).toBe('blue'); expect(secondLine.areaGeometry.geometryId.seriesKey).toEqual([]); @@ -410,31 +457,41 @@ describe('Rendering points - areas', () => { expect(points[0]).toEqual({ x: 0, y: 50, + radius: 10, color: 'red', - value: { + geometryId: { specId: spec1Id, seriesKey: [], - datum: [0, 10], + }, + value: { + accessor: 'y1', + x: 0, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 100, y: 75, + radius: 10, color: 'red', - value: { + geometryId: { specId: spec1Id, seriesKey: [], - datum: [1, 5], + }, + value: { + accessor: 'y1', + x: 1, + y: 5, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); test('can render second spec points', () => { @@ -446,31 +503,41 @@ describe('Rendering points - areas', () => { expect(points[0]).toEqual({ x: 0, y: 0, + radius: 10, color: 'blue', - value: { + geometryId: { specId: spec2Id, seriesKey: [], - datum: [0, 20], + }, + value: { + accessor: 'y1', + x: 0, + y: 20, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 100, y: 50, + radius: 10, color: 'blue', - value: { + geometryId: { specId: spec2Id, seriesKey: [], - datum: [1, 10], + }, + value: { + accessor: 'y1', + x: 1, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -506,11 +573,12 @@ describe('Rendering points - areas', () => { 'red', CurveType.LINEAR, SPEC_ID, + false, [], ); }); test('Can render a time area', () => { - expect(renderedArea.areaGeometry.line).toBe('M0,0L100,50'); + expect(renderedArea.areaGeometry.lines[0]).toBe('M0,0L100,50'); expect(renderedArea.areaGeometry.area).toBe('M0,0L100,50L100,100L0,100Z'); expect(renderedArea.areaGeometry.color).toBe('red'); expect(renderedArea.areaGeometry.geometryId.seriesKey).toEqual([]); @@ -525,31 +593,41 @@ describe('Rendering points - areas', () => { expect(points[0]).toEqual({ x: 0, y: 0, + radius: 10, color: 'red', - value: { + geometryId: { specId: SPEC_ID, seriesKey: [], - datum: [1546300800000, 10], + }, + value: { + accessor: 'y1', + x: 1546300800000, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 100, y: 50, + radius: 10, color: 'red', - value: { + geometryId: { specId: SPEC_ID, seriesKey: [], - datum: [1546387200000, 5], + }, + value: { + accessor: 'y1', + x: 1546387200000, + y: 5, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -603,6 +681,7 @@ describe('Rendering points - areas', () => { 'red', CurveType.LINEAR, spec1Id, + false, [], ); secondLine = renderArea( @@ -613,6 +692,7 @@ describe('Rendering points - areas', () => { 'blue', CurveType.LINEAR, spec2Id, + false, [], ); }); @@ -625,31 +705,41 @@ describe('Rendering points - areas', () => { expect(points[0]).toEqual({ x: 0, y: 50, + radius: 10, color: 'red', - value: { + geometryId: { specId: spec1Id, seriesKey: [], - datum: [1546300800000, 10], + }, + value: { + accessor: 'y1', + x: 1546300800000, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 100, y: 75, + radius: 10, color: 'red', - value: { + geometryId: { specId: spec1Id, seriesKey: [], - datum: [1546387200000, 5], + }, + value: { + accessor: 'y1', + x: 1546387200000, + y: 5, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); test('can render second spec points', () => { @@ -661,31 +751,41 @@ describe('Rendering points - areas', () => { expect(points[0]).toEqual({ x: 0, y: 0, + radius: 10, color: 'blue', - value: { + geometryId: { specId: spec2Id, seriesKey: [], - datum: [1546300800000, 20], + }, + value: { + accessor: 'y1', + x: 1546300800000, + y: 20, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 100, y: 50, + radius: 10, color: 'blue', - value: { + geometryId: { specId: spec2Id, seriesKey: [], - datum: [1546387200000, 10], + }, + value: { + accessor: 'y1', + x: 1546387200000, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -721,12 +821,13 @@ describe('Rendering points - areas', () => { 'red', CurveType.LINEAR, SPEC_ID, + false, [], ); }); test('Can render a splitted area and line', () => { // expect(renderedArea.lineGeometry.line).toBe('ss'); - expect(renderedArea.areaGeometry.line.split('M').length - 1).toBe(3); + expect(renderedArea.areaGeometry.lines[0].split('M').length - 1).toBe(3); expect(renderedArea.areaGeometry.area.split('M').length - 1).toBe(3); expect(renderedArea.areaGeometry.color).toBe('red'); expect(renderedArea.areaGeometry.geometryId.seriesKey).toEqual([]); @@ -740,25 +841,18 @@ describe('Rendering points - areas', () => { } = renderedArea; // all the points minus the undefined ones on a log scale expect(points.length).toBe(7); - // all the points - expect(indexedGeometries.size).toEqual(9); - const nullIndexdGeometry = indexedGeometries.get(2); - expect(nullIndexdGeometry).toBeDefined(); - expect(nullIndexdGeometry!.length).toBe(1); - // moved to the bottom of the chart - expect(nullIndexdGeometry![0].geom.y).toBe(100); - // 0 radius point - expect(nullIndexdGeometry![0].geom.width).toBe(0); - expect(nullIndexdGeometry![0].geom.height).toBe(0); + // all the points expect null geometries + expect(indexedGeometries.size).toEqual(8); + const nullIndexdGeometry = indexedGeometries.get(2)!; + expect(nullIndexdGeometry).toBeUndefined(); - const zeroValueIndexdGeometry = indexedGeometries.get(5); + const zeroValueIndexdGeometry = indexedGeometries.get(5)!; expect(zeroValueIndexdGeometry).toBeDefined(); - expect(zeroValueIndexdGeometry!.length).toBe(1); + expect(zeroValueIndexdGeometry.length).toBe(1); // moved to the bottom of the chart - expect(zeroValueIndexdGeometry![0].geom.y).toBe(100); + expect(zeroValueIndexdGeometry[0].y).toBe(100); // 0 radius point - expect(zeroValueIndexdGeometry![0].geom.width).toBe(0); - expect(zeroValueIndexdGeometry![0].geom.height).toBe(0); + expect((zeroValueIndexdGeometry[0] as PointGeometry).radius).toBe(0); }); }); }); diff --git a/packages/osd-charts/src/lib/series/rendering.bands.test.ts b/packages/osd-charts/src/lib/series/rendering.bands.test.ts new file mode 100644 index 000000000000..27521013221d --- /dev/null +++ b/packages/osd-charts/src/lib/series/rendering.bands.test.ts @@ -0,0 +1,403 @@ +import { computeSeriesDomains } from '../../state/utils'; +import { getGroupId, getSpecId } from '../utils/ids'; +import { ScaleType } from '../utils/scales/scales'; +import { CurveType } from './curves'; +import { AreaGeometry, IndexedGeometry, PointGeometry, renderArea, renderBars } from './rendering'; +import { computeXScale, computeYScales } from './scales'; +import { AreaSeriesSpec, BarSeriesSpec } from './specs'; +const SPEC_ID = getSpecId('spec_1'); +const GROUP_ID = getGroupId('group_1'); + +describe('Rendering bands - areas', () => { + describe('Single band area chart', () => { + const pointSeriesSpec: AreaSeriesSpec = { + id: SPEC_ID, + groupId: GROUP_ID, + seriesType: 'area', + yScaleToDataExtent: false, + data: [[0, 2, 10], [1, 3, 5]], + xAccessor: 0, + y0Accessors: [1], + yAccessors: [2], + xScaleType: ScaleType.Ordinal, + yScaleType: ScaleType.Linear, + }; + const pointSeriesMap = new Map(); + pointSeriesMap.set(SPEC_ID, pointSeriesSpec); + const pointSeriesDomains = computeSeriesDomains(pointSeriesMap, new Map()); + const xScale = computeXScale(pointSeriesDomains.xDomain, pointSeriesMap.size, 0, 100); + const yScales = computeYScales(pointSeriesDomains.yDomain, 100, 0); + let renderedArea: { + areaGeometry: AreaGeometry; + indexedGeometries: Map; + }; + + beforeEach(() => { + renderedArea = renderArea( + 25, // adding a ideal 25px shift, generally applied by renderGeometries + pointSeriesDomains.formattedDataSeries.nonStacked[0].dataSeries[0].data, + xScale, + yScales.get(GROUP_ID)!, + 'red', + CurveType.LINEAR, + SPEC_ID, + true, + [], + ); + }); + test('Can render upper and lower lines and area paths', () => { + const { + areaGeometry: { lines, area, color, geometryId, transform }, + } = renderedArea; + expect(lines.length).toBe(2); + expect(lines[0]).toBe('M0,0L50,50'); + expect(lines[1]).toBe('M0,80L50,70'); + expect(area).toBe('M0,0L50,50L50,70L0,80Z'); + expect(color).toBe('red'); + expect(geometryId.seriesKey).toEqual([]); + expect(geometryId.specId).toEqual(SPEC_ID); + expect(transform).toEqual({ x: 25, y: 0 }); + }); + + test('Can render two points', () => { + const { + areaGeometry: { points }, + } = renderedArea; + expect(points.length).toBe(4); + expect(points[0]).toEqual({ + x: 0, + y: 80, + radius: 10, + color: 'red', + geometryId: { + specId: SPEC_ID, + seriesKey: [], + }, + value: { + accessor: 'y0', + x: 0, + y: 2, + }, + + transform: { + x: 25, + y: 0, + }, + } as PointGeometry); + + expect(points[1]).toEqual({ + x: 0, + y: 0, + radius: 10, + color: 'red', + geometryId: { + specId: SPEC_ID, + seriesKey: [], + }, + value: { + accessor: 'y1', + x: 0, + y: 10, + }, + + transform: { + x: 25, + y: 0, + }, + } as PointGeometry); + expect(points[2]).toEqual({ + x: 50, + y: 70, + radius: 10, + color: 'red', + geometryId: { + specId: SPEC_ID, + seriesKey: [], + }, + value: { + accessor: 'y0', + x: 1, + y: 3, + }, + transform: { + x: 25, + y: 0, + }, + } as PointGeometry); + expect(points[3]).toEqual({ + x: 50, + y: 50, + radius: 10, + color: 'red', + geometryId: { + specId: SPEC_ID, + seriesKey: [], + }, + value: { + accessor: 'y1', + x: 1, + y: 5, + }, + transform: { + x: 25, + y: 0, + }, + } as PointGeometry); + }); + }); + describe('Single band area chart with null values', () => { + const pointSeriesSpec: AreaSeriesSpec = { + id: SPEC_ID, + groupId: GROUP_ID, + seriesType: 'area', + yScaleToDataExtent: false, + data: [[0, 2, 10], [1, 2, null], [2, 3, 5], [3, 3, 5]], + xAccessor: 0, + y0Accessors: [1], + yAccessors: [2], + xScaleType: ScaleType.Ordinal, + yScaleType: ScaleType.Linear, + }; + const pointSeriesMap = new Map(); + pointSeriesMap.set(SPEC_ID, pointSeriesSpec); + const pointSeriesDomains = computeSeriesDomains(pointSeriesMap, new Map()); + const xScale = computeXScale(pointSeriesDomains.xDomain, pointSeriesMap.size, 0, 100); + const yScales = computeYScales(pointSeriesDomains.yDomain, 100, 0); + let renderedArea: { + areaGeometry: AreaGeometry; + indexedGeometries: Map; + }; + + beforeEach(() => { + renderedArea = renderArea( + 25, // adding a ideal 25px shift, generally applied by renderGeometries + pointSeriesDomains.formattedDataSeries.nonStacked[0].dataSeries[0].data, + xScale, + yScales.get(GROUP_ID)!, + 'red', + CurveType.LINEAR, + SPEC_ID, + true, + [], + ); + }); + test('Can render upper and lower lines and area paths', () => { + const { + areaGeometry: { lines, area, color, geometryId, transform }, + } = renderedArea; + expect(lines.length).toBe(2); + expect(lines[0]).toBe('M0,0ZM50,50L75,50'); + expect(lines[1]).toBe('M0,80ZM50,70L75,70'); + expect(area).toBe('M0,0L0,80ZM50,50L75,50L75,70L50,70Z'); + expect(color).toBe('red'); + expect(geometryId.seriesKey).toEqual([]); + expect(geometryId.specId).toEqual(SPEC_ID); + expect(transform).toEqual({ x: 25, y: 0 }); + }); + + test('Can render two points', () => { + const { + areaGeometry: { points }, + } = renderedArea; + // expect(points).toBe(6); + expect(points.length).toBe(6); + expect(points[0]).toEqual({ + x: 0, + y: 80, + radius: 10, + color: 'red', + geometryId: { + specId: SPEC_ID, + seriesKey: [], + }, + value: { + accessor: 'y0', + x: 0, + y: 2, + }, + + transform: { + x: 25, + y: 0, + }, + } as PointGeometry); + + expect(points[1]).toEqual({ + x: 0, + y: 0, + radius: 10, + color: 'red', + geometryId: { + specId: SPEC_ID, + seriesKey: [], + }, + value: { + accessor: 'y1', + x: 0, + y: 10, + }, + + transform: { + x: 25, + y: 0, + }, + } as PointGeometry); + expect(points[2]).toEqual({ + x: 50, + y: 70, + radius: 10, + color: 'red', + geometryId: { + specId: SPEC_ID, + seriesKey: [], + }, + value: { + accessor: 'y0', + x: 2, + y: 3, + }, + transform: { + x: 25, + y: 0, + }, + } as PointGeometry); + expect(points[3]).toEqual({ + x: 50, + y: 50, + radius: 10, + color: 'red', + geometryId: { + specId: SPEC_ID, + seriesKey: [], + }, + value: { + accessor: 'y1', + x: 2, + y: 5, + }, + transform: { + x: 25, + y: 0, + }, + } as PointGeometry); + expect(points[4]).toEqual({ + x: 75, + y: 70, + radius: 10, + color: 'red', + geometryId: { + specId: SPEC_ID, + seriesKey: [], + }, + value: { + accessor: 'y0', + x: 3, + y: 3, + }, + transform: { + x: 25, + y: 0, + }, + } as PointGeometry); + expect(points[5]).toEqual({ + x: 75, + y: 50, + radius: 10, + color: 'red', + geometryId: { + specId: SPEC_ID, + seriesKey: [], + }, + value: { + accessor: 'y1', + x: 3, + y: 5, + }, + transform: { + x: 25, + y: 0, + }, + } as PointGeometry); + }); + }); + describe('Single series band bar chart - ordinal', () => { + const barSeriesSpec: BarSeriesSpec = { + id: SPEC_ID, + groupId: GROUP_ID, + seriesType: 'bar', + yScaleToDataExtent: false, + data: [[0, 2, 10], [1, 3, null], [2, 3, 5], [3, 4, 8]], + xAccessor: 0, + y0Accessors: [1], + yAccessors: [2], + xScaleType: ScaleType.Ordinal, + yScaleType: ScaleType.Linear, + }; + const barSeriesMap = new Map(); + barSeriesMap.set(SPEC_ID, barSeriesSpec); + const barSeriesDomains = computeSeriesDomains(barSeriesMap, new Map()); + const xScale = computeXScale(barSeriesDomains.xDomain, barSeriesMap.size, 0, 100); + const yScales = computeYScales(barSeriesDomains.yDomain, 100, 0); + + test('Can render two bars', () => { + const { barGeometries } = renderBars( + 0, + barSeriesDomains.formattedDataSeries.nonStacked[0].dataSeries[0].data, + xScale, + yScales.get(GROUP_ID)!, + 'red', + SPEC_ID, + [], + ); + expect(barGeometries.length).toBe(3); + expect(barGeometries[0]).toEqual({ + x: 0, + y: 0, + width: 25, + height: 80, + color: 'red', + value: { + accessor: 'y1', + x: 0, + y: 10, + }, + geometryId: { + specId: SPEC_ID, + seriesKey: [], + }, + }); + expect(barGeometries[1]).toEqual({ + x: 50, + y: 50, + width: 25, + height: 20, + color: 'red', + value: { + accessor: 'y1', + x: 2, + y: 5, + }, + geometryId: { + specId: SPEC_ID, + seriesKey: [], + }, + }); + expect(barGeometries[2]).toEqual({ + x: 75, + y: 20, + width: 25, + height: 40, + color: 'red', + value: { + accessor: 'y1', + x: 3, + y: 8, + }, + geometryId: { + specId: SPEC_ID, + seriesKey: [], + }, + }); + }); + }); +}); diff --git a/packages/osd-charts/src/lib/series/rendering.bars.test.ts b/packages/osd-charts/src/lib/series/rendering.bars.test.ts index cc1013f5ec7d..ada7063f0f87 100644 --- a/packages/osd-charts/src/lib/series/rendering.bars.test.ts +++ b/packages/osd-charts/src/lib/series/rendering.bars.test.ts @@ -43,9 +43,9 @@ describe('Rendering bars', () => { height: 100, color: 'red', value: { - specId: SPEC_ID, - seriesKey: [], - datum: [0, 10], + accessor: 'y1', + x: 0, + y: 10, }, geometryId: { specId: SPEC_ID, @@ -59,9 +59,9 @@ describe('Rendering bars', () => { height: 50, color: 'red', value: { - specId: SPEC_ID, - seriesKey: [], - datum: [1, 5], + accessor: 'y1', + x: 1, + y: 5, }, geometryId: { specId: SPEC_ID, @@ -120,9 +120,9 @@ describe('Rendering bars', () => { height: 50, color: 'red', value: { - specId: spec1Id, - seriesKey: [], - datum: [0, 10], + accessor: 'y1', + x: 0, + y: 10, }, geometryId: { specId: spec1Id, @@ -136,9 +136,9 @@ describe('Rendering bars', () => { height: 25, color: 'red', value: { - specId: spec1Id, - seriesKey: [], - datum: [1, 5], + accessor: 'y1', + x: 1, + y: 5, }, geometryId: { specId: spec1Id, @@ -164,9 +164,9 @@ describe('Rendering bars', () => { height: 100, color: 'blue', value: { - specId: spec2Id, - seriesKey: [], - datum: [0, 20], + accessor: 'y1', + x: 0, + y: 20, }, geometryId: { specId: spec2Id, @@ -180,9 +180,9 @@ describe('Rendering bars', () => { height: 50, color: 'blue', value: { - specId: spec2Id, - seriesKey: [], - datum: [1, 10], + accessor: 'y1', + x: 1, + y: 10, }, geometryId: { specId: spec2Id, @@ -191,7 +191,7 @@ describe('Rendering bars', () => { }); }); }); - describe('Single series bar chart - lineaar', () => { + describe('Single series bar chart - linear', () => { const barSeriesSpec: BarSeriesSpec = { id: SPEC_ID, groupId: GROUP_ID, @@ -226,9 +226,9 @@ describe('Rendering bars', () => { height: 100, color: 'red', value: { - specId: SPEC_ID, - seriesKey: [], - datum: [0, 10], + accessor: 'y1', + x: 0, + y: 10, }, geometryId: { specId: SPEC_ID, @@ -242,9 +242,9 @@ describe('Rendering bars', () => { height: 50, color: 'red', value: { - specId: SPEC_ID, - seriesKey: [], - datum: [1, 5], + accessor: 'y1', + x: 1, + y: 5, }, geometryId: { specId: SPEC_ID, @@ -303,9 +303,9 @@ describe('Rendering bars', () => { height: 50, color: 'red', value: { - specId: spec1Id, - seriesKey: [], - datum: [0, 10], + accessor: 'y1', + x: 0, + y: 10, }, geometryId: { specId: spec1Id, @@ -319,9 +319,9 @@ describe('Rendering bars', () => { height: 25, color: 'red', value: { - specId: spec1Id, - seriesKey: [], - datum: [1, 5], + accessor: 'y1', + x: 1, + y: 5, }, geometryId: { specId: spec1Id, @@ -347,9 +347,9 @@ describe('Rendering bars', () => { height: 100, color: 'blue', value: { - specId: spec2Id, - seriesKey: [], - datum: [0, 20], + accessor: 'y1', + x: 0, + y: 20, }, geometryId: { specId: spec2Id, @@ -363,9 +363,9 @@ describe('Rendering bars', () => { height: 50, color: 'blue', value: { - specId: spec2Id, - seriesKey: [], - datum: [1, 10], + accessor: 'y1', + x: 1, + y: 10, }, geometryId: { specId: spec2Id, @@ -424,9 +424,9 @@ describe('Rendering bars', () => { height: 50, color: 'red', value: { - specId: spec1Id, - seriesKey: [], - datum: [1546300800000, 10], + accessor: 'y1', + x: 1546300800000, + y: 10, }, geometryId: { specId: spec1Id, @@ -440,9 +440,9 @@ describe('Rendering bars', () => { height: 25, color: 'red', value: { - specId: spec1Id, - seriesKey: [], - datum: [1546387200000, 5], + accessor: 'y1', + x: 1546387200000, + y: 5, }, geometryId: { specId: spec1Id, @@ -468,9 +468,9 @@ describe('Rendering bars', () => { height: 100, color: 'blue', value: { - specId: spec2Id, - seriesKey: [], - datum: [1546300800000, 20], + accessor: 'y1', + x: 1546300800000, + y: 20, }, geometryId: { specId: spec2Id, @@ -484,9 +484,9 @@ describe('Rendering bars', () => { height: 50, color: 'blue', value: { - specId: spec2Id, - seriesKey: [], - datum: [1546387200000, 10], + accessor: 'y1', + x: 1546387200000, + y: 10, }, geometryId: { specId: spec2Id, diff --git a/packages/osd-charts/src/lib/series/rendering.lines.test.ts b/packages/osd-charts/src/lib/series/rendering.lines.test.ts index 717d089b77b8..30a5b69c8856 100644 --- a/packages/osd-charts/src/lib/series/rendering.lines.test.ts +++ b/packages/osd-charts/src/lib/series/rendering.lines.test.ts @@ -2,7 +2,7 @@ import { computeSeriesDomains } from '../../state/utils'; import { getGroupId, getSpecId } from '../utils/ids'; import { ScaleType } from '../utils/scales/scales'; import { CurveType } from './curves'; -import { IndexedGeometry, LineGeometry, renderLine } from './rendering'; +import { IndexedGeometry, LineGeometry, PointGeometry, renderLine } from './rendering'; import { computeXScale, computeYScales } from './scales'; import { LineSeriesSpec } from './specs'; const SPEC_ID = getSpecId('spec_1'); @@ -40,6 +40,7 @@ describe('Rendering points - line', () => { 'red', CurveType.LINEAR, SPEC_ID, + false, [], ); }); @@ -60,31 +61,41 @@ describe('Rendering points - line', () => { expect(points[0]).toEqual({ x: 0, y: 0, + radius: 10, color: 'red', - value: { + geometryId: { specId: SPEC_ID, seriesKey: [], - datum: [0, 10], + }, + value: { + accessor: 'y1', + x: 0, + y: 10, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 50, y: 50, + radius: 10, color: 'red', - value: { + geometryId: { specId: SPEC_ID, seriesKey: [], - datum: [1, 5], + }, + value: { + accessor: 'y1', + x: 1, + y: 5, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -138,6 +149,7 @@ describe('Rendering points - line', () => { 'red', CurveType.LINEAR, spec1Id, + false, [], ); secondLine = renderLine( @@ -148,6 +160,7 @@ describe('Rendering points - line', () => { 'blue', CurveType.LINEAR, spec2Id, + false, [], ); }); @@ -174,31 +187,41 @@ describe('Rendering points - line', () => { expect(points[0]).toEqual({ x: 0, y: 50, + radius: 10, color: 'red', - value: { + geometryId: { specId: spec1Id, seriesKey: [], - datum: [0, 10], + }, + value: { + accessor: 'y1', + x: 0, + y: 10, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 50, y: 75, color: 'red', - value: { + radius: 10, + geometryId: { specId: spec1Id, seriesKey: [], - datum: [1, 5], + }, + value: { + accessor: 'y1', + x: 1, + y: 5, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); test('can render second spec points', () => { @@ -211,30 +234,40 @@ describe('Rendering points - line', () => { x: 0, y: 0, color: 'blue', - value: { + radius: 10, + geometryId: { specId: spec2Id, seriesKey: [], - datum: [0, 20], + }, + value: { + accessor: 'y1', + x: 0, + y: 20, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 50, y: 50, color: 'blue', - value: { + radius: 10, + geometryId: { specId: spec2Id, seriesKey: [], - datum: [1, 10], + }, + value: { + accessor: 'y1', + x: 1, + y: 10, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -270,6 +303,7 @@ describe('Rendering points - line', () => { 'red', CurveType.LINEAR, SPEC_ID, + false, [], ); }); @@ -289,30 +323,40 @@ describe('Rendering points - line', () => { x: 0, y: 0, color: 'red', - value: { + radius: 10, + geometryId: { specId: SPEC_ID, seriesKey: [], - datum: [0, 10], + }, + value: { + accessor: 'y1', + x: 0, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 100, y: 50, color: 'red', - value: { + radius: 10, + geometryId: { specId: SPEC_ID, seriesKey: [], - datum: [1, 5], + }, + value: { + accessor: 'y1', + x: 1, + y: 5, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -366,6 +410,7 @@ describe('Rendering points - line', () => { 'red', CurveType.LINEAR, spec1Id, + false, [], ); secondLine = renderLine( @@ -376,6 +421,7 @@ describe('Rendering points - line', () => { 'blue', CurveType.LINEAR, spec2Id, + false, [], ); }); @@ -401,31 +447,41 @@ describe('Rendering points - line', () => { expect(points[0]).toEqual({ x: 0, y: 50, + radius: 10, color: 'red', - value: { + geometryId: { specId: spec1Id, seriesKey: [], - datum: [0, 10], + }, + value: { + accessor: 'y1', + x: 0, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 100, y: 75, + radius: 10, color: 'red', - value: { + geometryId: { specId: spec1Id, seriesKey: [], - datum: [1, 5], + }, + value: { + accessor: 'y1', + x: 1, + y: 5, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); test('can render second spec points', () => { @@ -438,30 +494,40 @@ describe('Rendering points - line', () => { x: 0, y: 0, color: 'blue', - value: { + radius: 10, + geometryId: { specId: spec2Id, seriesKey: [], - datum: [0, 20], + }, + value: { + accessor: 'y1', + x: 0, + y: 20, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 100, y: 50, color: 'blue', - value: { + radius: 10, + geometryId: { specId: spec2Id, seriesKey: [], - datum: [1, 10], + }, + value: { + accessor: 'y1', + x: 1, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -497,6 +563,7 @@ describe('Rendering points - line', () => { 'red', CurveType.LINEAR, SPEC_ID, + false, [], ); }); @@ -515,31 +582,41 @@ describe('Rendering points - line', () => { expect(points[0]).toEqual({ x: 0, y: 0, + radius: 10, color: 'red', - value: { + geometryId: { specId: SPEC_ID, seriesKey: [], - datum: [1546300800000, 10], + }, + value: { + accessor: 'y1', + x: 1546300800000, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 100, y: 50, + radius: 10, color: 'red', - value: { + geometryId: { specId: SPEC_ID, seriesKey: [], - datum: [1546387200000, 5], + }, + value: { + accessor: 'y1', + x: 1546387200000, + y: 5, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -593,6 +670,7 @@ describe('Rendering points - line', () => { 'red', CurveType.LINEAR, spec1Id, + false, [], ); secondLine = renderLine( @@ -603,6 +681,7 @@ describe('Rendering points - line', () => { 'blue', CurveType.LINEAR, spec2Id, + false, [], ); }); @@ -615,31 +694,41 @@ describe('Rendering points - line', () => { expect(points[0]).toEqual({ x: 0, y: 50, + radius: 10, color: 'red', - value: { + geometryId: { specId: spec1Id, seriesKey: [], - datum: [1546300800000, 10], + }, + value: { + accessor: 'y1', + x: 1546300800000, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 100, y: 75, + radius: 10, color: 'red', - value: { + geometryId: { specId: spec1Id, seriesKey: [], - datum: [1546387200000, 5], + }, + value: { + accessor: 'y1', + x: 1546387200000, + y: 5, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); test('can render second spec points', () => { @@ -651,31 +740,41 @@ describe('Rendering points - line', () => { expect(points[0]).toEqual({ x: 0, y: 0, + radius: 10, color: 'blue', - value: { + geometryId: { specId: spec2Id, seriesKey: [], - datum: [1546300800000, 20], + }, + value: { + accessor: 'y1', + x: 1546300800000, + y: 20, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(points[1]).toEqual({ x: 100, y: 50, + radius: 10, color: 'blue', - value: { + geometryId: { specId: spec2Id, seriesKey: [], - datum: [1546387200000, 10], + }, + value: { + accessor: 'y1', + x: 1546387200000, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -711,6 +810,7 @@ describe('Rendering points - line', () => { 'red', CurveType.LINEAR, SPEC_ID, + false, [], ); }); @@ -729,25 +829,18 @@ describe('Rendering points - line', () => { } = renderedLine; // all the points minus the undefined ones on a log scale expect(points.length).toBe(7); - // all the points - expect(indexedGeometries.size).toEqual(9); - const nullIndexdGeometry = indexedGeometries.get(2); - expect(nullIndexdGeometry).toBeDefined(); - expect(nullIndexdGeometry!.length).toBe(1); - // moved to the bottom of the chart - expect(nullIndexdGeometry![0].geom.y).toBe(100); - // 0 radius point - expect(nullIndexdGeometry![0].geom.width).toBe(0); - expect(nullIndexdGeometry![0].geom.height).toBe(0); + // all the points expect null geometries + expect(indexedGeometries.size).toEqual(8); + const nullIndexdGeometry = indexedGeometries.get(2)!; + expect(nullIndexdGeometry).toBeUndefined(); - const zeroValueIndexdGeometry = indexedGeometries.get(5); + const zeroValueIndexdGeometry = indexedGeometries.get(5)!; expect(zeroValueIndexdGeometry).toBeDefined(); - expect(zeroValueIndexdGeometry!.length).toBe(1); + expect(zeroValueIndexdGeometry.length).toBe(1); // moved to the bottom of the chart - expect(zeroValueIndexdGeometry![0].geom.y).toBe(100); + expect((zeroValueIndexdGeometry[0] as PointGeometry).y).toBe(100); // 0 radius point - expect(zeroValueIndexdGeometry![0].geom.width).toBe(0); - expect(zeroValueIndexdGeometry![0].geom.height).toBe(0); + expect((zeroValueIndexdGeometry[0] as PointGeometry).radius).toBe(0); }); }); }); diff --git a/packages/osd-charts/src/lib/series/rendering.test.ts b/packages/osd-charts/src/lib/series/rendering.test.ts index 9f72eae48106..57c2cd0d29b2 100644 --- a/packages/osd-charts/src/lib/series/rendering.test.ts +++ b/packages/osd-charts/src/lib/series/rendering.test.ts @@ -1,14 +1,23 @@ -import { IndexedGeometry, isPointOnGeometry } from './rendering'; +import { getSpecId } from '../utils/ids'; +import { BarGeometry, isPointOnGeometry, PointGeometry } from './rendering'; describe('Rendering utils', () => { test('check if point is in geometry', () => { - const geometry = { - geom: { + const geometry: BarGeometry = { + color: 'red', + geometryId: { + seriesKey: [], + specId: getSpecId('id'), + }, + value: { + accessor: 'y1', x: 0, y: 0, - width: 10, - height: 10, }, + x: 0, + y: 0, + width: 10, + height: 10, }; expect(isPointOnGeometry(0, 0, geometry)).toBe(true); expect(isPointOnGeometry(10, 10, geometry)).toBe(true); @@ -19,14 +28,24 @@ describe('Rendering utils', () => { expect(isPointOnGeometry(11, 11, geometry)).toBe(false); }); test('check if point is in point geometry', () => { - const geometry: Pick = { - geom: { + const geometry: PointGeometry = { + color: 'red', + geometryId: { + seriesKey: [], + specId: getSpecId('id'), + }, + value: { + accessor: 'y1', + x: 0, + y: 0, + }, + transform: { x: 0, y: 0, - width: 10, - height: 10, - isPoint: true, }, + x: 0, + y: 0, + radius: 10, }; expect(isPointOnGeometry(0, 0, geometry)).toBe(true); expect(isPointOnGeometry(10, 10, geometry)).toBe(true); diff --git a/packages/osd-charts/src/lib/series/rendering.ts b/packages/osd-charts/src/lib/series/rendering.ts index 6d3e20429356..ebe78c457162 100644 --- a/packages/osd-charts/src/lib/series/rendering.ts +++ b/packages/osd-charts/src/lib/series/rendering.ts @@ -14,8 +14,10 @@ export interface GeometryId { seriesKey: any[]; } -export interface GeometryValue extends GeometryId { - datum: any; +export interface GeometryValue { + y: any; + x: any; + accessor: 'y1' | 'y0'; } /** Shared style properties for varies geometries */ @@ -23,26 +25,19 @@ export interface GeometryStyle { opacity: number; } -export interface IndexedGeometry extends GeometryValue { - color: string; - geom: { - x: number; - y: number; - width: number; - height: number; - isPoint?: true; - }; -} +export type IndexedGeometry = PointGeometry | BarGeometry; export interface PointGeometry { x: number; y: number; + radius: number; color: string; - value: GeometryValue; transform: { x: number; y: number; }; + geometryId: GeometryId; + value: GeometryValue; } export interface BarGeometry { x: number; @@ -50,8 +45,8 @@ export interface BarGeometry { width: number; height: number; color: string; - value: GeometryValue; geometryId: GeometryId; + value: GeometryValue; } export interface LineGeometry { line: string; @@ -65,7 +60,7 @@ export interface LineGeometry { } export interface AreaGeometry { area: string; - line: string; + lines: string[]; points: PointGeometry[]; color: string; transform: { @@ -75,6 +70,13 @@ export interface AreaGeometry { geometryId: GeometryId; } +export function isPointGeometry(ig: IndexedGeometry): ig is PointGeometry { + return ig.hasOwnProperty('radius'); +} +export function isBarGeometry(ig: IndexedGeometry): ig is BarGeometry { + return ig.hasOwnProperty('width') && ig.hasOwnProperty('height'); +} + export function renderPoints( shift: number, dataset: DataSeriesDatum[], @@ -82,6 +84,7 @@ export function renderPoints( yScale: Scale, color: string, specId: SpecId, + hasY0Accessors: boolean, seriesKey: any[], ): { pointGeometries: PointGeometry[]; @@ -93,48 +96,52 @@ export function renderPoints( const pointGeometries = dataset.reduce( (acc, datum) => { const x = xScale.scale(datum.x); - let y; - let radius = 10; - const isHidden = datum.y1 === null || (isLogScale && datum.y1 <= 0); - // we fix 0 and negative values at y = 0 - if (isHidden) { - y = yScale.range[0]; - radius = 0; - } else { - y = yScale.scale(datum.y1); + const points: PointGeometry[] = []; + const yDatums = [datum.y1]; + if (hasY0Accessors) { + yDatums.unshift(datum.y0); } - const indexedGeometry: IndexedGeometry = { - specId, - datum: datum.datum, - color, - seriesKey, - geom: { - x: x + shift, + yDatums.forEach((yDatum, index) => { + // skip rendering point if y1 is null + if (datum.y1 === null) { + return; + } + let y; + let radius = 10; + const isHidden = yDatum === null || (isLogScale && yDatum <= 0); + // we fix 0 and negative values at y = 0 + if (isHidden) { + y = yScale.range[0]; + radius = 0; + } else { + y = yScale.scale(yDatum); + } + const originalY = hasY0Accessors && index === 0 ? datum.initialY0 : datum.initialY1; + const pointGeometry: PointGeometry = { + radius, + x, y, - width: radius, - height: radius, - isPoint: true, - }, - }; - mutableIndexedGeometryMapUpsert(indexedGeometries, datum.x, indexedGeometry); - const pointGeometry: PointGeometry = { - x, - y, - color, - value: { - specId, - datum: datum.datum, - seriesKey, - }, - transform: { - x: shift, - y: 0, - }, - }; - if (isHidden) { - return acc; - } - return [...acc, pointGeometry]; + color, + value: { + x: datum.x, + y: originalY, + accessor: hasY0Accessors && index === 0 ? 'y0' : 'y1', + }, + transform: { + x: shift, + y: 0, + }, + geometryId: { + specId, + seriesKey, + }, + }; + mutableIndexedGeometryMapUpsert(indexedGeometries, datum.x, pointGeometry); + if (!isHidden) { + points.push(pointGeometry); + } + }); + return [...acc, ...points]; }, [] as PointGeometry[], ); @@ -161,8 +168,12 @@ export function renderBars( const xScaleType = xScale.type; const barGeometries: BarGeometry[] = []; dataset.forEach((datum) => { - const { y0, y1 } = datum; - + const { y0, y1, initialY1 } = datum; + // don't create a bar if the initialY1 value is null. + if (initialY1 === null) { + return; + } + // don't create a bar if the x value is not part of the ordinal scale if (xScaleType === ScaleType.Ordinal && !xDomain.includes(datum.x)) { return; } @@ -184,35 +195,23 @@ export function renderBars( } const x = xScale.scale(datum.x) + xScale.bandwidth * orderIndex; const width = xScale.bandwidth; - const indexedGeometry: IndexedGeometry = { - specId, - datum: datum.datum, - geom: { - x, - y, - width, - height, - }, - color, - seriesKey, - }; - mutableIndexedGeometryMapUpsert(indexedGeometries, datum.x, indexedGeometry); - const barGeometry = { + const barGeometry: BarGeometry = { x, y, // top most value width, height, color, value: { - specId, - datum: datum.datum, - seriesKey, + x: datum.x, + y: initialY1, + accessor: 'y1', }, geometryId: { specId, seriesKey, }, }; + mutableIndexedGeometryMapUpsert(indexedGeometries, datum.x, barGeometry); barGeometries.push(barGeometry); }); return { @@ -229,6 +228,7 @@ export function renderLine( color: string, curve: CurveType, specId: SpecId, + hasY0Accessors: boolean, seriesKey: any[], ): { lineGeometry: LineGeometry; @@ -250,6 +250,7 @@ export function renderLine( yScale, color, specId, + hasY0Accessors, seriesKey, ); const lineGeometry = { @@ -279,6 +280,7 @@ export function renderArea( color: string, curve: CurveType, specId: SpecId, + hasY0Accessors: boolean, seriesKey: any[], ): { areaGeometry: AreaGeometry; @@ -290,29 +292,47 @@ export function renderArea( .x((datum: DataSeriesDatum) => xScale.scale(datum.x)) .y1((datum: DataSeriesDatum) => yScale.scale(datum.y1)) .y0((datum: DataSeriesDatum) => { - if (isLogScale && datum.y0 <= 0) { + if (datum.y0 === null || (isLogScale && datum.y0 <= 0)) { return yScale.range[0]; } return yScale.scale(datum.y0); }) .defined((datum: DataSeriesDatum) => datum.y1 !== null && !(isLogScale && datum.y1 <= 0)) .curve(getCurveFactory(curve)); - const { lineGeometry, indexedGeometries } = renderLine( + + const y1Line = pathGenerator.lineY1()(dataset); + + const lines: string[] = []; + if (y1Line) { + lines.push(y1Line); + } + if (hasY0Accessors) { + const y0Line = pathGenerator.lineY0()(dataset); + if (y0Line) { + lines.push(y0Line); + } + } + + const { pointGeometries, indexedGeometries } = renderPoints( shift, dataset, xScale, yScale, color, - curve, specId, + hasY0Accessors, seriesKey, ); + const areaGeometry = { area: pathGenerator(dataset) || '', - line: lineGeometry.line, - points: lineGeometry.points, + lines, + points: pointGeometries, color, - transform: lineGeometry.transform, + transform: { + y: 0, + x: shift, + }, geometryId: { specId, seriesKey, @@ -347,14 +367,23 @@ export function getGeometryStyle( return sharedStyle.default; } -export function isPointOnGeometry(x: number, y: number, { geom }: Pick) { - if (geom.isPoint) { +export function isPointOnGeometry( + xCoordinate: number, + yCoordinate: number, + indexedGeometry: BarGeometry | PointGeometry, +) { + const { x, y } = indexedGeometry; + if (isPointGeometry(indexedGeometry)) { + const { radius, transform } = indexedGeometry; return ( - y >= geom.y - geom.height && - y <= geom.y + geom.height && - x >= geom.x - geom.width && - x <= geom.x + geom.width + yCoordinate >= y - radius && + yCoordinate <= y + radius && + xCoordinate >= x + transform.x - radius && + xCoordinate <= x + transform.x + radius ); } - return y >= geom.y && y <= geom.y + geom.height && x >= geom.x && x <= geom.x + geom.width; + const { width, height } = indexedGeometry; + return ( + yCoordinate >= y && yCoordinate <= y + height && xCoordinate >= x && xCoordinate <= x + width + ); } diff --git a/packages/osd-charts/src/lib/series/scales.test.ts b/packages/osd-charts/src/lib/series/scales.test.ts index 7693282fc64d..fcef4db3fcdb 100644 --- a/packages/osd-charts/src/lib/series/scales.test.ts +++ b/packages/osd-charts/src/lib/series/scales.test.ts @@ -58,7 +58,6 @@ describe('Series scales', () => { groupId: getGroupId('g1'), dataSeries: [], counts: { - basicSeries: 14, areaSeries: 10, barSeries: 2, lineSeries: 2, @@ -68,7 +67,6 @@ describe('Series scales', () => { groupId: getGroupId('g2'), dataSeries: [], counts: { - basicSeries: 14, areaSeries: 10, barSeries: 20, lineSeries: 2, @@ -78,7 +76,6 @@ describe('Series scales', () => { groupId: getGroupId('g3'), dataSeries: [], counts: { - basicSeries: 14, areaSeries: 10, barSeries: 0, lineSeries: 2, @@ -90,7 +87,6 @@ describe('Series scales', () => { groupId: getGroupId('g1'), dataSeries: [], counts: { - basicSeries: 14, areaSeries: 10, barSeries: 5, lineSeries: 2, @@ -100,7 +96,6 @@ describe('Series scales', () => { groupId: getGroupId('g2'), dataSeries: [], counts: { - basicSeries: 14, areaSeries: 10, barSeries: 7, lineSeries: 2, diff --git a/packages/osd-charts/src/lib/series/series.test.ts b/packages/osd-charts/src/lib/series/series.test.ts index 2e666ea1c6d5..884cd3db3f3e 100644 --- a/packages/osd-charts/src/lib/series/series.test.ts +++ b/packages/osd-charts/src/lib/series/series.test.ts @@ -3,7 +3,6 @@ import { getGroupId, getSpecId, SpecId } from '../utils/ids'; import { ScaleType } from '../utils/scales/scales'; import { DataSeriesColorsValues, - formatStackedDataSeriesValues, getFormattedDataseries, getSeriesColorMap, getSortedDataSeriesColorsValuesMap, @@ -12,6 +11,7 @@ import { splitSeries, } from './series'; import { BasicSeriesSpec } from './specs'; +import { formatStackedDataSeriesValues } from './stacked_series_utils'; import * as TestDataset from './utils/test_dataset'; describe('Series', () => { @@ -91,13 +91,13 @@ describe('Series', () => { specId: getSpecId('spec1'), key: ['a'], seriesColorKey: 'a', - data: [{ x: 1, y: 1 }, { x: 2, y: 2 }, { x: 4, y: 4 }], + data: [{ x: 1, y1: 1 }, { x: 2, y1: 2 }, { x: 4, y1: 4 }], }, { specId: getSpecId('spec1'), key: ['b'], seriesColorKey: 'b', - data: [{ x: 1, y: 21 }, { x: 3, y: 23 }], + data: [{ x: 1, y1: 21 }, { x: 3, y1: 23 }], }, ]; const stackedValues = formatStackedDataSeriesValues(dataSeries, false); @@ -109,25 +109,25 @@ describe('Series', () => { specId: getSpecId('spec1'), key: ['a'], seriesColorKey: 'a', - data: [{ x: 1, y: 1 }, { x: 2, y: 2 }, { x: 3, y: 3 }, { x: 4, y: 4 }], + data: [{ x: 1, y1: 1 }, { x: 2, y1: 2 }, { x: 3, y1: 3 }, { x: 4, y1: 4 }], }, { specId: getSpecId('spec1'), key: ['b'], seriesColorKey: 'b', - data: [{ x: 1, y: 1 }, { x: 2, y: 2 }, { x: 3, y: 3 }, { x: 4, y: 4 }], + data: [{ x: 1, y1: 1 }, { x: 2, y1: 2 }, { x: 3, y1: 3 }, { x: 4, y1: 4 }], }, { specId: getSpecId('spec1'), key: ['b'], seriesColorKey: 'b', - data: [{ x: 1, y: 1 }, { x: 2, y: 2 }, { x: 3, y: 3 }, { x: 4, y: 4 }], + data: [{ x: 1, y1: 1 }, { x: 2, y1: 2 }, { x: 3, y1: 3 }, { x: 4, y1: 4 }], }, { specId: getSpecId('spec1'), key: ['b'], seriesColorKey: 'b', - data: [{ x: 1, y: 1 }, { x: 2, y: 2 }, { x: 3, y: 3 }, { x: 4, y: 4 }], + data: [{ x: 1, y1: 1 }, { x: 2, y1: 2 }, { x: 3, y1: 3 }, { x: 4, y1: 4 }], }, ]; const stackedValues = formatStackedDataSeriesValues(dataSeries, false); @@ -139,13 +139,13 @@ describe('Series', () => { specId: getSpecId('spec1'), key: ['a'], seriesColorKey: 'a', - data: [{ x: 1, y: 1 }, { x: 4, y: 4 }, { x: 2, y: 2 }], + data: [{ x: 1, y1: 1 }, { x: 4, y1: 4 }, { x: 2, y1: 2 }], }, { specId: getSpecId('spec1'), key: ['b'], seriesColorKey: 'b', - data: [{ x: 3, y: 23 }, { x: 1, y: 21 }], + data: [{ x: 3, y1: 23 }, { x: 1, y1: 21 }], }, ]; const stackedValues = formatStackedDataSeriesValues(dataSeries, false); @@ -158,18 +158,141 @@ describe('Series', () => { specId: getSpecId('spec1'), key: ['a'], seriesColorKey: 'a', - data: new Array(maxArrayItems).fill(0).map((d, i) => ({ x: i, y: i })), + data: new Array(maxArrayItems).fill(0).map((d, i) => ({ x: i, y1: i })), }, { specId: getSpecId('spec1'), key: ['b'], seriesColorKey: 'b', - data: new Array(maxArrayItems).fill(0).map((d, i) => ({ x: i, y: i })), + data: new Array(maxArrayItems).fill(0).map((d, i) => ({ x: i, y1: i })), }, ]; const stackedValues = formatStackedDataSeriesValues(dataSeries, false); expect(stackedValues).toMatchSnapshot(); }); + test('Can stack simple dataseries with scale to extent', () => { + const dataSeries: RawDataSeries[] = [ + { + specId: getSpecId('spec1'), + key: ['a'], + seriesColorKey: 'a', + data: [{ x: 1, y1: 1 }, { x: 2, y1: 2 }, { x: 4, y1: 4 }], + }, + { + specId: getSpecId('spec1'), + key: ['b'], + seriesColorKey: 'b', + data: [{ x: 1, y1: 21 }, { x: 3, y1: 23 }], + }, + ]; + const stackedValues = formatStackedDataSeriesValues(dataSeries, true); + // the datum on the snapshots is undefined because we are not adding it to + // the test raw dataseries + expect(stackedValues).toMatchSnapshot(); + }); + test('Can stack multiple dataseries with scale to extent', () => { + const dataSeries: RawDataSeries[] = [ + { + specId: getSpecId('spec1'), + key: ['a'], + seriesColorKey: 'a', + data: [{ x: 1, y1: 1 }, { x: 2, y1: 2 }, { x: 3, y1: 3 }, { x: 4, y1: 4 }], + }, + { + specId: getSpecId('spec1'), + key: ['b'], + seriesColorKey: 'b', + data: [{ x: 1, y1: 1 }, { x: 2, y1: 2 }, { x: 3, y1: 3 }, { x: 4, y1: 4 }], + }, + { + specId: getSpecId('spec1'), + key: ['b'], + seriesColorKey: 'b', + data: [{ x: 1, y1: 1 }, { x: 2, y1: 2 }, { x: 3, y1: 3 }, { x: 4, y1: 4 }], + }, + { + specId: getSpecId('spec1'), + key: ['b'], + seriesColorKey: 'b', + data: [{ x: 1, y1: 1 }, { x: 2, y1: 2 }, { x: 3, y1: 3 }, { x: 4, y1: 4 }], + }, + ]; + const stackedValues = formatStackedDataSeriesValues(dataSeries, true); + // the datum on the snapshots is undefined because we are not adding it to + // the test raw dataseries + expect(stackedValues).toMatchSnapshot(); + }); + test('Can stack simple dataseries with y0', () => { + const dataSeries: RawDataSeries[] = [ + { + specId: getSpecId('spec1'), + key: ['a'], + seriesColorKey: 'a', + data: [{ x: 1, y1: 3, y0: 1 }, { x: 2, y1: 3, y0: 2 }, { x: 4, y1: 4, y0: 3 }], + }, + { + specId: getSpecId('spec1'), + key: ['b'], + seriesColorKey: 'b', + data: [ + { x: 1, y1: 2, y0: 1 }, + { x: 2, y1: 3, y0: 1 }, + { x: 3, y1: 23, y0: 4 }, + { x: 4, y1: 4, y0: 1 }, + ], + }, + ]; + const stackedValues = formatStackedDataSeriesValues(dataSeries, true); + // the datum on the snapshots is undefined because we are not adding it to + // the test raw dataseries + + expect(stackedValues[0].data[0].y0).toBe(1); + expect(stackedValues[0].data[0].y1).toBe(3); + expect(stackedValues[0].data[0].initialY0).toBe(1); + expect(stackedValues[0].data[0].initialY1).toBe(3); + + expect(stackedValues[1].data[0].y0).toBe(4); + expect(stackedValues[1].data[0].y1).toBe(5); + expect(stackedValues[1].data[0].initialY0).toBe(1); + expect(stackedValues[1].data[0].initialY1).toBe(2); + + expect(stackedValues).toMatchSnapshot(); + }); + test('Can stack simple dataseries with scale to extent with y0', () => { + const dataSeries: RawDataSeries[] = [ + { + specId: getSpecId('spec1'), + key: ['a'], + seriesColorKey: 'a', + data: [{ x: 1, y1: 3, y0: 1 }, { x: 2, y1: 3, y0: 2 }, { x: 4, y1: 4, y0: 3 }], + }, + { + specId: getSpecId('spec1'), + key: ['b'], + seriesColorKey: 'b', + data: [ + { x: 1, y1: 2, y0: 1 }, + { x: 2, y1: 3, y0: 1 }, + { x: 3, y1: 23, y0: 4 }, + { x: 4, y1: 4, y0: 1 }, + ], + }, + ]; + const stackedValues = formatStackedDataSeriesValues(dataSeries, true); + // the datum on the snapshots is undefined because we are not adding it to + // the test raw dataseries + expect(stackedValues[0].data[0].y0).toBe(1); + expect(stackedValues[0].data[0].y1).toBe(3); + expect(stackedValues[0].data[0].initialY0).toBe(1); + expect(stackedValues[0].data[0].initialY1).toBe(3); + + expect(stackedValues[1].data[0].y0).toBe(4); + expect(stackedValues[1].data[0].y1).toBe(5); + expect(stackedValues[1].data[0].initialY0).toBe(1); + expect(stackedValues[1].data[0].initialY1).toBe(2); + expect(stackedValues).toMatchSnapshot(); + }); + test('should split an array of specs into data series', () => { const seriesSpecs = new Map(); const spec1: BasicSeriesSpec = { @@ -310,10 +433,12 @@ describe('Series', () => { const emptyDeselected = getSplittedSeries(seriesSpecs, []); expect(emptyDeselected.splittedSeries.get(specId)!.length).toBe(2); - const deselectedDataSeries: DataSeriesColorsValues[] = [{ - specId, - colorValues: ['y1'], - }]; + const deselectedDataSeries: DataSeriesColorsValues[] = [ + { + specId, + colorValues: ['y1'], + }, + ]; const subsetSplit = getSplittedSeries(seriesSpecs, deselectedDataSeries); expect(subsetSplit.splittedSeries.get(specId)!.length).toBe(1); }); diff --git a/packages/osd-charts/src/lib/series/series.ts b/packages/osd-charts/src/lib/series/series.ts index 366db0f4e3af..720df2f57303 100644 --- a/packages/osd-charts/src/lib/series/series.ts +++ b/packages/osd-charts/src/lib/series/series.ts @@ -3,18 +3,32 @@ import { ColorConfig } from '../themes/theme'; import { Accessor } from '../utils/accessor'; import { GroupId, SpecId } from '../utils/ids'; import { splitSpecsByGroupId, YBasicSeriesSpec } from './domains/y_domain'; +import { formatNonStackedDataSeriesValues } from './nonstacked_series_utils'; import { BasicSeriesSpec, Datum, SeriesAccessors } from './specs'; +import { formatStackedDataSeriesValues } from './stacked_series_utils'; export interface RawDataSeriesDatum { + /** the x value */ x: number | string; - y: number; + /** the main y metric */ + y1: number | null; + /** the optional y0 metric, used for bars or area with a lower bound */ + y0?: number | null; + /** the datum */ datum?: any; } export interface DataSeriesDatum { x: number | string; - y0: number; - y1: number; + /** the max y value */ + y1: number | null; + /** the minimum y value */ + y0: number | null; + /** initial y1 value, non stacked */ + initialY1: number | null; + /** initial y0 value, non stacked */ + initialY0: number | null; + /** the datum */ datum?: any; } @@ -41,7 +55,6 @@ export interface DataSeriesCounts { barSeries: number; lineSeries: number; areaSeries: number; - basicSeries: number; } export interface DataSeriesColorsValues { @@ -65,7 +78,7 @@ export function splitSeries( xValues: Set; splitSeriesLastValues: Map; } { - const { xAccessor, yAccessors, splitSeriesAccessors = [] } = accessors; + const { xAccessor, yAccessors, y0Accessors, splitSeriesAccessors = [] } = accessors; const colorAccessors = accessors.colorAccessors ? accessors.colorAccessors : splitSeriesAccessors; const isMultipleY = yAccessors && yAccessors.length > 1; const series = new Map(); @@ -76,12 +89,17 @@ export function splitSeries( data.forEach((datum) => { const seriesKey = getAccessorsValues(datum, splitSeriesAccessors); if (isMultipleY) { - yAccessors.forEach((accessor) => { + yAccessors.forEach((accessor, index) => { const colorValues = getColorValues(datum, colorAccessors, accessor); const colorValuesKey = getColorValuesAsString(colorValues, specId); colorsValues.set(colorValuesKey, colorValues); - const cleanedDatum = cleanDatum(datum, xAccessor, accessor); - splitSeriesLastValues.set(colorValuesKey, cleanedDatum.y); + const cleanedDatum = cleanDatum( + datum, + xAccessor, + accessor, + y0Accessors && y0Accessors[index], + ); + splitSeriesLastValues.set(colorValuesKey, cleanedDatum.y1); xValues.add(cleanedDatum.x); updateSeriesMap(series, [...seriesKey, accessor], cleanedDatum, specId, colorValuesKey); }, {}); @@ -89,8 +107,13 @@ export function splitSeries( const colorValues = getColorValues(datum, colorAccessors); const colorValuesKey = getColorValuesAsString(colorValues, specId); colorsValues.set(colorValuesKey, colorValues); - const cleanedDatum = cleanDatum(datum, xAccessor, yAccessors[0]); - splitSeriesLastValues.set(colorValuesKey, cleanedDatum.y); + const cleanedDatum = cleanDatum( + datum, + xAccessor, + yAccessors[0], + y0Accessors && y0Accessors[0], + ); + splitSeriesLastValues.set(colorValuesKey, cleanedDatum.y1); xValues.add(cleanedDatum.x); updateSeriesMap(series, [...seriesKey], cleanedDatum, specId, colorValuesKey); } @@ -134,9 +157,11 @@ function updateSeriesMap( * Get the array of values that forms a series key */ function getAccessorsValues(datum: Datum, accessors: Accessor[] = []): any[] { - return accessors.map((accessor) => { - return datum[accessor]; - }); + return accessors + .map((accessor) => { + return datum[accessor]; + }) + .filter((value) => value !== undefined); } /** @@ -163,13 +188,21 @@ export function getColorValuesAsString(colorValues: any[], specId: SpecId): stri /** * Reformat the datum having only the required x and y property. */ -function cleanDatum(datum: Datum, xAccessor: Accessor, yAccessor: Accessor): RawDataSeriesDatum { +function cleanDatum( + datum: Datum, + xAccessor: Accessor, + yAccessor: Accessor, + y0Accessor?: Accessor, +): RawDataSeriesDatum { const x = datum[xAccessor]; - const y = datum[yAccessor]; - return { x, y, datum }; + const y1 = datum[yAccessor]; + const cleanedDatum: RawDataSeriesDatum = { x, y1, datum, y0: null }; + if (y0Accessor) { + cleanedDatum.y0 = datum[y0Accessor]; + } + return cleanedDatum; } -// TODO MISSING SCALE TO EXTENT export function getFormattedDataseries( specs: YBasicSeriesSpec[], dataSeries: Map, @@ -226,7 +259,6 @@ export function getRawDataSeries( barSeries: 0, lineSeries: 0, areaSeries: 0, - basicSeries: 0, }; const seriesSpecsCount = seriesSpecs.length; let i; @@ -244,9 +276,6 @@ export function getRawDataSeries( case 'area': counts.areaSeries += ds ? ds.length : 0; break; - case 'basic': - counts.basicSeries += ds ? ds.length : 0; - break; } if (ds) { @@ -259,96 +288,6 @@ export function getRawDataSeries( }; } -export function formatNonStackedDataSeriesValues( - dataseries: RawDataSeries[], - scaleToExtent: boolean, -): DataSeries[] { - const len = dataseries.length; - let i; - const formattedValues: DataSeries[] = []; - for (i = 0; i < len; i++) { - const formattedValue = formatNonStackedDataValues(dataseries[i], scaleToExtent); - formattedValues.push(formattedValue); - } - return formattedValues; -} - -export function formatNonStackedDataValues( - dataSeries: RawDataSeries, - scaleToExtent: boolean, -): DataSeries { - const len = dataSeries.data.length; - let i; - const formattedValues: DataSeries = { - key: dataSeries.key, - specId: dataSeries.specId, - seriesColorKey: dataSeries.seriesColorKey, - data: [], - }; - for (i = 0; i < len; i++) { - const value = dataSeries.data[i]; - const formattedValue = { - x: value.x, - y0: scaleToExtent ? value.y : 0, - y1: value.y, - datum: value.datum, - }; - formattedValues.data.push(formattedValue); - } - return formattedValues; -} - -export function formatStackedDataSeriesValues( - dataseries: RawDataSeries[], - scaleToExtent: boolean, -): DataSeries[] { - const stackMap = new Map(); - dataseries.forEach((ds, index) => { - ds.data.forEach((datum) => { - const stack = stackMap.get(datum.x) || new Array(dataseries.length).fill(0); - stack[index] = datum.y; - stackMap.set(datum.x, stack); - }); - }); - const stackedValues = new Map(); - stackMap.forEach((value, key) => { - const stackArray = value.reduce( - (stackedValue, currentValue, index) => { - if (stackedValue.length === 0) { - if (scaleToExtent) { - return [currentValue, currentValue]; - } - return [0, currentValue]; - } - return [...stackedValue, stackedValue[index] + currentValue]; - }, - [] as number[], - ); - stackedValues.set(key, stackArray); - }); - - const stackedDataSeries: DataSeries[] = dataseries.map((ds, index) => { - const newData = ds.data - .filter((datum) => stackedValues.get(datum.x) !== undefined) - .map((datum) => { - const stack = stackedValues.get(datum.x)!; - if (index === 0) { - return { x: datum.x, y0: scaleToExtent ? datum.y : 0, y1: datum.y, datum: datum.datum }; - } else { - return { x: datum.x, y0: stack[index], y1: stack[index] + datum.y, datum: datum.datum }; - } - }); - return { - specId: ds.specId, - key: ds.key, - seriesColorKey: ds.seriesColorKey, - data: newData, - }; - }); - - return stackedDataSeries; -} - export function getSplittedSeries( seriesSpecs: Map, deselectedDataSeries?: DataSeriesColorsValues[] | null, @@ -408,8 +347,10 @@ export function getSortedDataSeriesColorsValuesMap( const [, colorValuesA] = seriesA; const [, colorValuesB] = seriesB; - const specAIndex = colorValuesA.specSortIndex != null ? colorValuesA.specSortIndex : colorValuesMap.size; - const specBIndex = colorValuesB.specSortIndex != null ? colorValuesB.specSortIndex : colorValuesMap.size; + const specAIndex = + colorValuesA.specSortIndex != null ? colorValuesA.specSortIndex : colorValuesMap.size; + const specBIndex = + colorValuesB.specSortIndex != null ? colorValuesB.specSortIndex : colorValuesMap.size; return specAIndex - specBIndex; }); diff --git a/packages/osd-charts/src/lib/series/specs.ts b/packages/osd-charts/src/lib/series/specs.ts index c344c0a82d7a..99f61a18dbf4 100644 --- a/packages/osd-charts/src/lib/series/specs.ts +++ b/packages/osd-charts/src/lib/series/specs.ts @@ -54,6 +54,8 @@ export interface SeriesAccessors { xAccessor: Accessor; /** An array of field names one per y metric value */ yAccessors: Accessor[]; + /** An optional accessor of the y0 value: base point for area/bar charts */ + y0Accessors?: Accessor[]; /** An array of fields thats indicates the datum series membership */ splitSeriesAccessors?: Accessor[]; /** An array of fields thats indicates the stack membership */ diff --git a/packages/osd-charts/src/lib/series/stacked_series_utils.test.ts b/packages/osd-charts/src/lib/series/stacked_series_utils.test.ts new file mode 100644 index 000000000000..7366c9aa3db6 --- /dev/null +++ b/packages/osd-charts/src/lib/series/stacked_series_utils.test.ts @@ -0,0 +1,365 @@ +import { getSpecId } from '../utils/ids'; +import { RawDataSeries } from './series'; +import { + computeYStackedMapValues, + formatStackedDataSeriesValues, + getYValueStackMap, +} from './stacked_series_utils'; + +describe('Stacked Series Utils', () => { + const EMPTY_DATA_SET: RawDataSeries[] = [ + { + data: [], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec1'), + }, + ]; + const STANDARD_DATA_SET: RawDataSeries[] = [ + { + data: [ + { + x: 0, + y1: 10, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec1'), + }, + { + data: [ + { + x: 0, + y1: 20, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec2'), + }, + { + data: [ + { + x: 0, + y1: 30, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec3'), + }, + ]; + const WITH_NULL_DATASET: RawDataSeries[] = [ + { + data: [ + { + x: 0, + y1: 10, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec1'), + }, + { + data: [ + { + x: 0, + y1: null, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec2'), + }, + { + data: [ + { + x: 0, + y1: 30, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec3'), + }, + ]; + const STANDARD_DATA_SET_WY0: RawDataSeries[] = [ + { + data: [ + { + x: 0, + y0: 2, + y1: 10, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec1'), + }, + { + data: [ + { + x: 0, + y0: 4, + y1: 20, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec2'), + }, + { + data: [ + { + x: 0, + y0: 6, + y1: 30, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec3'), + }, + ]; + const WITH_NULL_DATASET_WY0: RawDataSeries[] = [ + { + data: [ + { + x: 0, + y0: 2, + y1: 10, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec1'), + }, + { + data: [ + { + x: 0, + y1: null, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec2'), + }, + { + data: [ + { + x: 0, + y0: 6, + y1: 30, + }, + ], + key: [], + seriesColorKey: 'color-key', + specId: getSpecId('spec3'), + }, + ]; + const DATA_SET_WITH_NULL_2: RawDataSeries[] = [ + { + specId: getSpecId('spec1'), + key: ['a'], + seriesColorKey: 'a', + data: [{ x: 1, y1: 1 }, { x: 2, y1: 2 }, { x: 4, y1: 4 }], + }, + { + specId: getSpecId('spec1'), + key: ['b'], + seriesColorKey: 'b', + data: [{ x: 1, y1: 21 }, { x: 3, y1: 23 }], + }, + ]; + describe('create stacked maps', () => { + test('with empty values', () => { + const stackedMap = getYValueStackMap(EMPTY_DATA_SET); + expect(stackedMap.size).toBe(0); + }); + test('with basic values', () => { + const stackedMap = getYValueStackMap(STANDARD_DATA_SET); + expect(stackedMap.size).toBe(1); + const x0StackArray = stackedMap.get(0)!; + expect(x0StackArray).toBeDefined(); + expect(x0StackArray.length).toBe(3); + expect(x0StackArray).toEqual([10, 20, 30]); + }); + test('with values with nulls', () => { + const stackedMap = getYValueStackMap(WITH_NULL_DATASET); + expect(stackedMap.size).toBe(1); + const x0StackArray = stackedMap.get(0)!; + expect(x0StackArray).toBeDefined(); + expect(x0StackArray.length).toBe(3); + expect(x0StackArray).toEqual([10, null, 30]); + }); + }); + describe('compute stacked arrays', () => { + test('with empty values', () => { + const stackedMap = getYValueStackMap(EMPTY_DATA_SET); + let computedStackedMap = computeYStackedMapValues(stackedMap, false); + expect(computedStackedMap.size).toBe(0); + computedStackedMap = computeYStackedMapValues(stackedMap, true); + expect(computedStackedMap.size).toBe(0); + }); + test('with basic values', () => { + const stackedMap = getYValueStackMap(STANDARD_DATA_SET); + const computedStackedMap = computeYStackedMapValues(stackedMap, false); + expect(computedStackedMap.size).toBe(1); + const x0Array = computedStackedMap.get(0)!; + expect(x0Array).toBeDefined(); + expect(x0Array).toEqual([0, 10, 30, 60]); + }); + test('with null values', () => { + const stackedMap = getYValueStackMap(WITH_NULL_DATASET); + const computedStackedMap = computeYStackedMapValues(stackedMap, false); + expect(computedStackedMap.size).toBe(1); + const x0Array = computedStackedMap.get(0)!; + expect(x0Array).toBeDefined(); + expect(x0Array).toEqual([0, 10, 10, 40]); + }); + }); + describe('Format stacked dataset', () => { + test('format data without nulls', () => { + const formattedData = formatStackedDataSeriesValues(STANDARD_DATA_SET, false); + expect(formattedData[0].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 10, + x: 0, + y0: 0, + y1: 10, + }); + expect(formattedData[1].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 20, + x: 0, + y0: 10, + y1: 30, + }); + expect(formattedData[2].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 30, + x: 0, + y0: 30, + y1: 60, + }); + }); + test('format data with nulls', () => { + const formattedData = formatStackedDataSeriesValues(WITH_NULL_DATASET, false); + expect(formattedData[1].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: null, + x: 0, + y1: null, + y0: null, + }); + }); + test('format data without nulls with y0 values', () => { + const formattedData = formatStackedDataSeriesValues(STANDARD_DATA_SET_WY0, false); + expect(formattedData[0].data[0]).toEqual({ + datum: undefined, + initialY0: 2, + initialY1: 10, + x: 0, + y0: 2, + y1: 10, + }); + expect(formattedData[1].data[0]).toEqual({ + datum: undefined, + initialY0: 4, + initialY1: 20, + x: 0, + y0: 14, + y1: 30, + }); + expect(formattedData[2].data[0]).toEqual({ + datum: undefined, + initialY0: 6, + initialY1: 30, + x: 0, + y0: 36, + y1: 60, + }); + }); + test('format data with nulls', () => { + const formattedData = formatStackedDataSeriesValues(WITH_NULL_DATASET_WY0, false); + expect(formattedData[0].data[0]).toEqual({ + datum: undefined, + initialY0: 2, + initialY1: 10, + x: 0, + y0: 2, + y1: 10, + }); + expect(formattedData[1].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: null, + x: 0, + y1: null, + y0: null, + }); + expect(formattedData[2].data[0]).toEqual({ + datum: undefined, + initialY0: 6, + initialY1: 30, + x: 0, + y0: 16, + y1: 40, + }); + }); + test('format data without nulls on second series', () => { + const formattedData = formatStackedDataSeriesValues(DATA_SET_WITH_NULL_2, false); + expect(formattedData.length).toBe(2); + expect(formattedData[0].data.length).toBe(3); + expect(formattedData[1].data.length).toBe(2); + + expect(formattedData[0].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 1, + x: 1, + y0: 0, + y1: 1, + }); + expect(formattedData[0].data[1]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 2, + x: 2, + y0: 0, + y1: 2, + }); + expect(formattedData[0].data[2]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 4, + x: 4, + y0: 0, + y1: 4, + }); + expect(formattedData[1].data[0]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 21, + x: 1, + y0: 1, + y1: 22, + }); + expect(formattedData[1].data[1]).toEqual({ + datum: undefined, + initialY0: null, + initialY1: 23, + x: 3, + y0: 0, + y1: 23, + }); + }); + }); +}); diff --git a/packages/osd-charts/src/lib/series/stacked_series_utils.ts b/packages/osd-charts/src/lib/series/stacked_series_utils.ts new file mode 100644 index 000000000000..8900cb2b887f --- /dev/null +++ b/packages/osd-charts/src/lib/series/stacked_series_utils.ts @@ -0,0 +1,113 @@ +import { DataSeries, DataSeriesDatum, RawDataSeries } from './series'; + +/** + * Map each y value from a RawDataSeries on it's specific x value into, + * ordering the stack based on the dataseries index. + * @param dataseries + */ +export function getYValueStackMap(dataseries: RawDataSeries[]): Map { + const stackMap = new Map(); + dataseries.forEach((ds, index) => { + ds.data.forEach((datum) => { + const stack = stackMap.get(datum.x) || new Array(dataseries.length).fill(0); + stack[index] = datum.y1; + stackMap.set(datum.x, stack); + }); + }); + return stackMap; +} + +/** + * For each key of the yValueStackMap, it stacks the values one after the other, + * summing the previous value to the next one. + * @param yValueStackMap + * @param scaleToExtent + */ +export function computeYStackedMapValues( + yValueStackMap: Map, + scaleToExtent: boolean, +): Map { + const stackedValues = new Map(); + + yValueStackMap.forEach((yStackArray, xValue) => { + const stackArray = yStackArray.reduce( + (stackedValue, currentValue, index) => { + if (stackedValue.length === 0) { + if (scaleToExtent) { + return [currentValue, currentValue]; + } + return [0, currentValue]; + } + return [...stackedValue, stackedValue[index] + currentValue]; + }, + [] as number[], + ); + stackedValues.set(xValue, stackArray); + }); + return stackedValues; +} + +export function formatStackedDataSeriesValues( + dataseries: RawDataSeries[], + scaleToExtent: boolean, +): DataSeries[] { + const yValueStackMap = getYValueStackMap(dataseries); + + const stackedValues = computeYStackedMapValues(yValueStackMap, scaleToExtent); + + const stackedDataSeries: DataSeries[] = dataseries.map((ds, seriesIndex) => { + const newData: DataSeriesDatum[] = []; + ds.data.forEach((data) => { + const { x, y1, datum } = data; + if (stackedValues.get(x) === undefined) { + return; + } + let computedY0: number | null; + if (scaleToExtent) { + computedY0 = data.y0 ? data.y0 : y1; + } else { + computedY0 = data.y0 ? data.y0 : 0; + } + const initialY0 = data.y0 == null ? null : data.y0; + if (seriesIndex === 0) { + newData.push({ + x, + y1, + y0: computedY0, + initialY1: y1, + initialY0, + datum, + }); + } else { + const stack = stackedValues.get(x); + if (!stack) { + return; + } + const stackY = stack[seriesIndex]; + const stackedY1 = y1 !== null ? stackY + y1 : null; + let stackedY0: number | null = data.y0 == null ? stackY : stackY + data.y0; + // configure null y0 if y1 is null + // it's semantically right to say y0 is null if y1 is null + if (stackedY1 === null) { + stackedY0 = null; + } + newData.push({ + x, + y1: stackedY1, + y0: stackedY0, + initialY1: y1, + initialY0, + datum, + }); + } + }); + return { + specId: ds.specId, + key: ds.key, + seriesColorKey: ds.seriesColorKey, + data: newData, + }; + }); + + return stackedDataSeries; +} diff --git a/packages/osd-charts/src/lib/series/tooltip.test.ts b/packages/osd-charts/src/lib/series/tooltip.test.ts new file mode 100644 index 000000000000..0522b6643a88 --- /dev/null +++ b/packages/osd-charts/src/lib/series/tooltip.test.ts @@ -0,0 +1,109 @@ +import { getAxisId, getGroupId, getSpecId } from '../utils/ids'; +import { ScaleType } from '../utils/scales/scales'; +import { BarGeometry } from './rendering'; +import { AxisSpec, BarSeriesSpec, Position } from './specs'; +import { formatTooltip } from './tooltip'; + +describe('Tooltip formatting', () => { + const SPEC_ID_1 = getSpecId('bar_1'); + const SPEC_GROUP_ID_1 = getGroupId('bar_group_1'); + const SPEC_1: BarSeriesSpec = { + id: SPEC_ID_1, + groupId: SPEC_GROUP_ID_1, + seriesType: 'bar', + data: [], + xAccessor: 0, + yAccessors: [1], + yScaleToDataExtent: false, + yScaleType: ScaleType.Linear, + xScaleType: ScaleType.Linear, + }; + const YAXIS_SPEC: AxisSpec = { + id: getAxisId('axis_1'), + groupId: SPEC_GROUP_ID_1, + hide: false, + position: Position.Left, + showOverlappingLabels: false, + showOverlappingTicks: false, + tickPadding: 0, + tickSize: 0, + tickFormat: (d) => `${d}`, + }; + const indexedGeometry: BarGeometry = { + x: 0, + y: 0, + width: 0, + height: 0, + color: 'blue', + geometryId: { + specId: SPEC_ID_1, + seriesKey: [], + }, + value: { + x: 1, + y: 10, + accessor: 'y1', + }, + }; + + test('format simple tooltip', () => { + const tooltipValue = formatTooltip(indexedGeometry, SPEC_1, false, false, YAXIS_SPEC); + expect(tooltipValue).toBeDefined(); + expect(tooltipValue.name).toBe('bar_1'); + expect(tooltipValue.isXValue).toBe(false); + expect(tooltipValue.isHighlighted).toBe(false); + expect(tooltipValue.color).toBe('blue'); + expect(tooltipValue.value).toBe('10'); + }); + test('format tooltip with seriesKey name', () => { + const geometry: BarGeometry = { + ...indexedGeometry, + geometryId: { + specId: SPEC_ID_1, + seriesKey: ['y1'], + }, + }; + const tooltipValue = formatTooltip(geometry, SPEC_1, false, false, YAXIS_SPEC); + expect(tooltipValue).toBeDefined(); + expect(tooltipValue.name).toBe('y1'); + expect(tooltipValue.isXValue).toBe(false); + expect(tooltipValue.isHighlighted).toBe(false); + expect(tooltipValue.color).toBe('blue'); + expect(tooltipValue.value).toBe('10'); + }); + test('format y0 tooltip', () => { + const geometry: BarGeometry = { + ...indexedGeometry, + value: { + ...indexedGeometry.value, + accessor: 'y0', + }, + }; + const tooltipValue = formatTooltip(geometry, SPEC_1, false, false, YAXIS_SPEC); + expect(tooltipValue).toBeDefined(); + expect(tooltipValue.name).toBe('bar_1'); + expect(tooltipValue.isXValue).toBe(false); + expect(tooltipValue.isHighlighted).toBe(false); + expect(tooltipValue.color).toBe('blue'); + expect(tooltipValue.value).toBe('10'); + }); + test('format x tooltip', () => { + const geometry: BarGeometry = { + ...indexedGeometry, + value: { + ...indexedGeometry.value, + accessor: 'y0', + }, + }; + let tooltipValue = formatTooltip(geometry, SPEC_1, true, false, YAXIS_SPEC); + expect(tooltipValue).toBeDefined(); + expect(tooltipValue.name).toBe('bar_1'); + expect(tooltipValue.isXValue).toBe(true); + expect(tooltipValue.isHighlighted).toBe(false); + expect(tooltipValue.color).toBe('blue'); + expect(tooltipValue.value).toBe('1'); + // disable any highlight on x value + tooltipValue = formatTooltip(geometry, SPEC_1, true, true, YAXIS_SPEC); + expect(tooltipValue.isHighlighted).toBe(false); + }); +}); diff --git a/packages/osd-charts/src/lib/series/tooltip.ts b/packages/osd-charts/src/lib/series/tooltip.ts index bb79d3ccb47d..801238aae44e 100644 --- a/packages/osd-charts/src/lib/series/tooltip.ts +++ b/packages/osd-charts/src/lib/series/tooltip.ts @@ -1,13 +1,9 @@ -import { Accessor } from '../utils/accessor'; -import { SpecId } from '../utils/ids'; import { TooltipValue } from '../utils/interactions'; import { IndexedGeometry } from './rendering'; import { getColorValuesAsString } from './series'; -import { AxisSpec, BasicSeriesSpec, Datum, TickFormatter } from './specs'; +import { AxisSpec, BasicSeriesSpec } from './specs'; -export function getSeriesTooltipValues( - tooltipValues: TooltipValue[], -): Map { +export function getSeriesTooltipValues(tooltipValues: TooltipValue[]): Map { // map from seriesKey to tooltipValue const seriesTooltipValues = new Map(); @@ -27,95 +23,35 @@ export function getSeriesTooltipValues( export function formatTooltip( searchIndexValue: IndexedGeometry, spec: BasicSeriesSpec, - color: string, + isXValue: boolean, isHighlighted: boolean, - yAxis?: AxisSpec, -): TooltipValue[] { - const { seriesKey, datum } = searchIndexValue; - let yAccessors = spec.yAccessors; - if (yAccessors.length > 1) { - // the last element of the seriesKey is the yAccessor - yAccessors = seriesKey.slice(-1); - } + axisSpec?: AxisSpec, +): TooltipValue { + const { id } = spec; + const { + color, + value: { x, y }, + geometryId: { seriesKey }, + } = searchIndexValue; + const seriesKeyAsString = getColorValuesAsString(seriesKey, id); let name: string | undefined; if (seriesKey.length > 0) { - name = searchIndexValue.seriesKey.join(' - '); + name = seriesKey.join(' - '); } else { name = spec.name || `${spec.id}`; } - // format y value - return formatAccessor( - spec.id, - seriesKey, - datum, - yAccessors, - color, - yAxis ? yAxis.tickFormat : emptyFormatter, - isHighlighted, - false, - name, - ); -} -/** - * Format the x value for the tooltip. - * Use the following sequence to get the name: - * 1. (series key combination if > 1 series) - * 2. use series id - */ -export function formatXTooltipValue( - searchIndexValue: IndexedGeometry, - spec: BasicSeriesSpec, - color: string, - xAxis?: AxisSpec, -): TooltipValue { - let name: string | undefined; - if (searchIndexValue.seriesKey.length > 0) { - name = searchIndexValue.seriesKey.join(' - '); - } else { - name = spec.name || `${spec.id}`; - } - const xValues = formatAccessor( - spec.id, - searchIndexValue.seriesKey, - searchIndexValue.datum, - [spec.xAccessor], - color, - xAxis ? xAxis.tickFormat : emptyFormatter, - false, // never highlighted - true, // always x value + const value = isXValue ? x : y; + return { + seriesKey: seriesKeyAsString, name, - ); - return xValues[0]; -} - -export function formatAccessor( - specId: SpecId, - seriesKeys: any[], - datum: Datum, - accessors: Accessor[] = [], - color: string, - formatter: TickFormatter, - isHighlighted: boolean, - isXValue: boolean, - name?: string, -): TooltipValue[] { - const seriesKey = getColorValuesAsString(seriesKeys, specId); - - return accessors.map( - (accessor): TooltipValue => { - return { - seriesKey, - name: name || `${accessor}`, - value: formatter(datum[accessor]), - color, - isHighlighted, - isXValue, - }; - }, - ); + value: axisSpec ? axisSpec.tickFormat(value) : emptyFormatter(value), + color, + isHighlighted: isXValue ? false : isHighlighted, + isXValue, + }; } -function emptyFormatter(value: any): any { - return value; +function emptyFormatter(value: any): string { + return `${value}`; } diff --git a/packages/osd-charts/src/lib/utils/interactions.test.ts b/packages/osd-charts/src/lib/utils/interactions.test.ts index de3e7a2fa571..85d5d92e7af6 100644 --- a/packages/osd-charts/src/lib/utils/interactions.test.ts +++ b/packages/osd-charts/src/lib/utils/interactions.test.ts @@ -1,4 +1,4 @@ -import { IndexedGeometry } from '../series/rendering'; +import { IndexedGeometry, PointGeometry } from '../series/rendering'; import { Dimensions } from './dimensions'; import { getSpecId } from './ids'; import { @@ -10,66 +10,105 @@ import { isFollowTooltipType, TooltipType, } from './interactions'; - const ig1: IndexedGeometry = { - specId: getSpecId('ig1'), color: 'red', - geom: { + geometryId: { + specId: getSpecId('ig1'), + seriesKey: [0, 1, 2], + }, + value: { + accessor: 'y1', x: 0, - y: 0, - width: 50, - height: 50, + y: 1, }, - datum: [0, 1, 2], - seriesKey: [0, 1, 2], + x: 0, + y: 0, + width: 50, + height: 50, }; const ig2: IndexedGeometry = { - specId: getSpecId('ig1'), - color: 'red', - geom: { + geometryId: { + specId: getSpecId('ig1'), + seriesKey: [0, 1, 2], + }, + value: { + accessor: 'y1', x: 0, - y: 0, - width: 10, - height: 10, + y: 1, }, - datum: [0, 1, 2], - seriesKey: [0, 1, 2], + color: 'red', + x: 0, + y: 0, + width: 10, + height: 10, }; const ig3: IndexedGeometry = { - specId: getSpecId('ig1'), - color: 'red', - geom: { - x: 0, - y: 0, - width: 50, - height: 50, + geometryId: { + specId: getSpecId('ig1'), + seriesKey: [123, 123, 123], + }, + value: { + accessor: 'y1', + x: 123, + y: 123, }, - datum: [123, 123, 123], - seriesKey: [123, 123, 123], + color: 'red', + + x: 0, + y: 0, + width: 50, + height: 50, }; const ig4: IndexedGeometry = { - specId: getSpecId('ig1'), - color: 'blue', - geom: { - x: 0, - y: 0, - width: 50, - height: 50, + geometryId: { + specId: getSpecId('ig4'), + seriesKey: [123, 123, 123], + }, + value: { + accessor: 'y1', + x: 123, + y: 123, }, - datum: [123, 123, 123], - seriesKey: [123, 123, 123], + color: 'blue', + x: 0, + y: 0, + width: 50, + height: 50, }; const ig5: IndexedGeometry = { - specId: getSpecId('ig5'), + geometryId: { + specId: getSpecId('ig5'), + seriesKey: [123, 123, 123], + }, + value: { + accessor: 'y1', + x: 123, + y: 123, + }, + color: 'red', + x: 0, + y: 0, + width: 50, + height: 50, +}; +const ig6: PointGeometry = { + geometryId: { + specId: getSpecId('ig5'), + seriesKey: [123, 123, 123], + }, + value: { + accessor: 'y1', + x: 123, + y: 123, + }, color: 'red', - geom: { + x: 0, + y: 0, + radius: 50, + transform: { x: 0, y: 0, - width: 50, - height: 50, }, - datum: [123, 123, 123], - seriesKey: [123, 123, 123], }; describe('Interaction utils', () => { const chartDimensions: Dimensions = { @@ -119,6 +158,8 @@ describe('Interaction utils', () => { expect(areIndexedGeomsEquals(ig1, ig1)).toBe(true); expect(areIndexedGeomsEquals(ig1, ig2)).toBe(false); expect(areIndexedGeomsEquals(ig1, ig3)).toBe(true); + expect(areIndexedGeomsEquals(ig5, ig6)).toBe(false); + expect(areIndexedGeomsEquals(ig6, ig6)).toBe(true); }); test('geometry array equality', () => { expect( diff --git a/packages/osd-charts/src/lib/utils/interactions.ts b/packages/osd-charts/src/lib/utils/interactions.ts index 196ab3466745..e48e0f12cd73 100644 --- a/packages/osd-charts/src/lib/utils/interactions.ts +++ b/packages/osd-charts/src/lib/utils/interactions.ts @@ -1,4 +1,10 @@ -import { IndexedGeometry } from '../series/rendering'; +import { + BarGeometry, + IndexedGeometry, + isBarGeometry, + isPointGeometry, + PointGeometry, +} from '../series/rendering'; import { Datum, Rotation } from '../series/specs'; import { Dimensions } from './dimensions'; @@ -84,20 +90,40 @@ export function areIndexedGeometryArraysEquals(arr1: IndexedGeometry[], arr2: In if (arr1.length !== arr2.length) { return false; } - for (let i = arr1.length; i--;) { + for (let i = arr1.length; i--; ) { return areIndexedGeomsEquals(arr1[i], arr2[i]); } return true; } export function areIndexedGeomsEquals(ig1: IndexedGeometry, ig2: IndexedGeometry) { + if (isPointGeometry(ig1) && isPointGeometry(ig2)) { + return arePointsEqual(ig1, ig2); + } + if (isBarGeometry(ig1) && isBarGeometry(ig2)) { + return areBarEqual(ig1, ig2); + } + return false; +} + +export function arePointsEqual(ig1: PointGeometry, ig2: PointGeometry) { + return ( + ig1.geometryId.specId === ig2.geometryId.specId && + ig1.color === ig2.color && + ig1.x === ig2.x && + ig1.transform.x === ig2.transform.x && + ig1.transform.y === ig2.transform.y && + ig1.y === ig2.y && + ig1.radius === ig2.radius + ); +} +export function areBarEqual(ig1: BarGeometry, ig2: BarGeometry) { return ( - ig1.specId === ig2.specId && + ig1.geometryId.specId === ig2.geometryId.specId && ig1.color === ig2.color && - ig1.geom.x === ig2.geom.x && - ig1.geom.y === ig2.geom.y && - ig1.geom.width === ig2.geom.width && - ig1.geom.height === ig2.geom.height && - ig1.geom.isPoint === ig2.geom.isPoint + ig1.x === ig2.x && + ig1.y === ig2.y && + ig1.width === ig2.width && + ig1.height === ig2.height ); } diff --git a/packages/osd-charts/src/state/__snapshots__/utils.test.ts.snap b/packages/osd-charts/src/state/__snapshots__/utils.test.ts.snap index 36079002495d..dbeb3298fe4f 100644 --- a/packages/osd-charts/src/state/__snapshots__/utils.test.ts.snap +++ b/packages/osd-charts/src/state/__snapshots__/utils.test.ts.snap @@ -6,7 +6,6 @@ Array [ "counts": Object { "areaSeries": 0, "barSeries": 0, - "basicSeries": 0, "lineSeries": 1, }, "dataSeries": Array [ @@ -17,6 +16,8 @@ Array [ "x": 0, "y": 1, }, + "initialY0": null, + "initialY1": 1, "x": 0, "y0": 0, "y1": 1, @@ -26,6 +27,8 @@ Array [ "x": 1, "y": 2, }, + "initialY0": null, + "initialY1": 2, "x": 1, "y0": 0, "y1": 2, @@ -35,6 +38,8 @@ Array [ "x": 2, "y": 10, }, + "initialY0": null, + "initialY1": 10, "x": 2, "y0": 0, "y1": 10, @@ -44,6 +49,8 @@ Array [ "x": 3, "y": 6, }, + "initialY0": null, + "initialY1": 6, "x": 3, "y0": 0, "y1": 6, @@ -60,7 +67,6 @@ Array [ "counts": Object { "areaSeries": 0, "barSeries": 0, - "basicSeries": 0, "lineSeries": 1, }, "dataSeries": Array [ @@ -71,6 +77,8 @@ Array [ "x": 0, "y": 1, }, + "initialY0": null, + "initialY1": 1, "x": 0, "y0": 0, "y1": 1, @@ -80,6 +88,8 @@ Array [ "x": 1, "y": 2, }, + "initialY0": null, + "initialY1": 2, "x": 1, "y0": 0, "y1": 2, @@ -89,6 +99,8 @@ Array [ "x": 2, "y": 10, }, + "initialY0": null, + "initialY1": 10, "x": 2, "y0": 0, "y1": 10, @@ -98,6 +110,8 @@ Array [ "x": 3, "y": 6, }, + "initialY0": null, + "initialY1": 6, "x": 3, "y0": 0, "y1": 6, @@ -119,7 +133,6 @@ Array [ "counts": Object { "areaSeries": 0, "barSeries": 0, - "basicSeries": 0, "lineSeries": 2, }, "dataSeries": Array [ @@ -131,6 +144,8 @@ Array [ "x": 0, "y": 1, }, + "initialY0": null, + "initialY1": 1, "x": 0, "y0": 0, "y1": 1, @@ -141,6 +156,8 @@ Array [ "x": 1, "y": 2, }, + "initialY0": null, + "initialY1": 2, "x": 1, "y0": 0, "y1": 2, @@ -151,6 +168,8 @@ Array [ "x": 2, "y": 3, }, + "initialY0": null, + "initialY1": 3, "x": 2, "y0": 0, "y1": 3, @@ -161,6 +180,8 @@ Array [ "x": 3, "y": 4, }, + "initialY0": null, + "initialY1": 4, "x": 3, "y0": 0, "y1": 4, @@ -180,6 +201,8 @@ Array [ "x": 0, "y": 2, }, + "initialY0": null, + "initialY1": 2, "x": 0, "y0": 1, "y1": 3, @@ -190,6 +213,8 @@ Array [ "x": 1, "y": 3, }, + "initialY0": null, + "initialY1": 3, "x": 1, "y0": 2, "y1": 5, @@ -200,6 +225,8 @@ Array [ "x": 2, "y": 4, }, + "initialY0": null, + "initialY1": 4, "x": 2, "y0": 3, "y1": 7, @@ -210,6 +237,8 @@ Array [ "x": 3, "y": 5, }, + "initialY0": null, + "initialY1": 5, "x": 3, "y0": 4, "y1": 9, @@ -233,7 +262,6 @@ Array [ "counts": Object { "areaSeries": 0, "barSeries": 0, - "basicSeries": 0, "lineSeries": 2, }, "dataSeries": Array [ @@ -245,6 +273,8 @@ Array [ "x": 0, "y": 1, }, + "initialY0": null, + "initialY1": 1, "x": 0, "y0": 0, "y1": 1, @@ -255,6 +285,8 @@ Array [ "x": 1, "y": 2, }, + "initialY0": null, + "initialY1": 2, "x": 1, "y0": 0, "y1": 2, @@ -265,6 +297,8 @@ Array [ "x": 2, "y": 3, }, + "initialY0": null, + "initialY1": 3, "x": 2, "y0": 0, "y1": 3, @@ -275,6 +309,8 @@ Array [ "x": 3, "y": 4, }, + "initialY0": null, + "initialY1": 4, "x": 3, "y0": 0, "y1": 4, @@ -294,6 +330,8 @@ Array [ "x": 0, "y": 2, }, + "initialY0": null, + "initialY1": 2, "x": 0, "y0": 0, "y1": 2, @@ -304,6 +342,8 @@ Array [ "x": 1, "y": 3, }, + "initialY0": null, + "initialY1": 3, "x": 1, "y0": 0, "y1": 3, @@ -314,6 +354,8 @@ Array [ "x": 2, "y": 4, }, + "initialY0": null, + "initialY1": 4, "x": 2, "y0": 0, "y1": 4, @@ -324,6 +366,8 @@ Array [ "x": 3, "y": 5, }, + "initialY0": null, + "initialY1": 5, "x": 3, "y0": 0, "y1": 5, diff --git a/packages/osd-charts/src/state/annotation_marker.test.tsx b/packages/osd-charts/src/state/annotation_marker.test.tsx index a5e4243e1790..64e2ce886ddb 100644 --- a/packages/osd-charts/src/state/annotation_marker.test.tsx +++ b/packages/osd-charts/src/state/annotation_marker.test.tsx @@ -27,7 +27,12 @@ describe('annotation marker', () => { const maxRange = 100; const continuousData = [0, 10]; - const continuousScale = createContinuousScale(ScaleType.Linear, continuousData, minRange, maxRange); + const continuousScale = createContinuousScale( + ScaleType.Linear, + continuousData, + minRange, + maxRange, + ); const chartDimensions: Dimensions = { width: 10, @@ -63,17 +68,19 @@ describe('annotation marker', () => { xScale, Position.Left, ); - const expectedDimensions = [{ - position: [DEFAULT_LINE_OVERFLOW, 20, 10, 20], - details: { detailsText: 'foo', headerText: '2' }, - tooltipLinePosition: [0, 20, 10, 20], - marker: { - icon:
, - transform: 'translate(calc(0px - 0%),calc(20px - 50%))', - color: '#000', - dimensions: { width: 0, height: 0 } + const expectedDimensions = [ + { + position: [DEFAULT_LINE_OVERFLOW, 20, 10, 20], + details: { detailsText: 'foo', headerText: '2' }, + tooltipLinePosition: [0, 20, 10, 20], + marker: { + icon:
, + transform: 'translate(calc(0px - 0%),calc(20px - 50%))', + color: '#000', + dimensions: { width: 0, height: 0 }, + }, }, - }]; + ]; expect(dimensions).toEqual(expectedDimensions); }); @@ -99,17 +106,19 @@ describe('annotation marker', () => { xScale, Position.Left, ); - const expectedDimensions = [{ - position: [20, -DEFAULT_LINE_OVERFLOW, 20, 20], - details: { detailsText: 'foo', headerText: '2' }, - tooltipLinePosition: [20, 0, 20, 20], - marker: { - icon:
, - transform: 'translate(calc(20px - 0%),calc(20px - 50%))', - color: '#000', - dimensions: { width: 0, height: 0 }, + const expectedDimensions = [ + { + position: [20, -DEFAULT_LINE_OVERFLOW, 20, 20], + details: { detailsText: 'foo', headerText: '2' }, + tooltipLinePosition: [20, 0, 20, 20], + marker: { + icon:
, + transform: 'translate(calc(20px - 0%),calc(20px - 50%))', + color: '#000', + dimensions: { width: 0, height: 0 }, + }, }, - }]; + ]; expect(dimensions).toEqual(expectedDimensions); }); diff --git a/packages/osd-charts/src/state/chart_state.test.ts b/packages/osd-charts/src/state/chart_state.test.ts index 3cb34c308f31..0e98b3c8baf4 100644 --- a/packages/osd-charts/src/state/chart_state.test.ts +++ b/packages/osd-charts/src/state/chart_state.test.ts @@ -664,27 +664,35 @@ describe('Chart Store', () => { test('handle click on chart', () => { const geom1: IndexedGeometry = { color: 'red', - specId: getSpecId('specId1'), - datum: [0, 1, 2], - geom: { + geometryId: { + specId: getSpecId('specId1'), + seriesKey: [2], + }, + value: { x: 0, - y: 0, - width: 0, - height: 0, + y: 1, + accessor: 'y1', }, - seriesKey: [2], + x: 0, + y: 0, + width: 0, + height: 0, }; const geom2: IndexedGeometry = { color: 'blue', - specId: getSpecId('specId2'), - datum: [0, 3, 2], - geom: { - x: 50, - y: 0, - width: 0, - height: 0, + geometryId: { + specId: getSpecId('specId2'), + seriesKey: [2], }, - seriesKey: [2], + value: { + x: 0, + y: 3, + accessor: 'y1', + }, + x: 50, + y: 0, + width: 0, + height: 0, }; const clickListener = jest.fn( (ds: GeometryValue[]): void => { @@ -700,12 +708,12 @@ describe('Chart Store', () => { store.highlightedGeometries.replace([geom1]); store.handleChartClick(); expect(clickListener).toBeCalledTimes(1); - expect(clickListener.mock.calls[0][0]).toEqual([geom1]); + expect(clickListener.mock.calls[0][0]).toEqual([geom1.value]); store.highlightedGeometries.replace([geom1, geom2]); store.handleChartClick(); expect(clickListener).toBeCalledTimes(2); - expect(clickListener.mock.calls[1][0]).toEqual([geom1, geom2]); + expect(clickListener.mock.calls[1][0]).toEqual([geom1.value, geom2.value]); }); test('can compute annotation tooltip state', () => { const scale = new ScaleContinuous([0, 100], [0, 100], ScaleType.Linear); diff --git a/packages/osd-charts/src/state/chart_state.timescales.test.ts b/packages/osd-charts/src/state/chart_state.timescales.test.ts index f9e43f439b85..5d179d0d1693 100644 --- a/packages/osd-charts/src/state/chart_state.timescales.test.ts +++ b/packages/osd-charts/src/state/chart_state.timescales.test.ts @@ -46,16 +46,16 @@ describe('Render chart', () => { test('check mouse position correctly return inverted value', () => { store.setCursorPosition(15, 10); // check first valid tooltip expect(store.tooltipData.length).toBe(2); // x value + y value - expect(store.tooltipData[0].value).toBe(day1); // x value - expect(store.tooltipData[1].value).toBe(10); // y value + expect(store.tooltipData[0].value).toBe(`${day1}`); // x value + expect(store.tooltipData[1].value).toBe('10'); // y value store.setCursorPosition(35, 10); // check first valid tooltip expect(store.tooltipData.length).toBe(2); // x value + y value - expect(store.tooltipData[0].value).toBe(day2); // x value - expect(store.tooltipData[1].value).toBe(22); // y value + expect(store.tooltipData[0].value).toBe(`${day2}`); // x value + expect(store.tooltipData[1].value).toBe('22'); // y value store.setCursorPosition(76, 10); // check first valid tooltip expect(store.tooltipData.length).toBe(2); // x value + y value - expect(store.tooltipData[0].value).toBe(day3); // x value - expect(store.tooltipData[1].value).toBe(6); // y value + expect(store.tooltipData[0].value).toBe(`${day3}`); // x value + expect(store.tooltipData[1].value).toBe('6'); // y value }); }); describe('line, utc-time, 5m interval', () => { @@ -97,16 +97,16 @@ describe('Render chart', () => { test('check mouse position correctly return inverted value', () => { store.setCursorPosition(15, 10); // check first valid tooltip expect(store.tooltipData.length).toBe(2); // x value + y value - expect(store.tooltipData[0].value).toBe(date1); // x value - expect(store.tooltipData[1].value).toBe(10); // y value + expect(store.tooltipData[0].value).toBe(`${date1}`); // x value + expect(store.tooltipData[1].value).toBe('10'); // y value store.setCursorPosition(35, 10); // check first valid tooltip expect(store.tooltipData.length).toBe(2); // x value + y value - expect(store.tooltipData[0].value).toBe(date2); // x value - expect(store.tooltipData[1].value).toBe(22); // y value + expect(store.tooltipData[0].value).toBe(`${date2}`); // x value + expect(store.tooltipData[1].value).toBe('22'); // y value store.setCursorPosition(76, 10); // check first valid tooltip expect(store.tooltipData.length).toBe(2); // x value + y value - expect(store.tooltipData[0].value).toBe(date3); // x value - expect(store.tooltipData[1].value).toBe(6); // y value + expect(store.tooltipData[0].value).toBe(`${date3}`); // x value + expect(store.tooltipData[1].value).toBe('6'); // y value }); }); describe('line, non utc-time, 5m + 1s interval', () => { @@ -163,16 +163,16 @@ describe('Render chart', () => { test('check mouse position correctly return inverted value', () => { store.setCursorPosition(15, 10); // check first valid tooltip expect(store.tooltipData.length).toBe(2); // x value + y value - expect(store.tooltipData[0].value).toBe(date1); // x value - expect(store.tooltipData[1].value).toBe(10); // y value + expect(store.tooltipData[0].value).toBe(`${date1}`); // x value + expect(store.tooltipData[1].value).toBe('10'); // y value store.setCursorPosition(35, 10); // check first valid tooltip expect(store.tooltipData.length).toBe(2); // x value + y value - expect(store.tooltipData[0].value).toBe(date2); // x value - expect(store.tooltipData[1].value).toBe(22); // y value + expect(store.tooltipData[0].value).toBe(`${date2}`); // x value + expect(store.tooltipData[1].value).toBe('22'); // y value store.setCursorPosition(76, 10); // check first valid tooltip expect(store.tooltipData.length).toBe(2); // x value + y value - expect(store.tooltipData[0].value).toBe(date3); // x value - expect(store.tooltipData[1].value).toBe(6); // y value + expect(store.tooltipData[0].value).toBe(`${date3}`); // x value + expect(store.tooltipData[1].value).toBe('6'); // y value }); }); }); diff --git a/packages/osd-charts/src/state/chart_state.ts b/packages/osd-charts/src/state/chart_state.ts index 8ef292c3c438..a17ef9d668ab 100644 --- a/packages/osd-charts/src/state/chart_state.ts +++ b/packages/osd-charts/src/state/chart_state.ts @@ -39,7 +39,7 @@ import { Rendering, Rotation, } from '../lib/series/specs'; -import { formatTooltip, formatXTooltipValue, getSeriesTooltipValues } from '../lib/series/tooltip'; +import { formatTooltip, getSeriesTooltipValues } from '../lib/series/tooltip'; import { LIGHT_THEME } from '../lib/themes/light_theme'; import { mergeWithDefaultAnnotationLine, Theme } from '../lib/themes/theme'; import { computeChartDimensions, Dimensions } from '../lib/utils/dimensions'; @@ -328,7 +328,9 @@ export class ChartStore { const newHighlightedGeometries: IndexedGeometry[] = []; const tooltipValues = elements.reduce( (acc, indexedGeometry) => { - const { specId, color } = indexedGeometry; + const { + geometryId: { specId }, + } = indexedGeometry; const spec = this.seriesSpecs.get(specId); // safe guard check @@ -358,15 +360,15 @@ export class ChartStore { } // format the tooltip values - const formattedTooltip = formatTooltip(indexedGeometry, spec, color, isHighlighted, yAxis); + const formattedTooltip = formatTooltip(indexedGeometry, spec, false, isHighlighted, yAxis); // format only one time the x value if (!xValueInfo) { - xValueInfo = formatXTooltipValue(indexedGeometry, spec, color, xAxis); - return [xValueInfo, ...acc, ...formattedTooltip]; + xValueInfo = formatTooltip(indexedGeometry, spec, true, false, xAxis); + return [xValueInfo, ...acc, formattedTooltip]; } - return [...acc, ...formattedTooltip]; + return [...acc, formattedTooltip]; }, [] as TooltipValue[], ); @@ -377,7 +379,7 @@ export class ChartStore { !areIndexedGeometryArraysEquals(newHighlightedGeometries, this.highlightedGeometries.toJS()) ) { if (newHighlightedGeometries.length > 0) { - this.onElementOverListener(newHighlightedGeometries); + this.onElementOverListener(newHighlightedGeometries.map(({ value }) => value)); } else { if (this.onElementOutListener) { this.onElementOutListener(); @@ -601,7 +603,7 @@ export class ChartStore { handleChartClick() { if (this.highlightedGeometries.length > 0 && this.onElementClickListener) { - this.onElementClickListener(this.highlightedGeometries.toJS()); + this.onElementClickListener(this.highlightedGeometries.toJS().map(({ value }) => value)); } } diff --git a/packages/osd-charts/src/state/test/interactions.test.ts b/packages/osd-charts/src/state/test/interactions.test.ts index 7b361bada015..63158268a3ab 100644 --- a/packages/osd-charts/src/state/test/interactions.test.ts +++ b/packages/osd-charts/src/state/test/interactions.test.ts @@ -1,4 +1,4 @@ -import { GeometryValue, IndexedGeometry } from '../../lib/series/rendering'; +import { BarGeometry, GeometryValue } from '../../lib/series/rendering'; import { computeXScale, computeYScales } from '../../lib/series/scales'; import { DataSeriesColorsValues } from '../../lib/series/series'; import { BarSeriesSpec, BasicSeriesSpec } from '../../lib/series/specs'; @@ -74,29 +74,37 @@ function initStore(spec: BasicSeriesSpec) { store.seriesSpecs.set(spec.id, spec); return store; } -const indexedGeom1Red: IndexedGeometry = { +const indexedGeom1Red: BarGeometry = { color: 'red', - geom: { + x: 0, + y: 0, + width: 50, + height: 100, + value: { x: 0, - y: 0, - width: 50, - height: 100, + y: 10, + accessor: 'y1', + }, + geometryId: { + specId: SPEC_ID, + seriesKey: [], }, - datum: [0, 10], - specId: SPEC_ID, - seriesKey: [], }; -const indexedGeom2Blue: IndexedGeometry = { +const indexedGeom2Blue: BarGeometry = { color: 'blue', - geom: { - x: 50, - y: 50, - width: 50, - height: 50, + x: 50, + y: 50, + width: 50, + height: 50, + value: { + x: 1, + y: 5, + accessor: 'y1', + }, + geometryId: { + specId: SPEC_ID, + seriesKey: [], }, - datum: [1, 5], - specId: SPEC_ID, - seriesKey: [], }; describe('Chart state pointer interactions', () => { @@ -215,7 +223,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { expect(store.highlightedGeometries.length).toBe(1); expect(onOverListener).toBeCalledTimes(1); expect(onOutListener).toBeCalledTimes(0); - expect(onOverListener.mock.calls[0][0]).toEqual([indexedGeom1Red]); + expect(onOverListener.mock.calls[0][0]).toEqual([indexedGeom1Red.value]); store.setCursorPosition(chartLeft - 1, chartTop - 1); expect(store.cursorPosition).toEqual({ x: -1, y: -1 }); @@ -236,7 +244,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { expect(store.tooltipData.length).toBe(2); // x value + 1 y value expect(onOverListener).toBeCalledTimes(1); expect(onOutListener).toBeCalledTimes(0); - expect(onOverListener.mock.calls[0][0]).toEqual([indexedGeom1Red]); + expect(onOverListener.mock.calls[0][0]).toEqual([indexedGeom1Red.value]); store.setCursorPosition(chartLeft - 1, chartTop + 99); expect(store.cursorPosition).toEqual({ x: -1, y: 99 }); @@ -257,7 +265,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { expect(store.tooltipData.length).toBe(2); expect(onOverListener).toBeCalledTimes(1); expect(onOutListener).toBeCalledTimes(0); - expect(onOverListener.mock.calls[0][0]).toEqual([indexedGeom1Red]); + expect(onOverListener.mock.calls[0][0]).toEqual([indexedGeom1Red.value]); store.setCursorPosition(chartLeft + 50, chartTop + 0); expect(store.cursorPosition).toEqual({ x: 50, y: 0 }); @@ -280,7 +288,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { expect(store.tooltipData.length).toBe(2); expect(onOverListener).toBeCalledTimes(1); expect(onOutListener).toBeCalledTimes(0); - expect(onOverListener.mock.calls[0][0]).toEqual([indexedGeom1Red]); + expect(onOverListener.mock.calls[0][0]).toEqual([indexedGeom1Red.value]); store.setCursorPosition(chartLeft + 50, chartTop + 99); expect(store.cursorPosition).toEqual({ x: 50, y: 99 }); @@ -291,7 +299,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { // we are over the second bar here expect(store.highlightedGeometries.length).toBe(1); expect(onOverListener).toBeCalledTimes(2); - expect(onOverListener.mock.calls[1][0]).toEqual([indexedGeom2Blue]); + expect(onOverListener.mock.calls[1][0]).toEqual([indexedGeom2Blue.value]); expect(onOutListener).toBeCalledTimes(0); }); @@ -318,7 +326,7 @@ function mouseOverTestSuite(scaleType: ScaleType) { expect(store.highlightedGeometries.length).toBe(1); expect(store.tooltipData.length).toBe(2); expect(onOverListener).toBeCalledTimes(1); - expect(onOverListener.mock.calls[0][0]).toEqual([indexedGeom2Blue]); + expect(onOverListener.mock.calls[0][0]).toEqual([indexedGeom2Blue.value]); expect(onOutListener).toBeCalledTimes(0); }); } diff --git a/packages/osd-charts/src/state/utils.ts b/packages/osd-charts/src/state/utils.ts index 51eb57941a70..f16840ae1dc4 100644 --- a/packages/osd-charts/src/state/utils.ts +++ b/packages/osd-charts/src/state/utils.ts @@ -339,6 +339,7 @@ export function renderGeometries( yScale, color, ds.specId, + Boolean(spec.y0Accessors), ds.key, ); points.push(...renderedPoints.pointGeometries); @@ -369,6 +370,7 @@ export function renderGeometries( color, (spec as LineSeriesSpec).curve || CurveType.LINEAR, ds.specId, + Boolean(spec.y0Accessors), ds.key, ); lineGeometriesIndex = mergeGeometriesIndexes( @@ -390,6 +392,7 @@ export function renderGeometries( color, (spec as AreaSeriesSpec).curve || CurveType.LINEAR, ds.specId, + Boolean(spec.y0Accessors), ds.key, ); areaGeometriesIndex = mergeGeometriesIndexes( diff --git a/packages/osd-charts/stories/area_chart.tsx b/packages/osd-charts/stories/area_chart.tsx index 169a72e2a174..f2c4533d0a18 100644 --- a/packages/osd-charts/stories/area_chart.tsx +++ b/packages/osd-charts/stories/area_chart.tsx @@ -1,3 +1,4 @@ +import { boolean } from '@storybook/addon-knobs'; import { storiesOf } from '@storybook/react'; import { DateTime } from 'luxon'; import React from 'react'; @@ -8,6 +9,7 @@ import { CurveType, getAxisId, getSpecId, + LineSeries, Position, ScaleType, Settings, @@ -89,6 +91,38 @@ storiesOf('Area Chart', module) ); }) + .add('with log y axis', () => { + const data = KIBANA_METRICS.metrics.kibana_os_load[0].data.map((d) => { + return d[1] < 7 ? [d[0], null] : [d[0], d[1] - 10]; + }); + return ( + + + Number(d).toFixed(2)} + /> + + + + ); + }) .add('with 4 axes', () => { return ( @@ -365,4 +399,105 @@ storiesOf('Area Chart', module) /> ); + }) + .add('band area chart', () => { + const data = KIBANA_METRICS.metrics.kibana_os_load[0].data.map((d) => { + return { + x: d[0], + max: d[1] + 4 + 4 * Math.random(), + min: d[1] - 4 - 4 * Math.random(), + }; + }); + const lineData = KIBANA_METRICS.metrics.kibana_os_load[0].data.map((d) => { + return [d[0], d[1]]; + }); + const scaleToDataExtent = boolean('scale to extent', true); + return ( + + + Number(d).toFixed(2)} + /> + + + + + + ); + }) + .add('stacked band area chart', () => { + const data = KIBANA_METRICS.metrics.kibana_os_load[0].data; + const data2 = KIBANA_METRICS.metrics.kibana_os_load[0].data.map((d) => { + return [d[0], 20, 10]; + }); + const scaleToDataExtent = boolean('scale to extent', false); + return ( + + + Number(d).toFixed(2)} + /> + + + + + + ); }); diff --git a/packages/osd-charts/stories/bar_chart.tsx b/packages/osd-charts/stories/bar_chart.tsx index 08f4bb81dc34..f9d213e18210 100644 --- a/packages/osd-charts/stories/bar_chart.tsx +++ b/packages/osd-charts/stories/bar_chart.tsx @@ -11,6 +11,7 @@ import { getAxisId, getSpecId, LIGHT_THEME, + LineSeries, niceTimeFormatByDay, Position, ScaleType, @@ -798,6 +799,55 @@ storiesOf('Bar Chart', module) ); }) + .add('single data stacked chart scale to extent', () => { + return ( + + + Number(d).toFixed(2)} + /> + + + + ); + }) + .add('single data clustered chart scale to extent', () => { + return ( + + + Number(d).toFixed(2)} + /> + + + + ); + }) .add('negative and positive x values', () => { return ( @@ -846,11 +896,15 @@ storiesOf('Bar Chart', module) const allPositive = mixed.map((datum) => ({ x: datum.x, y: Math.abs(datum.y) })); const allNegative = mixed.map((datum) => ({ x: datum.x, y: Math.abs(datum.y) * -1 })); - const dataChoice = select('data', { - mixed: 'mixed', - allPositive: 'all positive', - allNegative: 'all negative', - }, 'mixed'); + const dataChoice = select( + 'data', + { + mixed: 'mixed', + allPositive: 'all positive', + allNegative: 'all negative', + }, + 'mixed', + ); let data = mixed; switch (dataChoice) { @@ -886,6 +940,59 @@ storiesOf('Bar Chart', module) ); }) + .add('band bar chart', () => { + const data = KIBANA_METRICS.metrics.kibana_os_load[0].data.map((d) => { + return { + x: d[0], + max: d[1] + 4 + 4 * Math.random(), + min: d[1] - 4 - 4 * Math.random(), + }; + }); + const lineData = KIBANA_METRICS.metrics.kibana_os_load[0].data.map((d) => { + return [d[0], d[1]]; + }); + const scaleToDataExtent = boolean('scale to extent', true); + return ( + + + Number(d).toFixed(2)} + /> + + + + + + ); + }) .add('[test] - linear', () => { const data = [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 4], [7, 3], [8, 2], [9, 1]]; return ( @@ -1019,4 +1126,71 @@ storiesOf('Bar Chart', module) /> ); + }) + .add('[test] - clustered bar chart with null bars', () => { + const data = [ + [1, 1, 3, 'a'], + [2, null, 4, 'a'], + [3, 3, 5, 'a'], + [4, 4, 6, 'a'], + [1, 1, 3, 'b'], + [2, 2, 4, 'b'], + [3, 3, 5, 'b'], + [4, 4, 6, 'b'], + ]; + return ( + + + Number(d).toFixed(2)} + /> + + + ); + }) + .add('[test] - stacked bar chart with null bars', () => { + const data = [ + [1, 1, 3, 'a'], + [2, null, 4, 'a'], + [3, 3, 5, 'a'], + [4, 4, 6, 'a'], + [1, 1, 3, 'b'], + [2, 2, 4, 'b'], + [3, null, 5, 'b'], + [4, 4, 6, 'b'], + ]; + return ( + + + Number(d).toFixed(2)} + /> + + + ); }); diff --git a/packages/osd-charts/stories/mixed.tsx b/packages/osd-charts/stories/mixed.tsx index 1368ae86d1b0..957d322c6484 100644 --- a/packages/osd-charts/stories/mixed.tsx +++ b/packages/osd-charts/stories/mixed.tsx @@ -20,12 +20,7 @@ storiesOf('Mixed Charts', module) return ( - + );