From 6fd24e289c18e1dcda27396d3e2d804dbdf87942 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Tue, 9 Apr 2019 18:41:40 +0200 Subject: [PATCH 01/11] feat(bands): add band area chart Add a `y0Accessor` prop for each series to enable the possibility to add a lower limit to area and bars. close #144 --- .../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 | 312 ++++++++++++------ src/lib/series/domains/y_domain.test.ts | 52 +-- src/lib/series/domains/y_domain.ts | 18 +- src/lib/series/rendering.areas.test.ts | 28 +- src/lib/series/rendering.lines.test.ts | 10 + src/lib/series/rendering.ts | 119 ++++--- src/lib/series/series.test.ts | 30 +- src/lib/series/series.ts | 128 +++++-- src/lib/series/specs.ts | 2 + src/state/utils.ts | 3 + stories/area_chart.tsx | 154 ++++++++- 14 files changed, 658 insertions(+), 270 deletions(-) diff --git a/src/components/react_canvas/area_geometries.tsx b/src/components/react_canvas/area_geometries.tsx index 6dfcb000bb..26de28bad6 100644 --- a/src/components/react_canvas/area_geometries.tsx +++ b/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/src/components/react_canvas/utils/rendering_props_utils.test.ts b/src/components/react_canvas/utils/rendering_props_utils.test.ts index 1829601a5f..511effb120 100644 --- a/src/components/react_canvas/utils/rendering_props_utils.test.ts +++ b/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/src/components/react_canvas/utils/rendering_props_utils.ts b/src/components/react_canvas/utils/rendering_props_utils.ts index 4cc23101a9..742344d980 100644 --- a/src/components/react_canvas/utils/rendering_props_utils.ts +++ b/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/src/lib/series/__snapshots__/series.test.ts.snap b/src/lib/series/__snapshots__/series.test.ts.snap index c12d168b64..369513fb78 100644 --- a/src/lib/series/__snapshots__/series.test.ts.snap +++ b/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 [ @@ -13567,7 +13659,8 @@ Array [ "y": 1, }, "x": 0, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -13575,7 +13668,8 @@ Array [ "y": 2, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -13583,7 +13677,8 @@ Array [ "y": 10, }, "x": 2, - "y": 10, + "y0": null, + "y1": 10, }, Object { "datum": Object { @@ -13591,7 +13686,8 @@ Array [ "y": 6, }, "x": 3, - "y": 6, + "y0": null, + "y1": 6, }, ], "key": Array [], @@ -13612,7 +13708,8 @@ Array [ "y2": 3, }, "x": 0, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -13621,7 +13718,8 @@ Array [ "y2": 7, }, "x": 1, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -13630,7 +13728,8 @@ Array [ "y2": 2, }, "x": 2, - "y": 1, + "y0": null, + "y1": 1, }, Object { "datum": Object { @@ -13639,7 +13738,8 @@ Array [ "y2": 10, }, "x": 3, - "y": 6, + "y0": null, + "y1": 6, }, ], "key": Array [ @@ -13657,7 +13757,8 @@ Array [ "y2": 3, }, "x": 0, - "y": 3, + "y0": null, + "y1": 3, }, Object { "datum": Object { @@ -13666,7 +13767,8 @@ Array [ "y2": 7, }, "x": 1, - "y": 7, + "y0": null, + "y1": 7, }, Object { "datum": Object { @@ -13675,7 +13777,8 @@ Array [ "y2": 2, }, "x": 2, - "y": 2, + "y0": null, + "y1": 2, }, Object { "datum": Object { @@ -13684,7 +13787,8 @@ Array [ "y2": 10, }, "x": 3, - "y": 10, + "y0": null, + "y1": 10, }, ], "key": Array [ diff --git a/src/lib/series/domains/y_domain.test.ts b/src/lib/series/domains/y_domain.test.ts index e0601a56e2..998580b905 100644 --- a/src/lib/series/domains/y_domain.test.ts +++ b/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/src/lib/series/domains/y_domain.ts b/src/lib/series/domains/y_domain.ts index 0c2006fad4..3dfa859f9d 100644 --- a/src/lib/series/domains/y_domain.ts +++ b/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/src/lib/series/rendering.areas.test.ts b/src/lib/series/rendering.areas.test.ts index 377eab8439..01ecb689ad 100644 --- a/src/lib/series/rendering.areas.test.ts +++ b/src/lib/series/rendering.areas.test.ts @@ -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([]); @@ -142,6 +143,7 @@ describe('Rendering points - areas', () => { 'red', CurveType.LINEAR, spec1Id, + false, [], ); secondLine = renderArea( @@ -152,19 +154,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([]); @@ -276,11 +279,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([]); @@ -373,6 +377,7 @@ describe('Rendering points - areas', () => { 'red', CurveType.LINEAR, spec1Id, + false, [], ); secondLine = renderArea( @@ -383,18 +388,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([]); @@ -506,11 +512,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([]); @@ -603,6 +610,7 @@ describe('Rendering points - areas', () => { 'red', CurveType.LINEAR, spec1Id, + false, [], ); secondLine = renderArea( @@ -613,6 +621,7 @@ describe('Rendering points - areas', () => { 'blue', CurveType.LINEAR, spec2Id, + false, [], ); }); @@ -721,12 +730,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([]); diff --git a/src/lib/series/rendering.lines.test.ts b/src/lib/series/rendering.lines.test.ts index 717d089b77..cc9d11fe22 100644 --- a/src/lib/series/rendering.lines.test.ts +++ b/src/lib/series/rendering.lines.test.ts @@ -40,6 +40,7 @@ describe('Rendering points - line', () => { 'red', CurveType.LINEAR, SPEC_ID, + false, [], ); }); @@ -138,6 +139,7 @@ describe('Rendering points - line', () => { 'red', CurveType.LINEAR, spec1Id, + false, [], ); secondLine = renderLine( @@ -148,6 +150,7 @@ describe('Rendering points - line', () => { 'blue', CurveType.LINEAR, spec2Id, + false, [], ); }); @@ -270,6 +273,7 @@ describe('Rendering points - line', () => { 'red', CurveType.LINEAR, SPEC_ID, + false, [], ); }); @@ -366,6 +370,7 @@ describe('Rendering points - line', () => { 'red', CurveType.LINEAR, spec1Id, + false, [], ); secondLine = renderLine( @@ -376,6 +381,7 @@ describe('Rendering points - line', () => { 'blue', CurveType.LINEAR, spec2Id, + false, [], ); }); @@ -497,6 +503,7 @@ describe('Rendering points - line', () => { 'red', CurveType.LINEAR, SPEC_ID, + false, [], ); }); @@ -593,6 +600,7 @@ describe('Rendering points - line', () => { 'red', CurveType.LINEAR, spec1Id, + false, [], ); secondLine = renderLine( @@ -603,6 +611,7 @@ describe('Rendering points - line', () => { 'blue', CurveType.LINEAR, spec2Id, + false, [], ); }); @@ -711,6 +720,7 @@ describe('Rendering points - line', () => { 'red', CurveType.LINEAR, SPEC_ID, + false, [], ); }); diff --git a/src/lib/series/rendering.ts b/src/lib/series/rendering.ts index 6d3e204293..694ebca584 100644 --- a/src/lib/series/rendering.ts +++ b/src/lib/series/rendering.ts @@ -65,7 +65,7 @@ export interface LineGeometry { } export interface AreaGeometry { area: string; - line: string; + lines: string[]; points: PointGeometry[]; color: string; transform: { @@ -82,6 +82,7 @@ export function renderPoints( yScale: Scale, color: string, specId: SpecId, + hasY0Accessors: boolean, seriesKey: any[], ): { pointGeometries: PointGeometry[]; @@ -93,48 +94,55 @@ 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.push(datum.y0); } - const indexedGeometry: IndexedGeometry = { - specId, - datum: datum.datum, - color, - seriesKey, - geom: { - x: x + shift, - y, - width: radius, - height: radius, - isPoint: true, - }, - }; - mutableIndexedGeometryMapUpsert(indexedGeometries, datum.x, indexedGeometry); - const pointGeometry: PointGeometry = { - x, - y, - color, - value: { + yDatums.forEach((yDatum) => { + 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 indexedGeometry: IndexedGeometry = { specId, datum: datum.datum, + color, seriesKey, - }, - transform: { - x: shift, - y: 0, - }, - }; - if (isHidden) { - return acc; - } - return [...acc, pointGeometry]; + geom: { + x: x + shift, + 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) { + points.push(pointGeometry); + } + }); + return [...acc, ...points]; }, [] as PointGeometry[], ); @@ -229,6 +237,7 @@ export function renderLine( color: string, curve: CurveType, specId: SpecId, + hasY0Accessors: boolean, seriesKey: any[], ): { lineGeometry: LineGeometry; @@ -250,6 +259,7 @@ export function renderLine( yScale, color, specId, + hasY0Accessors, seriesKey, ); const lineGeometry = { @@ -279,6 +289,7 @@ export function renderArea( color: string, curve: CurveType, specId: SpecId, + hasY0Accessors: boolean, seriesKey: any[], ): { areaGeometry: AreaGeometry; @@ -290,29 +301,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, diff --git a/src/lib/series/series.test.ts b/src/lib/series/series.test.ts index 2e666ea1c6..cc9d805cd5 100644 --- a/src/lib/series/series.test.ts +++ b/src/lib/series/series.test.ts @@ -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,13 +158,13 @@ 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); @@ -310,10 +310,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/src/lib/series/series.ts b/src/lib/series/series.ts index 366db0f4e3..eabe939746 100644 --- a/src/lib/series/series.ts +++ b/src/lib/series/series.ts @@ -6,15 +6,23 @@ import { splitSpecsByGroupId, YBasicSeriesSpec } from './domains/y_domain'; import { BasicSeriesSpec, Datum, SeriesAccessors } from './specs'; 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; + /** the datum */ datum?: any; } @@ -65,7 +73,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 +84,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 +102,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); } @@ -163,13 +181,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, @@ -286,12 +312,19 @@ export function formatNonStackedDataValues( 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, + const data = dataSeries.data[i]; + const { x, y1, datum } = data; + let y0: number | null; + if (scaleToExtent) { + y0 = data.y0 ? data.y0 : y1; + } else { + y0 = data.y0 ? data.y0 : 0; + } + const formattedValue: DataSeriesDatum = { + x, + y1, + y0, + datum, }; formattedValues.data.push(formattedValue); } @@ -306,8 +339,10 @@ export function formatStackedDataSeriesValues( 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); + if (datum.y1 !== null) { + stack[index] = datum.y1; + stackMap.set(datum.x, stack); + } }); }); const stackedValues = new Map(); @@ -327,17 +362,42 @@ export function formatStackedDataSeriesValues( 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 }; + 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; + } + if (seriesIndex === 0) { + newData.push({ + x, + y1, + y0: computedY0, + datum, + }); + } else { + const stack = stackedValues.get(x); + if (!stack) { + return; } - }); + const stackY = stack[seriesIndex]; + const stackedY1 = y1 !== null ? stackY + y1 : null; + const stackedY0 = data.y0 == null ? stackY : stackY + data.y0; + newData.push({ + x, + y1: stackedY1, + y0: stackedY0, + datum, + }); + } + }); return { specId: ds.specId, key: ds.key, @@ -408,8 +468,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/src/lib/series/specs.ts b/src/lib/series/specs.ts index c344c0a82d..99f61a18db 100644 --- a/src/lib/series/specs.ts +++ b/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/src/state/utils.ts b/src/state/utils.ts index 51eb57941a..f16840ae1d 100644 --- a/src/state/utils.ts +++ b/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/stories/area_chart.tsx b/stories/area_chart.tsx index 169a72e2a1..35d8320f34 100644 --- a/stories/area_chart.tsx +++ b/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'; @@ -365,4 +366,155 @@ storiesOf('Area Chart', module) /> ); - }); + }) + .add('band area chart', () => { + const data = KIBANA_METRICS.metrics.kibana_os_load[0].data.map((d) => { + return [d[0], d[1], d[1] - 4]; + }); + const scaleToDataExtent = boolean('scale to extent', false); + return ( + + + Number(d).toFixed(2)} + /> + + + + ); + }) + .add( + 'stacked band area chart', + () => { + const data = KIBANA_METRICS.metrics.kibana_os_load[0].data + .map((d) => { + // return [d[0], d[1], d[1] - 4]; + return [d[0], 8, 4.5]; + }) + .slice(0, 5); + const data2 = KIBANA_METRICS.metrics.kibana_os_load[0].data + .map((d) => { + return [d[0], 4, 2]; + }) + .slice(0, 5); + const scaleToDataExtent = boolean('scale to extent', false); + return ( + + + Number(d).toFixed(2)} + /> + + + + + + ); + }, + { + info: { + text: 'Don\' try that at home :)', + }, + }, + ) + .add( + 'simple stacked band area chart', + () => { + const data1 = [[0, 7, 2], [1, 5, 2], [2, 5, 2], [3, 5, 2], [4, 5, 2]]; + const data2 = [[0, 6, 3], [1, 7, 4], [2, 8, 3], [3, 6, 3], [4, 6, 3]]; + const scaleToDataExtent = boolean('scale to extent', false); + return ( + + + + Number(d).toFixed(2)} + /> + + + + + + ); + }, + { + info: { + text: 'Don\' try that at home :)', + }, + }, + ); From 3fa80d009a049e1e33a169fab3d0752f22b12a47 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Tue, 9 Apr 2019 22:48:36 +0200 Subject: [PATCH 02/11] fix(tooltip): fix tooltip y0 rendering refactoring of the indexed geometries: removed the extra duplicated values in favour of a better rendering geometry. --- src/components/highlighter.tsx | 24 +-- src/lib/series/rendering.areas.test.ts | 209 +++++++++++++++++-------- src/lib/series/rendering.bars.test.ts | 80 ++++------ src/lib/series/rendering.lines.test.ts | 197 +++++++++++++++-------- src/lib/series/rendering.test.ts | 37 +++-- src/lib/series/rendering.ts | 100 ++++++------ src/lib/series/tooltip.ts | 27 ++-- src/lib/utils/interactions.test.ts | 117 +++++++++----- src/lib/utils/interactions.ts | 40 ++++- src/state/chart_state.test.ts | 36 +++-- src/state/chart_state.ts | 5 +- src/state/test/interactions.test.ts | 40 +++-- stories/mixed.tsx | 13 +- 13 files changed, 567 insertions(+), 358 deletions(-) diff --git a/src/components/highlighter.tsx b/src/components/highlighter.tsx index 53bd4e7748..95a0d3efa0 100644 --- a/src/components/highlighter.tsx +++ b/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/src/lib/series/rendering.areas.test.ts b/src/lib/series/rendering.areas.test.ts index 01ecb689ad..b425515983 100644 --- a/src/lib/series/rendering.areas.test.ts +++ b/src/lib/series/rendering.areas.test.ts @@ -2,7 +2,13 @@ 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, + isPointGeometry, + PointGeometry, + renderArea, +} from './rendering'; import { computeXScale, computeYScales } from './scales'; import { AreaSeriesSpec } from './specs'; const SPEC_ID = getSpecId('spec_1'); @@ -65,31 +71,40 @@ 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: { + 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: { + x: 1, + y: 5, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -183,31 +198,39 @@ 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: { + 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: { + x: 1, + y: 5, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); test('can render second spec points', () => { @@ -219,31 +242,39 @@ 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: { + 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: { + x: 1, + y: 10, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -299,31 +330,39 @@ 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: { + 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: { + x: 1, + y: 5, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -416,31 +455,39 @@ 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: { + 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: { + x: 1, + y: 5, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); test('can render second spec points', () => { @@ -452,31 +499,39 @@ 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: { + 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: { + x: 1, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -532,31 +587,39 @@ 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: { + 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: { + x: 1546387200000, + y: 5, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -634,31 +697,39 @@ 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: { + 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: { + x: 1546387200000, + y: 5, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); test('can render second spec points', () => { @@ -670,31 +741,39 @@ 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: { + 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: { + x: 1546387200000, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -752,23 +831,23 @@ describe('Rendering points - areas', () => { expect(points.length).toBe(7); // all the points expect(indexedGeometries.size).toEqual(9); - const nullIndexdGeometry = indexedGeometries.get(2); + const nullIndexdGeometry = indexedGeometries.get(2)!; + expect(nullIndexdGeometry).toBeDefined(); - expect(nullIndexdGeometry!.length).toBe(1); + expect(nullIndexdGeometry.length).toBe(1); + expect(isPointGeometry(nullIndexdGeometry[0])).toBe(true); // moved to the bottom of the chart - expect(nullIndexdGeometry![0].geom.y).toBe(100); + expect(nullIndexdGeometry[0].y).toBe(100); // 0 radius point - expect(nullIndexdGeometry![0].geom.width).toBe(0); - expect(nullIndexdGeometry![0].geom.height).toBe(0); + expect((nullIndexdGeometry[0] as PointGeometry).radius).toBe(0); - 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/src/lib/series/rendering.bars.test.ts b/src/lib/series/rendering.bars.test.ts index cc1013f5ec..0060f6a789 100644 --- a/src/lib/series/rendering.bars.test.ts +++ b/src/lib/series/rendering.bars.test.ts @@ -43,9 +43,8 @@ describe('Rendering bars', () => { height: 100, color: 'red', value: { - specId: SPEC_ID, - seriesKey: [], - datum: [0, 10], + x: 0, + y: 10, }, geometryId: { specId: SPEC_ID, @@ -59,9 +58,8 @@ describe('Rendering bars', () => { height: 50, color: 'red', value: { - specId: SPEC_ID, - seriesKey: [], - datum: [1, 5], + x: 1, + y: 5, }, geometryId: { specId: SPEC_ID, @@ -120,9 +118,8 @@ describe('Rendering bars', () => { height: 50, color: 'red', value: { - specId: spec1Id, - seriesKey: [], - datum: [0, 10], + x: 0, + y: 10, }, geometryId: { specId: spec1Id, @@ -136,9 +133,8 @@ describe('Rendering bars', () => { height: 25, color: 'red', value: { - specId: spec1Id, - seriesKey: [], - datum: [1, 5], + x: 1, + y: 5, }, geometryId: { specId: spec1Id, @@ -164,9 +160,8 @@ describe('Rendering bars', () => { height: 100, color: 'blue', value: { - specId: spec2Id, - seriesKey: [], - datum: [0, 20], + x: 0, + y: 20, }, geometryId: { specId: spec2Id, @@ -180,9 +175,8 @@ describe('Rendering bars', () => { height: 50, color: 'blue', value: { - specId: spec2Id, - seriesKey: [], - datum: [1, 10], + x: 1, + y: 10, }, geometryId: { specId: spec2Id, @@ -226,9 +220,8 @@ describe('Rendering bars', () => { height: 100, color: 'red', value: { - specId: SPEC_ID, - seriesKey: [], - datum: [0, 10], + x: 0, + y: 10, }, geometryId: { specId: SPEC_ID, @@ -242,9 +235,8 @@ describe('Rendering bars', () => { height: 50, color: 'red', value: { - specId: SPEC_ID, - seriesKey: [], - datum: [1, 5], + x: 1, + y: 5, }, geometryId: { specId: SPEC_ID, @@ -303,9 +295,8 @@ describe('Rendering bars', () => { height: 50, color: 'red', value: { - specId: spec1Id, - seriesKey: [], - datum: [0, 10], + x: 0, + y: 10, }, geometryId: { specId: spec1Id, @@ -319,9 +310,8 @@ describe('Rendering bars', () => { height: 25, color: 'red', value: { - specId: spec1Id, - seriesKey: [], - datum: [1, 5], + x: 1, + y: 5, }, geometryId: { specId: spec1Id, @@ -347,9 +337,8 @@ describe('Rendering bars', () => { height: 100, color: 'blue', value: { - specId: spec2Id, - seriesKey: [], - datum: [0, 20], + x: 0, + y: 20, }, geometryId: { specId: spec2Id, @@ -363,9 +352,8 @@ describe('Rendering bars', () => { height: 50, color: 'blue', value: { - specId: spec2Id, - seriesKey: [], - datum: [1, 10], + x: 1, + y: 10, }, geometryId: { specId: spec2Id, @@ -424,9 +412,8 @@ describe('Rendering bars', () => { height: 50, color: 'red', value: { - specId: spec1Id, - seriesKey: [], - datum: [1546300800000, 10], + x: 1546300800000, + y: 10, }, geometryId: { specId: spec1Id, @@ -440,9 +427,8 @@ describe('Rendering bars', () => { height: 25, color: 'red', value: { - specId: spec1Id, - seriesKey: [], - datum: [1546387200000, 5], + x: 1546387200000, + y: 5, }, geometryId: { specId: spec1Id, @@ -468,9 +454,8 @@ describe('Rendering bars', () => { height: 100, color: 'blue', value: { - specId: spec2Id, - seriesKey: [], - datum: [1546300800000, 20], + x: 1546300800000, + y: 20, }, geometryId: { specId: spec2Id, @@ -484,9 +469,8 @@ describe('Rendering bars', () => { height: 50, color: 'blue', value: { - specId: spec2Id, - seriesKey: [], - datum: [1546387200000, 10], + x: 1546387200000, + y: 10, }, geometryId: { specId: spec2Id, diff --git a/src/lib/series/rendering.lines.test.ts b/src/lib/series/rendering.lines.test.ts index cc9d11fe22..73bb1acef8 100644 --- a/src/lib/series/rendering.lines.test.ts +++ b/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'); @@ -61,31 +61,39 @@ 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: { + 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: { + x: 1, + y: 5, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -177,31 +185,39 @@ 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: { + 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: { + x: 1, + y: 5, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); test('can render second spec points', () => { @@ -214,30 +230,38 @@ describe('Rendering points - line', () => { x: 0, y: 0, color: 'blue', - value: { + radius: 10, + geometryId: { specId: spec2Id, seriesKey: [], - datum: [0, 20], + }, + value: { + 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: { + x: 1, + y: 10, }, transform: { x: 25, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -293,30 +317,38 @@ describe('Rendering points - line', () => { x: 0, y: 0, color: 'red', - value: { + radius: 10, + geometryId: { specId: SPEC_ID, seriesKey: [], - datum: [0, 10], + }, + value: { + 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: { + x: 1, + y: 5, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -407,31 +439,36 @@ 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: { + 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: { x: 1, y: 5 }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); test('can render second spec points', () => { @@ -444,30 +481,38 @@ describe('Rendering points - line', () => { x: 0, y: 0, color: 'blue', - value: { + radius: 10, + geometryId: { specId: spec2Id, seriesKey: [], - datum: [0, 20], + }, + value: { + 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: { + x: 1, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -522,31 +567,39 @@ 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: { + 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: { + x: 1546387200000, + y: 5, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -624,31 +677,39 @@ 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: { + 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: { + x: 1546387200000, + y: 5, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); test('can render second spec points', () => { @@ -660,31 +721,39 @@ 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: { + 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: { + x: 1546387200000, + y: 10, }, transform: { x: 0, y: 0, }, - }); + } as PointGeometry); expect(indexedGeometries.size).toEqual(points.length); }); }); @@ -741,23 +810,21 @@ describe('Rendering points - line', () => { expect(points.length).toBe(7); // all the points expect(indexedGeometries.size).toEqual(9); - const nullIndexdGeometry = indexedGeometries.get(2); + const nullIndexdGeometry = indexedGeometries.get(2)!; expect(nullIndexdGeometry).toBeDefined(); - expect(nullIndexdGeometry!.length).toBe(1); + expect(nullIndexdGeometry.length).toBe(1); // moved to the bottom of the chart - expect(nullIndexdGeometry![0].geom.y).toBe(100); + expect(nullIndexdGeometry[0].y).toBe(100); // 0 radius point - expect(nullIndexdGeometry![0].geom.width).toBe(0); - expect(nullIndexdGeometry![0].geom.height).toBe(0); + expect((nullIndexdGeometry[0] as PointGeometry).radius).toBe(0); - 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/src/lib/series/rendering.test.ts b/src/lib/series/rendering.test.ts index 9f72eae481..c7fb7d8760 100644 --- a/src/lib/series/rendering.test.ts +++ b/src/lib/series/rendering.test.ts @@ -1,14 +1,22 @@ -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: { 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 +27,23 @@ 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: { + 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/src/lib/series/rendering.ts b/src/lib/series/rendering.ts index 694ebca584..d55062055e 100644 --- a/src/lib/series/rendering.ts +++ b/src/lib/series/rendering.ts @@ -14,8 +14,9 @@ export interface GeometryId { seriesKey: any[]; } -export interface GeometryValue extends GeometryId { - datum: any; +export interface GeometryValue { + y: any; + x: any; } /** Shared style properties for varies geometries */ @@ -23,26 +24,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 +44,8 @@ export interface BarGeometry { width: number; height: number; color: string; - value: GeometryValue; geometryId: GeometryId; + value: GeometryValue; } export interface LineGeometry { line: string; @@ -75,6 +69,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[], @@ -97,7 +98,7 @@ export function renderPoints( const points: PointGeometry[] = []; const yDatums = [datum.y1]; if (hasY0Accessors) { - yDatums.push(datum.y0); + yDatums.unshift(datum.y0); } yDatums.forEach((yDatum) => { let y; @@ -110,34 +111,25 @@ export function renderPoints( } else { y = yScale.scale(yDatum); } - const indexedGeometry: IndexedGeometry = { - specId, - datum: datum.datum, - color, - seriesKey, - geom: { - x: x + shift, - y, - width: radius, - height: radius, - isPoint: true, - }, - }; - mutableIndexedGeometryMapUpsert(indexedGeometries, datum.x, indexedGeometry); const pointGeometry: PointGeometry = { + radius, x, y, color, value: { - specId, - datum: datum.datum, - seriesKey, + x: datum.x, + y: yDatum, }, transform: { x: shift, y: 0, }, + geometryId: { + specId, + seriesKey, + }, }; + mutableIndexedGeometryMapUpsert(indexedGeometries, datum.x, pointGeometry); if (!isHidden) { points.push(pointGeometry); } @@ -192,35 +184,22 @@ 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: y1, }, geometryId: { specId, seriesKey, }, }; + mutableIndexedGeometryMapUpsert(indexedGeometries, datum.x, barGeometry); barGeometries.push(barGeometry); }); return { @@ -376,14 +355,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/src/lib/series/tooltip.ts b/src/lib/series/tooltip.ts index bb79d3ccb4..d526499c40 100644 --- a/src/lib/series/tooltip.ts +++ b/src/lib/series/tooltip.ts @@ -3,11 +3,9 @@ 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, TickFormatter } from './specs'; -export function getSeriesTooltipValues( - tooltipValues: TooltipValue[], -): Map { +export function getSeriesTooltipValues(tooltipValues: TooltipValue[]): Map { // map from seriesKey to tooltipValue const seriesTooltipValues = new Map(); @@ -31,7 +29,8 @@ export function formatTooltip( isHighlighted: boolean, yAxis?: AxisSpec, ): TooltipValue[] { - const { seriesKey, datum } = searchIndexValue; + const { y } = searchIndexValue.value; + const { seriesKey } = searchIndexValue.geometryId; let yAccessors = spec.yAccessors; if (yAccessors.length > 1) { // the last element of the seriesKey is the yAccessor @@ -39,7 +38,7 @@ export function formatTooltip( } let name: string | undefined; if (seriesKey.length > 0) { - name = searchIndexValue.seriesKey.join(' - '); + name = seriesKey.join(' - '); } else { name = spec.name || `${spec.id}`; } @@ -47,7 +46,7 @@ export function formatTooltip( return formatAccessor( spec.id, seriesKey, - datum, + y, yAccessors, color, yAxis ? yAxis.tickFormat : emptyFormatter, @@ -70,15 +69,17 @@ export function formatXTooltipValue( xAxis?: AxisSpec, ): TooltipValue { let name: string | undefined; - if (searchIndexValue.seriesKey.length > 0) { - name = searchIndexValue.seriesKey.join(' - '); + const { seriesKey } = searchIndexValue.geometryId; + const { x } = searchIndexValue.value; + if (seriesKey.length > 0) { + name = seriesKey.join(' - '); } else { name = spec.name || `${spec.id}`; } const xValues = formatAccessor( spec.id, - searchIndexValue.seriesKey, - searchIndexValue.datum, + seriesKey, + x, [spec.xAccessor], color, xAxis ? xAxis.tickFormat : emptyFormatter, @@ -92,7 +93,7 @@ export function formatXTooltipValue( export function formatAccessor( specId: SpecId, seriesKeys: any[], - datum: Datum, + value: any, accessors: Accessor[] = [], color: string, formatter: TickFormatter, @@ -107,7 +108,7 @@ export function formatAccessor( return { seriesKey, name: name || `${accessor}`, - value: formatter(datum[accessor]), + value: formatter(value), color, isHighlighted, isXValue, diff --git a/src/lib/utils/interactions.test.ts b/src/lib/utils/interactions.test.ts index de3e7a2fa5..adef5c69e7 100644 --- a/src/lib/utils/interactions.test.ts +++ b/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,99 @@ import { isFollowTooltipType, TooltipType, } from './interactions'; - const ig1: IndexedGeometry = { - specId: getSpecId('ig1'), color: 'red', - geom: { + geometryId: { + specId: getSpecId('ig1'), + seriesKey: [0, 1, 2], + }, + value: { 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: { 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: { + 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: { + 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: { + 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: { + 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 +152,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/src/lib/utils/interactions.ts b/src/lib/utils/interactions.ts index 196ab34667..9c937a60b3 100644 --- a/src/lib/utils/interactions.ts +++ b/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'; @@ -91,13 +97,33 @@ export function areIndexedGeometryArraysEquals(arr1: IndexedGeometry[], arr2: In } 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/src/state/chart_state.test.ts b/src/state/chart_state.test.ts index 3cb34c308f..e0e8154a72 100644 --- a/src/state/chart_state.test.ts +++ b/src/state/chart_state.test.ts @@ -664,27 +664,33 @@ 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, }, - 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, + }, + x: 50, + y: 0, + width: 0, + height: 0, }; const clickListener = jest.fn( (ds: GeometryValue[]): void => { diff --git a/src/state/chart_state.ts b/src/state/chart_state.ts index 8ef292c3c4..21136354a9 100644 --- a/src/state/chart_state.ts +++ b/src/state/chart_state.ts @@ -328,7 +328,10 @@ export class ChartStore { const newHighlightedGeometries: IndexedGeometry[] = []; const tooltipValues = elements.reduce( (acc, indexedGeometry) => { - const { specId, color } = indexedGeometry; + const { + geometryId: { specId }, + color, + } = indexedGeometry; const spec = this.seriesSpecs.get(specId); // safe guard check diff --git a/src/state/test/interactions.test.ts b/src/state/test/interactions.test.ts index 7b361bada0..efd4ce3fc4 100644 --- a/src/state/test/interactions.test.ts +++ b/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,35 @@ 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, }, - datum: [0, 10], - specId: SPEC_ID, - seriesKey: [], + geometryId: { + 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, + }, + geometryId: { + specId: SPEC_ID, + seriesKey: [], }, - datum: [1, 5], - specId: SPEC_ID, - seriesKey: [], }; describe('Chart state pointer interactions', () => { diff --git a/stories/mixed.tsx b/stories/mixed.tsx index 1368ae86d1..957d322c64 100644 --- a/stories/mixed.tsx +++ b/stories/mixed.tsx @@ -20,12 +20,7 @@ storiesOf('Mixed Charts', module) return ( - + ); From 7424aae834c9d7669e339bae180892ad88920f8c Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Tue, 9 Apr 2019 23:48:50 +0200 Subject: [PATCH 03/11] docs(band): update band chart story --- stories/area_chart.tsx | 193 ++++++++++++++++------------------------- 1 file changed, 73 insertions(+), 120 deletions(-) diff --git a/stories/area_chart.tsx b/stories/area_chart.tsx index 35d8320f34..397b5e151b 100644 --- a/stories/area_chart.tsx +++ b/stories/area_chart.tsx @@ -9,6 +9,7 @@ import { CurveType, getAxisId, getSpecId, + LineSeries, Position, ScaleType, Settings, @@ -367,11 +368,18 @@ storiesOf('Area Chart', module) ); }) - .add('band area chart', () => { + .add('Band area chart', () => { const data = KIBANA_METRICS.metrics.kibana_os_load[0].data.map((d) => { - return [d[0], d[1], d[1] - 4]; + return { + x: d[0], + max: d[1] + 4 + 4 * Math.random(), + min: d[1] - 4 - 4 * Math.random(), + }; }); - const scaleToDataExtent = boolean('scale to extent', false); + 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 ( + + ); }) - .add( - 'stacked band area chart', - () => { - const data = KIBANA_METRICS.metrics.kibana_os_load[0].data - .map((d) => { - // return [d[0], d[1], d[1] - 4]; - return [d[0], 8, 4.5]; - }) - .slice(0, 5); - const data2 = KIBANA_METRICS.metrics.kibana_os_load[0].data - .map((d) => { - return [d[0], 4, 2]; - }) - .slice(0, 5); - const scaleToDataExtent = boolean('scale to extent', false); - return ( - - - Number(d).toFixed(2)} - /> - - - - - - ); - }, - { - info: { - text: 'Don\' try that at home :)', - }, - }, - ) - .add( - 'simple stacked band area chart', - () => { - const data1 = [[0, 7, 2], [1, 5, 2], [2, 5, 2], [3, 5, 2], [4, 5, 2]]; - const data2 = [[0, 6, 3], [1, 7, 4], [2, 8, 3], [3, 6, 3], [4, 6, 3]]; - const scaleToDataExtent = boolean('scale to extent', false); - 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)} + /> - + - - - ); - }, - { - info: { - text: 'Don\' try that at home :)', - }, - }, - ); + + + ); + }); From 4fad2300826d61c342987dad9b46b4d05d79b126 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Tue, 9 Apr 2019 23:51:10 +0200 Subject: [PATCH 04/11] refactor: return initialY values on GeometryValue --- .../series/__snapshots__/series.test.ts.snap | 4068 +++++++++++++++++ src/lib/series/rendering.areas.test.ts | 18 + src/lib/series/rendering.bars.test.ts | 16 + src/lib/series/rendering.lines.test.ts | 23 +- src/lib/series/rendering.ts | 8 +- src/lib/series/series.ts | 10 + src/lib/series/tooltip.ts | 11 +- src/state/__snapshots__/utils.test.ts.snap | 48 + src/state/annotation_marker.test.tsx | 51 +- src/state/chart_state.test.ts | 6 +- src/state/chart_state.ts | 4 +- src/state/test/interactions.test.ts | 16 +- 12 files changed, 4242 insertions(+), 37 deletions(-) diff --git a/src/lib/series/__snapshots__/series.test.ts.snap b/src/lib/series/__snapshots__/series.test.ts.snap index 369513fb78..037f6cf473 100644 --- a/src/lib/series/__snapshots__/series.test.ts.snap +++ b/src/lib/series/__snapshots__/series.test.ts.snap @@ -1275,6000 +1275,8000 @@ Array [ "data": Array [ Object { "datum": undefined, + "initialY0": 0, + "initialY1": 0, "x": 0, "y0": 0, "y1": 0, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 1, "x": 1, "y0": 0, "y1": 1, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 2, "x": 2, "y0": 0, "y1": 2, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 3, "x": 3, "y0": 0, "y1": 3, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 4, "x": 4, "y0": 0, "y1": 4, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 5, "x": 5, "y0": 0, "y1": 5, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 6, "x": 6, "y0": 0, "y1": 6, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 7, "x": 7, "y0": 0, "y1": 7, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 8, "x": 8, "y0": 0, "y1": 8, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 9, "x": 9, "y0": 0, "y1": 9, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 10, "x": 10, "y0": 0, "y1": 10, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 11, "x": 11, "y0": 0, "y1": 11, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 12, "x": 12, "y0": 0, "y1": 12, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 13, "x": 13, "y0": 0, "y1": 13, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 14, "x": 14, "y0": 0, "y1": 14, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 15, "x": 15, "y0": 0, "y1": 15, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 16, "x": 16, "y0": 0, "y1": 16, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 17, "x": 17, "y0": 0, "y1": 17, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 18, "x": 18, "y0": 0, "y1": 18, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 19, "x": 19, "y0": 0, "y1": 19, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 20, "x": 20, "y0": 0, "y1": 20, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 21, "x": 21, "y0": 0, "y1": 21, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 22, "x": 22, "y0": 0, "y1": 22, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 23, "x": 23, "y0": 0, "y1": 23, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 24, "x": 24, "y0": 0, "y1": 24, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 25, "x": 25, "y0": 0, "y1": 25, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 26, "x": 26, "y0": 0, "y1": 26, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 27, "x": 27, "y0": 0, "y1": 27, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 28, "x": 28, "y0": 0, "y1": 28, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 29, "x": 29, "y0": 0, "y1": 29, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 30, "x": 30, "y0": 0, "y1": 30, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 31, "x": 31, "y0": 0, "y1": 31, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 32, "x": 32, "y0": 0, "y1": 32, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 33, "x": 33, "y0": 0, "y1": 33, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 34, "x": 34, "y0": 0, "y1": 34, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 35, "x": 35, "y0": 0, "y1": 35, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 36, "x": 36, "y0": 0, "y1": 36, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 37, "x": 37, "y0": 0, "y1": 37, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 38, "x": 38, "y0": 0, "y1": 38, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 39, "x": 39, "y0": 0, "y1": 39, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 40, "x": 40, "y0": 0, "y1": 40, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 41, "x": 41, "y0": 0, "y1": 41, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 42, "x": 42, "y0": 0, "y1": 42, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 43, "x": 43, "y0": 0, "y1": 43, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 44, "x": 44, "y0": 0, "y1": 44, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 45, "x": 45, "y0": 0, "y1": 45, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 46, "x": 46, "y0": 0, "y1": 46, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 47, "x": 47, "y0": 0, "y1": 47, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 48, "x": 48, "y0": 0, "y1": 48, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 49, "x": 49, "y0": 0, "y1": 49, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 50, "x": 50, "y0": 0, "y1": 50, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 51, "x": 51, "y0": 0, "y1": 51, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 52, "x": 52, "y0": 0, "y1": 52, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 53, "x": 53, "y0": 0, "y1": 53, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 54, "x": 54, "y0": 0, "y1": 54, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 55, "x": 55, "y0": 0, "y1": 55, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 56, "x": 56, "y0": 0, "y1": 56, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 57, "x": 57, "y0": 0, "y1": 57, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 58, "x": 58, "y0": 0, "y1": 58, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 59, "x": 59, "y0": 0, "y1": 59, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 60, "x": 60, "y0": 0, "y1": 60, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 61, "x": 61, "y0": 0, "y1": 61, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 62, "x": 62, "y0": 0, "y1": 62, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 63, "x": 63, "y0": 0, "y1": 63, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 64, "x": 64, "y0": 0, "y1": 64, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 65, "x": 65, "y0": 0, "y1": 65, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 66, "x": 66, "y0": 0, "y1": 66, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 67, "x": 67, "y0": 0, "y1": 67, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 68, "x": 68, "y0": 0, "y1": 68, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 69, "x": 69, "y0": 0, "y1": 69, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 70, "x": 70, "y0": 0, "y1": 70, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 71, "x": 71, "y0": 0, "y1": 71, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 72, "x": 72, "y0": 0, "y1": 72, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 73, "x": 73, "y0": 0, "y1": 73, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 74, "x": 74, "y0": 0, "y1": 74, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 75, "x": 75, "y0": 0, "y1": 75, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 76, "x": 76, "y0": 0, "y1": 76, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 77, "x": 77, "y0": 0, "y1": 77, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 78, "x": 78, "y0": 0, "y1": 78, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 79, "x": 79, "y0": 0, "y1": 79, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 80, "x": 80, "y0": 0, "y1": 80, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 81, "x": 81, "y0": 0, "y1": 81, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 82, "x": 82, "y0": 0, "y1": 82, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 83, "x": 83, "y0": 0, "y1": 83, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 84, "x": 84, "y0": 0, "y1": 84, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 85, "x": 85, "y0": 0, "y1": 85, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 86, "x": 86, "y0": 0, "y1": 86, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 87, "x": 87, "y0": 0, "y1": 87, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 88, "x": 88, "y0": 0, "y1": 88, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 89, "x": 89, "y0": 0, "y1": 89, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 90, "x": 90, "y0": 0, "y1": 90, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 91, "x": 91, "y0": 0, "y1": 91, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 92, "x": 92, "y0": 0, "y1": 92, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 93, "x": 93, "y0": 0, "y1": 93, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 94, "x": 94, "y0": 0, "y1": 94, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 95, "x": 95, "y0": 0, "y1": 95, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 96, "x": 96, "y0": 0, "y1": 96, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 97, "x": 97, "y0": 0, "y1": 97, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 98, "x": 98, "y0": 0, "y1": 98, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 99, "x": 99, "y0": 0, "y1": 99, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 100, "x": 100, "y0": 0, "y1": 100, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 101, "x": 101, "y0": 0, "y1": 101, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 102, "x": 102, "y0": 0, "y1": 102, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 103, "x": 103, "y0": 0, "y1": 103, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 104, "x": 104, "y0": 0, "y1": 104, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 105, "x": 105, "y0": 0, "y1": 105, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 106, "x": 106, "y0": 0, "y1": 106, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 107, "x": 107, "y0": 0, "y1": 107, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 108, "x": 108, "y0": 0, "y1": 108, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 109, "x": 109, "y0": 0, "y1": 109, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 110, "x": 110, "y0": 0, "y1": 110, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 111, "x": 111, "y0": 0, "y1": 111, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 112, "x": 112, "y0": 0, "y1": 112, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 113, "x": 113, "y0": 0, "y1": 113, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 114, "x": 114, "y0": 0, "y1": 114, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 115, "x": 115, "y0": 0, "y1": 115, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 116, "x": 116, "y0": 0, "y1": 116, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 117, "x": 117, "y0": 0, "y1": 117, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 118, "x": 118, "y0": 0, "y1": 118, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 119, "x": 119, "y0": 0, "y1": 119, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 120, "x": 120, "y0": 0, "y1": 120, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 121, "x": 121, "y0": 0, "y1": 121, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 122, "x": 122, "y0": 0, "y1": 122, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 123, "x": 123, "y0": 0, "y1": 123, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 124, "x": 124, "y0": 0, "y1": 124, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 125, "x": 125, "y0": 0, "y1": 125, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 126, "x": 126, "y0": 0, "y1": 126, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 127, "x": 127, "y0": 0, "y1": 127, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 128, "x": 128, "y0": 0, "y1": 128, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 129, "x": 129, "y0": 0, "y1": 129, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 130, "x": 130, "y0": 0, "y1": 130, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 131, "x": 131, "y0": 0, "y1": 131, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 132, "x": 132, "y0": 0, "y1": 132, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 133, "x": 133, "y0": 0, "y1": 133, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 134, "x": 134, "y0": 0, "y1": 134, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 135, "x": 135, "y0": 0, "y1": 135, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 136, "x": 136, "y0": 0, "y1": 136, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 137, "x": 137, "y0": 0, "y1": 137, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 138, "x": 138, "y0": 0, "y1": 138, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 139, "x": 139, "y0": 0, "y1": 139, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 140, "x": 140, "y0": 0, "y1": 140, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 141, "x": 141, "y0": 0, "y1": 141, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 142, "x": 142, "y0": 0, "y1": 142, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 143, "x": 143, "y0": 0, "y1": 143, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 144, "x": 144, "y0": 0, "y1": 144, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 145, "x": 145, "y0": 0, "y1": 145, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 146, "x": 146, "y0": 0, "y1": 146, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 147, "x": 147, "y0": 0, "y1": 147, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 148, "x": 148, "y0": 0, "y1": 148, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 149, "x": 149, "y0": 0, "y1": 149, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 150, "x": 150, "y0": 0, "y1": 150, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 151, "x": 151, "y0": 0, "y1": 151, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 152, "x": 152, "y0": 0, "y1": 152, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 153, "x": 153, "y0": 0, "y1": 153, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 154, "x": 154, "y0": 0, "y1": 154, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 155, "x": 155, "y0": 0, "y1": 155, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 156, "x": 156, "y0": 0, "y1": 156, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 157, "x": 157, "y0": 0, "y1": 157, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 158, "x": 158, "y0": 0, "y1": 158, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 159, "x": 159, "y0": 0, "y1": 159, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 160, "x": 160, "y0": 0, "y1": 160, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 161, "x": 161, "y0": 0, "y1": 161, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 162, "x": 162, "y0": 0, "y1": 162, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 163, "x": 163, "y0": 0, "y1": 163, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 164, "x": 164, "y0": 0, "y1": 164, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 165, "x": 165, "y0": 0, "y1": 165, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 166, "x": 166, "y0": 0, "y1": 166, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 167, "x": 167, "y0": 0, "y1": 167, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 168, "x": 168, "y0": 0, "y1": 168, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 169, "x": 169, "y0": 0, "y1": 169, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 170, "x": 170, "y0": 0, "y1": 170, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 171, "x": 171, "y0": 0, "y1": 171, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 172, "x": 172, "y0": 0, "y1": 172, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 173, "x": 173, "y0": 0, "y1": 173, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 174, "x": 174, "y0": 0, "y1": 174, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 175, "x": 175, "y0": 0, "y1": 175, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 176, "x": 176, "y0": 0, "y1": 176, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 177, "x": 177, "y0": 0, "y1": 177, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 178, "x": 178, "y0": 0, "y1": 178, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 179, "x": 179, "y0": 0, "y1": 179, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 180, "x": 180, "y0": 0, "y1": 180, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 181, "x": 181, "y0": 0, "y1": 181, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 182, "x": 182, "y0": 0, "y1": 182, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 183, "x": 183, "y0": 0, "y1": 183, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 184, "x": 184, "y0": 0, "y1": 184, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 185, "x": 185, "y0": 0, "y1": 185, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 186, "x": 186, "y0": 0, "y1": 186, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 187, "x": 187, "y0": 0, "y1": 187, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 188, "x": 188, "y0": 0, "y1": 188, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 189, "x": 189, "y0": 0, "y1": 189, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 190, "x": 190, "y0": 0, "y1": 190, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 191, "x": 191, "y0": 0, "y1": 191, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 192, "x": 192, "y0": 0, "y1": 192, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 193, "x": 193, "y0": 0, "y1": 193, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 194, "x": 194, "y0": 0, "y1": 194, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 195, "x": 195, "y0": 0, "y1": 195, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 196, "x": 196, "y0": 0, "y1": 196, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 197, "x": 197, "y0": 0, "y1": 197, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 198, "x": 198, "y0": 0, "y1": 198, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 199, "x": 199, "y0": 0, "y1": 199, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 200, "x": 200, "y0": 0, "y1": 200, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 201, "x": 201, "y0": 0, "y1": 201, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 202, "x": 202, "y0": 0, "y1": 202, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 203, "x": 203, "y0": 0, "y1": 203, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 204, "x": 204, "y0": 0, "y1": 204, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 205, "x": 205, "y0": 0, "y1": 205, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 206, "x": 206, "y0": 0, "y1": 206, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 207, "x": 207, "y0": 0, "y1": 207, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 208, "x": 208, "y0": 0, "y1": 208, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 209, "x": 209, "y0": 0, "y1": 209, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 210, "x": 210, "y0": 0, "y1": 210, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 211, "x": 211, "y0": 0, "y1": 211, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 212, "x": 212, "y0": 0, "y1": 212, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 213, "x": 213, "y0": 0, "y1": 213, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 214, "x": 214, "y0": 0, "y1": 214, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 215, "x": 215, "y0": 0, "y1": 215, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 216, "x": 216, "y0": 0, "y1": 216, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 217, "x": 217, "y0": 0, "y1": 217, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 218, "x": 218, "y0": 0, "y1": 218, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 219, "x": 219, "y0": 0, "y1": 219, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 220, "x": 220, "y0": 0, "y1": 220, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 221, "x": 221, "y0": 0, "y1": 221, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 222, "x": 222, "y0": 0, "y1": 222, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 223, "x": 223, "y0": 0, "y1": 223, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 224, "x": 224, "y0": 0, "y1": 224, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 225, "x": 225, "y0": 0, "y1": 225, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 226, "x": 226, "y0": 0, "y1": 226, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 227, "x": 227, "y0": 0, "y1": 227, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 228, "x": 228, "y0": 0, "y1": 228, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 229, "x": 229, "y0": 0, "y1": 229, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 230, "x": 230, "y0": 0, "y1": 230, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 231, "x": 231, "y0": 0, "y1": 231, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 232, "x": 232, "y0": 0, "y1": 232, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 233, "x": 233, "y0": 0, "y1": 233, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 234, "x": 234, "y0": 0, "y1": 234, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 235, "x": 235, "y0": 0, "y1": 235, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 236, "x": 236, "y0": 0, "y1": 236, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 237, "x": 237, "y0": 0, "y1": 237, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 238, "x": 238, "y0": 0, "y1": 238, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 239, "x": 239, "y0": 0, "y1": 239, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 240, "x": 240, "y0": 0, "y1": 240, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 241, "x": 241, "y0": 0, "y1": 241, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 242, "x": 242, "y0": 0, "y1": 242, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 243, "x": 243, "y0": 0, "y1": 243, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 244, "x": 244, "y0": 0, "y1": 244, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 245, "x": 245, "y0": 0, "y1": 245, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 246, "x": 246, "y0": 0, "y1": 246, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 247, "x": 247, "y0": 0, "y1": 247, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 248, "x": 248, "y0": 0, "y1": 248, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 249, "x": 249, "y0": 0, "y1": 249, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 250, "x": 250, "y0": 0, "y1": 250, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 251, "x": 251, "y0": 0, "y1": 251, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 252, "x": 252, "y0": 0, "y1": 252, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 253, "x": 253, "y0": 0, "y1": 253, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 254, "x": 254, "y0": 0, "y1": 254, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 255, "x": 255, "y0": 0, "y1": 255, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 256, "x": 256, "y0": 0, "y1": 256, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 257, "x": 257, "y0": 0, "y1": 257, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 258, "x": 258, "y0": 0, "y1": 258, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 259, "x": 259, "y0": 0, "y1": 259, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 260, "x": 260, "y0": 0, "y1": 260, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 261, "x": 261, "y0": 0, "y1": 261, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 262, "x": 262, "y0": 0, "y1": 262, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 263, "x": 263, "y0": 0, "y1": 263, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 264, "x": 264, "y0": 0, "y1": 264, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 265, "x": 265, "y0": 0, "y1": 265, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 266, "x": 266, "y0": 0, "y1": 266, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 267, "x": 267, "y0": 0, "y1": 267, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 268, "x": 268, "y0": 0, "y1": 268, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 269, "x": 269, "y0": 0, "y1": 269, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 270, "x": 270, "y0": 0, "y1": 270, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 271, "x": 271, "y0": 0, "y1": 271, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 272, "x": 272, "y0": 0, "y1": 272, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 273, "x": 273, "y0": 0, "y1": 273, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 274, "x": 274, "y0": 0, "y1": 274, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 275, "x": 275, "y0": 0, "y1": 275, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 276, "x": 276, "y0": 0, "y1": 276, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 277, "x": 277, "y0": 0, "y1": 277, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 278, "x": 278, "y0": 0, "y1": 278, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 279, "x": 279, "y0": 0, "y1": 279, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 280, "x": 280, "y0": 0, "y1": 280, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 281, "x": 281, "y0": 0, "y1": 281, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 282, "x": 282, "y0": 0, "y1": 282, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 283, "x": 283, "y0": 0, "y1": 283, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 284, "x": 284, "y0": 0, "y1": 284, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 285, "x": 285, "y0": 0, "y1": 285, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 286, "x": 286, "y0": 0, "y1": 286, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 287, "x": 287, "y0": 0, "y1": 287, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 288, "x": 288, "y0": 0, "y1": 288, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 289, "x": 289, "y0": 0, "y1": 289, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 290, "x": 290, "y0": 0, "y1": 290, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 291, "x": 291, "y0": 0, "y1": 291, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 292, "x": 292, "y0": 0, "y1": 292, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 293, "x": 293, "y0": 0, "y1": 293, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 294, "x": 294, "y0": 0, "y1": 294, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 295, "x": 295, "y0": 0, "y1": 295, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 296, "x": 296, "y0": 0, "y1": 296, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 297, "x": 297, "y0": 0, "y1": 297, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 298, "x": 298, "y0": 0, "y1": 298, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 299, "x": 299, "y0": 0, "y1": 299, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 300, "x": 300, "y0": 0, "y1": 300, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 301, "x": 301, "y0": 0, "y1": 301, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 302, "x": 302, "y0": 0, "y1": 302, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 303, "x": 303, "y0": 0, "y1": 303, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 304, "x": 304, "y0": 0, "y1": 304, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 305, "x": 305, "y0": 0, "y1": 305, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 306, "x": 306, "y0": 0, "y1": 306, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 307, "x": 307, "y0": 0, "y1": 307, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 308, "x": 308, "y0": 0, "y1": 308, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 309, "x": 309, "y0": 0, "y1": 309, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 310, "x": 310, "y0": 0, "y1": 310, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 311, "x": 311, "y0": 0, "y1": 311, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 312, "x": 312, "y0": 0, "y1": 312, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 313, "x": 313, "y0": 0, "y1": 313, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 314, "x": 314, "y0": 0, "y1": 314, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 315, "x": 315, "y0": 0, "y1": 315, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 316, "x": 316, "y0": 0, "y1": 316, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 317, "x": 317, "y0": 0, "y1": 317, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 318, "x": 318, "y0": 0, "y1": 318, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 319, "x": 319, "y0": 0, "y1": 319, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 320, "x": 320, "y0": 0, "y1": 320, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 321, "x": 321, "y0": 0, "y1": 321, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 322, "x": 322, "y0": 0, "y1": 322, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 323, "x": 323, "y0": 0, "y1": 323, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 324, "x": 324, "y0": 0, "y1": 324, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 325, "x": 325, "y0": 0, "y1": 325, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 326, "x": 326, "y0": 0, "y1": 326, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 327, "x": 327, "y0": 0, "y1": 327, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 328, "x": 328, "y0": 0, "y1": 328, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 329, "x": 329, "y0": 0, "y1": 329, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 330, "x": 330, "y0": 0, "y1": 330, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 331, "x": 331, "y0": 0, "y1": 331, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 332, "x": 332, "y0": 0, "y1": 332, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 333, "x": 333, "y0": 0, "y1": 333, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 334, "x": 334, "y0": 0, "y1": 334, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 335, "x": 335, "y0": 0, "y1": 335, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 336, "x": 336, "y0": 0, "y1": 336, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 337, "x": 337, "y0": 0, "y1": 337, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 338, "x": 338, "y0": 0, "y1": 338, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 339, "x": 339, "y0": 0, "y1": 339, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 340, "x": 340, "y0": 0, "y1": 340, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 341, "x": 341, "y0": 0, "y1": 341, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 342, "x": 342, "y0": 0, "y1": 342, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 343, "x": 343, "y0": 0, "y1": 343, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 344, "x": 344, "y0": 0, "y1": 344, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 345, "x": 345, "y0": 0, "y1": 345, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 346, "x": 346, "y0": 0, "y1": 346, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 347, "x": 347, "y0": 0, "y1": 347, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 348, "x": 348, "y0": 0, "y1": 348, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 349, "x": 349, "y0": 0, "y1": 349, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 350, "x": 350, "y0": 0, "y1": 350, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 351, "x": 351, "y0": 0, "y1": 351, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 352, "x": 352, "y0": 0, "y1": 352, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 353, "x": 353, "y0": 0, "y1": 353, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 354, "x": 354, "y0": 0, "y1": 354, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 355, "x": 355, "y0": 0, "y1": 355, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 356, "x": 356, "y0": 0, "y1": 356, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 357, "x": 357, "y0": 0, "y1": 357, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 358, "x": 358, "y0": 0, "y1": 358, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 359, "x": 359, "y0": 0, "y1": 359, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 360, "x": 360, "y0": 0, "y1": 360, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 361, "x": 361, "y0": 0, "y1": 361, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 362, "x": 362, "y0": 0, "y1": 362, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 363, "x": 363, "y0": 0, "y1": 363, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 364, "x": 364, "y0": 0, "y1": 364, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 365, "x": 365, "y0": 0, "y1": 365, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 366, "x": 366, "y0": 0, "y1": 366, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 367, "x": 367, "y0": 0, "y1": 367, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 368, "x": 368, "y0": 0, "y1": 368, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 369, "x": 369, "y0": 0, "y1": 369, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 370, "x": 370, "y0": 0, "y1": 370, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 371, "x": 371, "y0": 0, "y1": 371, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 372, "x": 372, "y0": 0, "y1": 372, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 373, "x": 373, "y0": 0, "y1": 373, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 374, "x": 374, "y0": 0, "y1": 374, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 375, "x": 375, "y0": 0, "y1": 375, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 376, "x": 376, "y0": 0, "y1": 376, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 377, "x": 377, "y0": 0, "y1": 377, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 378, "x": 378, "y0": 0, "y1": 378, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 379, "x": 379, "y0": 0, "y1": 379, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 380, "x": 380, "y0": 0, "y1": 380, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 381, "x": 381, "y0": 0, "y1": 381, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 382, "x": 382, "y0": 0, "y1": 382, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 383, "x": 383, "y0": 0, "y1": 383, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 384, "x": 384, "y0": 0, "y1": 384, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 385, "x": 385, "y0": 0, "y1": 385, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 386, "x": 386, "y0": 0, "y1": 386, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 387, "x": 387, "y0": 0, "y1": 387, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 388, "x": 388, "y0": 0, "y1": 388, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 389, "x": 389, "y0": 0, "y1": 389, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 390, "x": 390, "y0": 0, "y1": 390, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 391, "x": 391, "y0": 0, "y1": 391, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 392, "x": 392, "y0": 0, "y1": 392, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 393, "x": 393, "y0": 0, "y1": 393, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 394, "x": 394, "y0": 0, "y1": 394, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 395, "x": 395, "y0": 0, "y1": 395, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 396, "x": 396, "y0": 0, "y1": 396, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 397, "x": 397, "y0": 0, "y1": 397, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 398, "x": 398, "y0": 0, "y1": 398, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 399, "x": 399, "y0": 0, "y1": 399, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 400, "x": 400, "y0": 0, "y1": 400, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 401, "x": 401, "y0": 0, "y1": 401, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 402, "x": 402, "y0": 0, "y1": 402, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 403, "x": 403, "y0": 0, "y1": 403, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 404, "x": 404, "y0": 0, "y1": 404, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 405, "x": 405, "y0": 0, "y1": 405, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 406, "x": 406, "y0": 0, "y1": 406, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 407, "x": 407, "y0": 0, "y1": 407, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 408, "x": 408, "y0": 0, "y1": 408, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 409, "x": 409, "y0": 0, "y1": 409, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 410, "x": 410, "y0": 0, "y1": 410, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 411, "x": 411, "y0": 0, "y1": 411, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 412, "x": 412, "y0": 0, "y1": 412, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 413, "x": 413, "y0": 0, "y1": 413, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 414, "x": 414, "y0": 0, "y1": 414, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 415, "x": 415, "y0": 0, "y1": 415, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 416, "x": 416, "y0": 0, "y1": 416, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 417, "x": 417, "y0": 0, "y1": 417, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 418, "x": 418, "y0": 0, "y1": 418, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 419, "x": 419, "y0": 0, "y1": 419, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 420, "x": 420, "y0": 0, "y1": 420, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 421, "x": 421, "y0": 0, "y1": 421, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 422, "x": 422, "y0": 0, "y1": 422, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 423, "x": 423, "y0": 0, "y1": 423, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 424, "x": 424, "y0": 0, "y1": 424, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 425, "x": 425, "y0": 0, "y1": 425, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 426, "x": 426, "y0": 0, "y1": 426, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 427, "x": 427, "y0": 0, "y1": 427, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 428, "x": 428, "y0": 0, "y1": 428, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 429, "x": 429, "y0": 0, "y1": 429, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 430, "x": 430, "y0": 0, "y1": 430, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 431, "x": 431, "y0": 0, "y1": 431, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 432, "x": 432, "y0": 0, "y1": 432, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 433, "x": 433, "y0": 0, "y1": 433, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 434, "x": 434, "y0": 0, "y1": 434, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 435, "x": 435, "y0": 0, "y1": 435, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 436, "x": 436, "y0": 0, "y1": 436, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 437, "x": 437, "y0": 0, "y1": 437, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 438, "x": 438, "y0": 0, "y1": 438, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 439, "x": 439, "y0": 0, "y1": 439, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 440, "x": 440, "y0": 0, "y1": 440, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 441, "x": 441, "y0": 0, "y1": 441, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 442, "x": 442, "y0": 0, "y1": 442, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 443, "x": 443, "y0": 0, "y1": 443, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 444, "x": 444, "y0": 0, "y1": 444, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 445, "x": 445, "y0": 0, "y1": 445, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 446, "x": 446, "y0": 0, "y1": 446, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 447, "x": 447, "y0": 0, "y1": 447, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 448, "x": 448, "y0": 0, "y1": 448, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 449, "x": 449, "y0": 0, "y1": 449, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 450, "x": 450, "y0": 0, "y1": 450, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 451, "x": 451, "y0": 0, "y1": 451, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 452, "x": 452, "y0": 0, "y1": 452, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 453, "x": 453, "y0": 0, "y1": 453, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 454, "x": 454, "y0": 0, "y1": 454, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 455, "x": 455, "y0": 0, "y1": 455, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 456, "x": 456, "y0": 0, "y1": 456, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 457, "x": 457, "y0": 0, "y1": 457, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 458, "x": 458, "y0": 0, "y1": 458, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 459, "x": 459, "y0": 0, "y1": 459, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 460, "x": 460, "y0": 0, "y1": 460, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 461, "x": 461, "y0": 0, "y1": 461, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 462, "x": 462, "y0": 0, "y1": 462, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 463, "x": 463, "y0": 0, "y1": 463, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 464, "x": 464, "y0": 0, "y1": 464, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 465, "x": 465, "y0": 0, "y1": 465, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 466, "x": 466, "y0": 0, "y1": 466, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 467, "x": 467, "y0": 0, "y1": 467, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 468, "x": 468, "y0": 0, "y1": 468, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 469, "x": 469, "y0": 0, "y1": 469, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 470, "x": 470, "y0": 0, "y1": 470, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 471, "x": 471, "y0": 0, "y1": 471, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 472, "x": 472, "y0": 0, "y1": 472, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 473, "x": 473, "y0": 0, "y1": 473, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 474, "x": 474, "y0": 0, "y1": 474, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 475, "x": 475, "y0": 0, "y1": 475, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 476, "x": 476, "y0": 0, "y1": 476, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 477, "x": 477, "y0": 0, "y1": 477, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 478, "x": 478, "y0": 0, "y1": 478, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 479, "x": 479, "y0": 0, "y1": 479, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 480, "x": 480, "y0": 0, "y1": 480, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 481, "x": 481, "y0": 0, "y1": 481, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 482, "x": 482, "y0": 0, "y1": 482, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 483, "x": 483, "y0": 0, "y1": 483, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 484, "x": 484, "y0": 0, "y1": 484, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 485, "x": 485, "y0": 0, "y1": 485, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 486, "x": 486, "y0": 0, "y1": 486, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 487, "x": 487, "y0": 0, "y1": 487, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 488, "x": 488, "y0": 0, "y1": 488, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 489, "x": 489, "y0": 0, "y1": 489, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 490, "x": 490, "y0": 0, "y1": 490, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 491, "x": 491, "y0": 0, "y1": 491, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 492, "x": 492, "y0": 0, "y1": 492, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 493, "x": 493, "y0": 0, "y1": 493, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 494, "x": 494, "y0": 0, "y1": 494, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 495, "x": 495, "y0": 0, "y1": 495, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 496, "x": 496, "y0": 0, "y1": 496, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 497, "x": 497, "y0": 0, "y1": 497, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 498, "x": 498, "y0": 0, "y1": 498, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 499, "x": 499, "y0": 0, "y1": 499, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 500, "x": 500, "y0": 0, "y1": 500, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 501, "x": 501, "y0": 0, "y1": 501, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 502, "x": 502, "y0": 0, "y1": 502, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 503, "x": 503, "y0": 0, "y1": 503, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 504, "x": 504, "y0": 0, "y1": 504, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 505, "x": 505, "y0": 0, "y1": 505, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 506, "x": 506, "y0": 0, "y1": 506, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 507, "x": 507, "y0": 0, "y1": 507, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 508, "x": 508, "y0": 0, "y1": 508, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 509, "x": 509, "y0": 0, "y1": 509, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 510, "x": 510, "y0": 0, "y1": 510, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 511, "x": 511, "y0": 0, "y1": 511, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 512, "x": 512, "y0": 0, "y1": 512, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 513, "x": 513, "y0": 0, "y1": 513, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 514, "x": 514, "y0": 0, "y1": 514, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 515, "x": 515, "y0": 0, "y1": 515, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 516, "x": 516, "y0": 0, "y1": 516, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 517, "x": 517, "y0": 0, "y1": 517, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 518, "x": 518, "y0": 0, "y1": 518, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 519, "x": 519, "y0": 0, "y1": 519, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 520, "x": 520, "y0": 0, "y1": 520, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 521, "x": 521, "y0": 0, "y1": 521, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 522, "x": 522, "y0": 0, "y1": 522, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 523, "x": 523, "y0": 0, "y1": 523, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 524, "x": 524, "y0": 0, "y1": 524, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 525, "x": 525, "y0": 0, "y1": 525, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 526, "x": 526, "y0": 0, "y1": 526, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 527, "x": 527, "y0": 0, "y1": 527, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 528, "x": 528, "y0": 0, "y1": 528, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 529, "x": 529, "y0": 0, "y1": 529, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 530, "x": 530, "y0": 0, "y1": 530, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 531, "x": 531, "y0": 0, "y1": 531, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 532, "x": 532, "y0": 0, "y1": 532, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 533, "x": 533, "y0": 0, "y1": 533, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 534, "x": 534, "y0": 0, "y1": 534, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 535, "x": 535, "y0": 0, "y1": 535, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 536, "x": 536, "y0": 0, "y1": 536, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 537, "x": 537, "y0": 0, "y1": 537, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 538, "x": 538, "y0": 0, "y1": 538, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 539, "x": 539, "y0": 0, "y1": 539, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 540, "x": 540, "y0": 0, "y1": 540, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 541, "x": 541, "y0": 0, "y1": 541, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 542, "x": 542, "y0": 0, "y1": 542, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 543, "x": 543, "y0": 0, "y1": 543, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 544, "x": 544, "y0": 0, "y1": 544, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 545, "x": 545, "y0": 0, "y1": 545, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 546, "x": 546, "y0": 0, "y1": 546, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 547, "x": 547, "y0": 0, "y1": 547, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 548, "x": 548, "y0": 0, "y1": 548, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 549, "x": 549, "y0": 0, "y1": 549, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 550, "x": 550, "y0": 0, "y1": 550, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 551, "x": 551, "y0": 0, "y1": 551, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 552, "x": 552, "y0": 0, "y1": 552, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 553, "x": 553, "y0": 0, "y1": 553, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 554, "x": 554, "y0": 0, "y1": 554, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 555, "x": 555, "y0": 0, "y1": 555, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 556, "x": 556, "y0": 0, "y1": 556, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 557, "x": 557, "y0": 0, "y1": 557, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 558, "x": 558, "y0": 0, "y1": 558, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 559, "x": 559, "y0": 0, "y1": 559, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 560, "x": 560, "y0": 0, "y1": 560, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 561, "x": 561, "y0": 0, "y1": 561, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 562, "x": 562, "y0": 0, "y1": 562, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 563, "x": 563, "y0": 0, "y1": 563, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 564, "x": 564, "y0": 0, "y1": 564, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 565, "x": 565, "y0": 0, "y1": 565, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 566, "x": 566, "y0": 0, "y1": 566, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 567, "x": 567, "y0": 0, "y1": 567, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 568, "x": 568, "y0": 0, "y1": 568, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 569, "x": 569, "y0": 0, "y1": 569, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 570, "x": 570, "y0": 0, "y1": 570, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 571, "x": 571, "y0": 0, "y1": 571, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 572, "x": 572, "y0": 0, "y1": 572, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 573, "x": 573, "y0": 0, "y1": 573, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 574, "x": 574, "y0": 0, "y1": 574, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 575, "x": 575, "y0": 0, "y1": 575, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 576, "x": 576, "y0": 0, "y1": 576, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 577, "x": 577, "y0": 0, "y1": 577, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 578, "x": 578, "y0": 0, "y1": 578, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 579, "x": 579, "y0": 0, "y1": 579, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 580, "x": 580, "y0": 0, "y1": 580, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 581, "x": 581, "y0": 0, "y1": 581, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 582, "x": 582, "y0": 0, "y1": 582, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 583, "x": 583, "y0": 0, "y1": 583, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 584, "x": 584, "y0": 0, "y1": 584, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 585, "x": 585, "y0": 0, "y1": 585, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 586, "x": 586, "y0": 0, "y1": 586, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 587, "x": 587, "y0": 0, "y1": 587, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 588, "x": 588, "y0": 0, "y1": 588, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 589, "x": 589, "y0": 0, "y1": 589, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 590, "x": 590, "y0": 0, "y1": 590, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 591, "x": 591, "y0": 0, "y1": 591, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 592, "x": 592, "y0": 0, "y1": 592, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 593, "x": 593, "y0": 0, "y1": 593, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 594, "x": 594, "y0": 0, "y1": 594, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 595, "x": 595, "y0": 0, "y1": 595, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 596, "x": 596, "y0": 0, "y1": 596, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 597, "x": 597, "y0": 0, "y1": 597, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 598, "x": 598, "y0": 0, "y1": 598, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 599, "x": 599, "y0": 0, "y1": 599, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 600, "x": 600, "y0": 0, "y1": 600, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 601, "x": 601, "y0": 0, "y1": 601, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 602, "x": 602, "y0": 0, "y1": 602, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 603, "x": 603, "y0": 0, "y1": 603, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 604, "x": 604, "y0": 0, "y1": 604, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 605, "x": 605, "y0": 0, "y1": 605, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 606, "x": 606, "y0": 0, "y1": 606, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 607, "x": 607, "y0": 0, "y1": 607, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 608, "x": 608, "y0": 0, "y1": 608, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 609, "x": 609, "y0": 0, "y1": 609, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 610, "x": 610, "y0": 0, "y1": 610, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 611, "x": 611, "y0": 0, "y1": 611, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 612, "x": 612, "y0": 0, "y1": 612, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 613, "x": 613, "y0": 0, "y1": 613, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 614, "x": 614, "y0": 0, "y1": 614, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 615, "x": 615, "y0": 0, "y1": 615, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 616, "x": 616, "y0": 0, "y1": 616, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 617, "x": 617, "y0": 0, "y1": 617, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 618, "x": 618, "y0": 0, "y1": 618, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 619, "x": 619, "y0": 0, "y1": 619, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 620, "x": 620, "y0": 0, "y1": 620, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 621, "x": 621, "y0": 0, "y1": 621, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 622, "x": 622, "y0": 0, "y1": 622, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 623, "x": 623, "y0": 0, "y1": 623, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 624, "x": 624, "y0": 0, "y1": 624, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 625, "x": 625, "y0": 0, "y1": 625, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 626, "x": 626, "y0": 0, "y1": 626, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 627, "x": 627, "y0": 0, "y1": 627, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 628, "x": 628, "y0": 0, "y1": 628, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 629, "x": 629, "y0": 0, "y1": 629, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 630, "x": 630, "y0": 0, "y1": 630, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 631, "x": 631, "y0": 0, "y1": 631, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 632, "x": 632, "y0": 0, "y1": 632, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 633, "x": 633, "y0": 0, "y1": 633, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 634, "x": 634, "y0": 0, "y1": 634, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 635, "x": 635, "y0": 0, "y1": 635, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 636, "x": 636, "y0": 0, "y1": 636, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 637, "x": 637, "y0": 0, "y1": 637, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 638, "x": 638, "y0": 0, "y1": 638, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 639, "x": 639, "y0": 0, "y1": 639, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 640, "x": 640, "y0": 0, "y1": 640, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 641, "x": 641, "y0": 0, "y1": 641, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 642, "x": 642, "y0": 0, "y1": 642, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 643, "x": 643, "y0": 0, "y1": 643, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 644, "x": 644, "y0": 0, "y1": 644, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 645, "x": 645, "y0": 0, "y1": 645, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 646, "x": 646, "y0": 0, "y1": 646, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 647, "x": 647, "y0": 0, "y1": 647, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 648, "x": 648, "y0": 0, "y1": 648, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 649, "x": 649, "y0": 0, "y1": 649, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 650, "x": 650, "y0": 0, "y1": 650, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 651, "x": 651, "y0": 0, "y1": 651, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 652, "x": 652, "y0": 0, "y1": 652, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 653, "x": 653, "y0": 0, "y1": 653, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 654, "x": 654, "y0": 0, "y1": 654, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 655, "x": 655, "y0": 0, "y1": 655, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 656, "x": 656, "y0": 0, "y1": 656, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 657, "x": 657, "y0": 0, "y1": 657, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 658, "x": 658, "y0": 0, "y1": 658, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 659, "x": 659, "y0": 0, "y1": 659, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 660, "x": 660, "y0": 0, "y1": 660, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 661, "x": 661, "y0": 0, "y1": 661, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 662, "x": 662, "y0": 0, "y1": 662, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 663, "x": 663, "y0": 0, "y1": 663, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 664, "x": 664, "y0": 0, "y1": 664, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 665, "x": 665, "y0": 0, "y1": 665, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 666, "x": 666, "y0": 0, "y1": 666, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 667, "x": 667, "y0": 0, "y1": 667, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 668, "x": 668, "y0": 0, "y1": 668, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 669, "x": 669, "y0": 0, "y1": 669, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 670, "x": 670, "y0": 0, "y1": 670, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 671, "x": 671, "y0": 0, "y1": 671, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 672, "x": 672, "y0": 0, "y1": 672, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 673, "x": 673, "y0": 0, "y1": 673, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 674, "x": 674, "y0": 0, "y1": 674, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 675, "x": 675, "y0": 0, "y1": 675, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 676, "x": 676, "y0": 0, "y1": 676, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 677, "x": 677, "y0": 0, "y1": 677, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 678, "x": 678, "y0": 0, "y1": 678, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 679, "x": 679, "y0": 0, "y1": 679, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 680, "x": 680, "y0": 0, "y1": 680, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 681, "x": 681, "y0": 0, "y1": 681, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 682, "x": 682, "y0": 0, "y1": 682, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 683, "x": 683, "y0": 0, "y1": 683, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 684, "x": 684, "y0": 0, "y1": 684, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 685, "x": 685, "y0": 0, "y1": 685, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 686, "x": 686, "y0": 0, "y1": 686, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 687, "x": 687, "y0": 0, "y1": 687, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 688, "x": 688, "y0": 0, "y1": 688, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 689, "x": 689, "y0": 0, "y1": 689, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 690, "x": 690, "y0": 0, "y1": 690, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 691, "x": 691, "y0": 0, "y1": 691, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 692, "x": 692, "y0": 0, "y1": 692, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 693, "x": 693, "y0": 0, "y1": 693, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 694, "x": 694, "y0": 0, "y1": 694, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 695, "x": 695, "y0": 0, "y1": 695, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 696, "x": 696, "y0": 0, "y1": 696, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 697, "x": 697, "y0": 0, "y1": 697, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 698, "x": 698, "y0": 0, "y1": 698, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 699, "x": 699, "y0": 0, "y1": 699, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 700, "x": 700, "y0": 0, "y1": 700, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 701, "x": 701, "y0": 0, "y1": 701, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 702, "x": 702, "y0": 0, "y1": 702, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 703, "x": 703, "y0": 0, "y1": 703, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 704, "x": 704, "y0": 0, "y1": 704, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 705, "x": 705, "y0": 0, "y1": 705, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 706, "x": 706, "y0": 0, "y1": 706, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 707, "x": 707, "y0": 0, "y1": 707, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 708, "x": 708, "y0": 0, "y1": 708, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 709, "x": 709, "y0": 0, "y1": 709, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 710, "x": 710, "y0": 0, "y1": 710, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 711, "x": 711, "y0": 0, "y1": 711, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 712, "x": 712, "y0": 0, "y1": 712, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 713, "x": 713, "y0": 0, "y1": 713, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 714, "x": 714, "y0": 0, "y1": 714, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 715, "x": 715, "y0": 0, "y1": 715, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 716, "x": 716, "y0": 0, "y1": 716, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 717, "x": 717, "y0": 0, "y1": 717, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 718, "x": 718, "y0": 0, "y1": 718, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 719, "x": 719, "y0": 0, "y1": 719, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 720, "x": 720, "y0": 0, "y1": 720, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 721, "x": 721, "y0": 0, "y1": 721, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 722, "x": 722, "y0": 0, "y1": 722, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 723, "x": 723, "y0": 0, "y1": 723, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 724, "x": 724, "y0": 0, "y1": 724, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 725, "x": 725, "y0": 0, "y1": 725, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 726, "x": 726, "y0": 0, "y1": 726, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 727, "x": 727, "y0": 0, "y1": 727, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 728, "x": 728, "y0": 0, "y1": 728, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 729, "x": 729, "y0": 0, "y1": 729, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 730, "x": 730, "y0": 0, "y1": 730, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 731, "x": 731, "y0": 0, "y1": 731, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 732, "x": 732, "y0": 0, "y1": 732, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 733, "x": 733, "y0": 0, "y1": 733, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 734, "x": 734, "y0": 0, "y1": 734, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 735, "x": 735, "y0": 0, "y1": 735, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 736, "x": 736, "y0": 0, "y1": 736, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 737, "x": 737, "y0": 0, "y1": 737, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 738, "x": 738, "y0": 0, "y1": 738, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 739, "x": 739, "y0": 0, "y1": 739, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 740, "x": 740, "y0": 0, "y1": 740, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 741, "x": 741, "y0": 0, "y1": 741, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 742, "x": 742, "y0": 0, "y1": 742, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 743, "x": 743, "y0": 0, "y1": 743, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 744, "x": 744, "y0": 0, "y1": 744, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 745, "x": 745, "y0": 0, "y1": 745, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 746, "x": 746, "y0": 0, "y1": 746, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 747, "x": 747, "y0": 0, "y1": 747, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 748, "x": 748, "y0": 0, "y1": 748, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 749, "x": 749, "y0": 0, "y1": 749, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 750, "x": 750, "y0": 0, "y1": 750, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 751, "x": 751, "y0": 0, "y1": 751, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 752, "x": 752, "y0": 0, "y1": 752, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 753, "x": 753, "y0": 0, "y1": 753, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 754, "x": 754, "y0": 0, "y1": 754, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 755, "x": 755, "y0": 0, "y1": 755, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 756, "x": 756, "y0": 0, "y1": 756, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 757, "x": 757, "y0": 0, "y1": 757, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 758, "x": 758, "y0": 0, "y1": 758, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 759, "x": 759, "y0": 0, "y1": 759, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 760, "x": 760, "y0": 0, "y1": 760, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 761, "x": 761, "y0": 0, "y1": 761, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 762, "x": 762, "y0": 0, "y1": 762, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 763, "x": 763, "y0": 0, "y1": 763, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 764, "x": 764, "y0": 0, "y1": 764, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 765, "x": 765, "y0": 0, "y1": 765, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 766, "x": 766, "y0": 0, "y1": 766, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 767, "x": 767, "y0": 0, "y1": 767, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 768, "x": 768, "y0": 0, "y1": 768, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 769, "x": 769, "y0": 0, "y1": 769, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 770, "x": 770, "y0": 0, "y1": 770, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 771, "x": 771, "y0": 0, "y1": 771, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 772, "x": 772, "y0": 0, "y1": 772, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 773, "x": 773, "y0": 0, "y1": 773, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 774, "x": 774, "y0": 0, "y1": 774, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 775, "x": 775, "y0": 0, "y1": 775, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 776, "x": 776, "y0": 0, "y1": 776, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 777, "x": 777, "y0": 0, "y1": 777, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 778, "x": 778, "y0": 0, "y1": 778, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 779, "x": 779, "y0": 0, "y1": 779, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 780, "x": 780, "y0": 0, "y1": 780, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 781, "x": 781, "y0": 0, "y1": 781, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 782, "x": 782, "y0": 0, "y1": 782, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 783, "x": 783, "y0": 0, "y1": 783, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 784, "x": 784, "y0": 0, "y1": 784, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 785, "x": 785, "y0": 0, "y1": 785, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 786, "x": 786, "y0": 0, "y1": 786, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 787, "x": 787, "y0": 0, "y1": 787, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 788, "x": 788, "y0": 0, "y1": 788, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 789, "x": 789, "y0": 0, "y1": 789, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 790, "x": 790, "y0": 0, "y1": 790, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 791, "x": 791, "y0": 0, "y1": 791, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 792, "x": 792, "y0": 0, "y1": 792, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 793, "x": 793, "y0": 0, "y1": 793, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 794, "x": 794, "y0": 0, "y1": 794, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 795, "x": 795, "y0": 0, "y1": 795, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 796, "x": 796, "y0": 0, "y1": 796, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 797, "x": 797, "y0": 0, "y1": 797, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 798, "x": 798, "y0": 0, "y1": 798, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 799, "x": 799, "y0": 0, "y1": 799, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 800, "x": 800, "y0": 0, "y1": 800, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 801, "x": 801, "y0": 0, "y1": 801, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 802, "x": 802, "y0": 0, "y1": 802, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 803, "x": 803, "y0": 0, "y1": 803, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 804, "x": 804, "y0": 0, "y1": 804, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 805, "x": 805, "y0": 0, "y1": 805, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 806, "x": 806, "y0": 0, "y1": 806, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 807, "x": 807, "y0": 0, "y1": 807, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 808, "x": 808, "y0": 0, "y1": 808, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 809, "x": 809, "y0": 0, "y1": 809, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 810, "x": 810, "y0": 0, "y1": 810, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 811, "x": 811, "y0": 0, "y1": 811, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 812, "x": 812, "y0": 0, "y1": 812, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 813, "x": 813, "y0": 0, "y1": 813, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 814, "x": 814, "y0": 0, "y1": 814, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 815, "x": 815, "y0": 0, "y1": 815, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 816, "x": 816, "y0": 0, "y1": 816, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 817, "x": 817, "y0": 0, "y1": 817, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 818, "x": 818, "y0": 0, "y1": 818, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 819, "x": 819, "y0": 0, "y1": 819, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 820, "x": 820, "y0": 0, "y1": 820, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 821, "x": 821, "y0": 0, "y1": 821, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 822, "x": 822, "y0": 0, "y1": 822, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 823, "x": 823, "y0": 0, "y1": 823, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 824, "x": 824, "y0": 0, "y1": 824, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 825, "x": 825, "y0": 0, "y1": 825, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 826, "x": 826, "y0": 0, "y1": 826, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 827, "x": 827, "y0": 0, "y1": 827, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 828, "x": 828, "y0": 0, "y1": 828, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 829, "x": 829, "y0": 0, "y1": 829, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 830, "x": 830, "y0": 0, "y1": 830, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 831, "x": 831, "y0": 0, "y1": 831, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 832, "x": 832, "y0": 0, "y1": 832, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 833, "x": 833, "y0": 0, "y1": 833, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 834, "x": 834, "y0": 0, "y1": 834, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 835, "x": 835, "y0": 0, "y1": 835, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 836, "x": 836, "y0": 0, "y1": 836, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 837, "x": 837, "y0": 0, "y1": 837, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 838, "x": 838, "y0": 0, "y1": 838, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 839, "x": 839, "y0": 0, "y1": 839, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 840, "x": 840, "y0": 0, "y1": 840, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 841, "x": 841, "y0": 0, "y1": 841, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 842, "x": 842, "y0": 0, "y1": 842, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 843, "x": 843, "y0": 0, "y1": 843, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 844, "x": 844, "y0": 0, "y1": 844, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 845, "x": 845, "y0": 0, "y1": 845, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 846, "x": 846, "y0": 0, "y1": 846, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 847, "x": 847, "y0": 0, "y1": 847, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 848, "x": 848, "y0": 0, "y1": 848, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 849, "x": 849, "y0": 0, "y1": 849, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 850, "x": 850, "y0": 0, "y1": 850, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 851, "x": 851, "y0": 0, "y1": 851, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 852, "x": 852, "y0": 0, "y1": 852, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 853, "x": 853, "y0": 0, "y1": 853, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 854, "x": 854, "y0": 0, "y1": 854, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 855, "x": 855, "y0": 0, "y1": 855, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 856, "x": 856, "y0": 0, "y1": 856, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 857, "x": 857, "y0": 0, "y1": 857, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 858, "x": 858, "y0": 0, "y1": 858, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 859, "x": 859, "y0": 0, "y1": 859, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 860, "x": 860, "y0": 0, "y1": 860, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 861, "x": 861, "y0": 0, "y1": 861, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 862, "x": 862, "y0": 0, "y1": 862, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 863, "x": 863, "y0": 0, "y1": 863, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 864, "x": 864, "y0": 0, "y1": 864, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 865, "x": 865, "y0": 0, "y1": 865, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 866, "x": 866, "y0": 0, "y1": 866, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 867, "x": 867, "y0": 0, "y1": 867, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 868, "x": 868, "y0": 0, "y1": 868, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 869, "x": 869, "y0": 0, "y1": 869, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 870, "x": 870, "y0": 0, "y1": 870, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 871, "x": 871, "y0": 0, "y1": 871, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 872, "x": 872, "y0": 0, "y1": 872, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 873, "x": 873, "y0": 0, "y1": 873, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 874, "x": 874, "y0": 0, "y1": 874, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 875, "x": 875, "y0": 0, "y1": 875, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 876, "x": 876, "y0": 0, "y1": 876, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 877, "x": 877, "y0": 0, "y1": 877, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 878, "x": 878, "y0": 0, "y1": 878, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 879, "x": 879, "y0": 0, "y1": 879, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 880, "x": 880, "y0": 0, "y1": 880, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 881, "x": 881, "y0": 0, "y1": 881, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 882, "x": 882, "y0": 0, "y1": 882, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 883, "x": 883, "y0": 0, "y1": 883, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 884, "x": 884, "y0": 0, "y1": 884, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 885, "x": 885, "y0": 0, "y1": 885, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 886, "x": 886, "y0": 0, "y1": 886, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 887, "x": 887, "y0": 0, "y1": 887, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 888, "x": 888, "y0": 0, "y1": 888, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 889, "x": 889, "y0": 0, "y1": 889, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 890, "x": 890, "y0": 0, "y1": 890, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 891, "x": 891, "y0": 0, "y1": 891, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 892, "x": 892, "y0": 0, "y1": 892, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 893, "x": 893, "y0": 0, "y1": 893, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 894, "x": 894, "y0": 0, "y1": 894, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 895, "x": 895, "y0": 0, "y1": 895, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 896, "x": 896, "y0": 0, "y1": 896, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 897, "x": 897, "y0": 0, "y1": 897, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 898, "x": 898, "y0": 0, "y1": 898, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 899, "x": 899, "y0": 0, "y1": 899, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 900, "x": 900, "y0": 0, "y1": 900, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 901, "x": 901, "y0": 0, "y1": 901, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 902, "x": 902, "y0": 0, "y1": 902, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 903, "x": 903, "y0": 0, "y1": 903, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 904, "x": 904, "y0": 0, "y1": 904, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 905, "x": 905, "y0": 0, "y1": 905, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 906, "x": 906, "y0": 0, "y1": 906, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 907, "x": 907, "y0": 0, "y1": 907, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 908, "x": 908, "y0": 0, "y1": 908, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 909, "x": 909, "y0": 0, "y1": 909, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 910, "x": 910, "y0": 0, "y1": 910, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 911, "x": 911, "y0": 0, "y1": 911, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 912, "x": 912, "y0": 0, "y1": 912, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 913, "x": 913, "y0": 0, "y1": 913, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 914, "x": 914, "y0": 0, "y1": 914, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 915, "x": 915, "y0": 0, "y1": 915, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 916, "x": 916, "y0": 0, "y1": 916, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 917, "x": 917, "y0": 0, "y1": 917, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 918, "x": 918, "y0": 0, "y1": 918, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 919, "x": 919, "y0": 0, "y1": 919, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 920, "x": 920, "y0": 0, "y1": 920, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 921, "x": 921, "y0": 0, "y1": 921, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 922, "x": 922, "y0": 0, "y1": 922, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 923, "x": 923, "y0": 0, "y1": 923, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 924, "x": 924, "y0": 0, "y1": 924, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 925, "x": 925, "y0": 0, "y1": 925, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 926, "x": 926, "y0": 0, "y1": 926, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 927, "x": 927, "y0": 0, "y1": 927, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 928, "x": 928, "y0": 0, "y1": 928, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 929, "x": 929, "y0": 0, "y1": 929, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 930, "x": 930, "y0": 0, "y1": 930, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 931, "x": 931, "y0": 0, "y1": 931, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 932, "x": 932, "y0": 0, "y1": 932, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 933, "x": 933, "y0": 0, "y1": 933, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 934, "x": 934, "y0": 0, "y1": 934, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 935, "x": 935, "y0": 0, "y1": 935, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 936, "x": 936, "y0": 0, "y1": 936, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 937, "x": 937, "y0": 0, "y1": 937, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 938, "x": 938, "y0": 0, "y1": 938, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 939, "x": 939, "y0": 0, "y1": 939, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 940, "x": 940, "y0": 0, "y1": 940, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 941, "x": 941, "y0": 0, "y1": 941, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 942, "x": 942, "y0": 0, "y1": 942, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 943, "x": 943, "y0": 0, "y1": 943, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 944, "x": 944, "y0": 0, "y1": 944, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 945, "x": 945, "y0": 0, "y1": 945, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 946, "x": 946, "y0": 0, "y1": 946, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 947, "x": 947, "y0": 0, "y1": 947, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 948, "x": 948, "y0": 0, "y1": 948, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 949, "x": 949, "y0": 0, "y1": 949, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 950, "x": 950, "y0": 0, "y1": 950, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 951, "x": 951, "y0": 0, "y1": 951, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 952, "x": 952, "y0": 0, "y1": 952, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 953, "x": 953, "y0": 0, "y1": 953, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 954, "x": 954, "y0": 0, "y1": 954, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 955, "x": 955, "y0": 0, "y1": 955, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 956, "x": 956, "y0": 0, "y1": 956, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 957, "x": 957, "y0": 0, "y1": 957, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 958, "x": 958, "y0": 0, "y1": 958, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 959, "x": 959, "y0": 0, "y1": 959, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 960, "x": 960, "y0": 0, "y1": 960, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 961, "x": 961, "y0": 0, "y1": 961, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 962, "x": 962, "y0": 0, "y1": 962, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 963, "x": 963, "y0": 0, "y1": 963, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 964, "x": 964, "y0": 0, "y1": 964, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 965, "x": 965, "y0": 0, "y1": 965, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 966, "x": 966, "y0": 0, "y1": 966, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 967, "x": 967, "y0": 0, "y1": 967, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 968, "x": 968, "y0": 0, "y1": 968, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 969, "x": 969, "y0": 0, "y1": 969, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 970, "x": 970, "y0": 0, "y1": 970, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 971, "x": 971, "y0": 0, "y1": 971, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 972, "x": 972, "y0": 0, "y1": 972, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 973, "x": 973, "y0": 0, "y1": 973, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 974, "x": 974, "y0": 0, "y1": 974, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 975, "x": 975, "y0": 0, "y1": 975, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 976, "x": 976, "y0": 0, "y1": 976, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 977, "x": 977, "y0": 0, "y1": 977, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 978, "x": 978, "y0": 0, "y1": 978, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 979, "x": 979, "y0": 0, "y1": 979, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 980, "x": 980, "y0": 0, "y1": 980, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 981, "x": 981, "y0": 0, "y1": 981, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 982, "x": 982, "y0": 0, "y1": 982, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 983, "x": 983, "y0": 0, "y1": 983, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 984, "x": 984, "y0": 0, "y1": 984, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 985, "x": 985, "y0": 0, "y1": 985, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 986, "x": 986, "y0": 0, "y1": 986, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 987, "x": 987, "y0": 0, "y1": 987, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 988, "x": 988, "y0": 0, "y1": 988, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 989, "x": 989, "y0": 0, "y1": 989, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 990, "x": 990, "y0": 0, "y1": 990, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 991, "x": 991, "y0": 0, "y1": 991, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 992, "x": 992, "y0": 0, "y1": 992, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 993, "x": 993, "y0": 0, "y1": 993, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 994, "x": 994, "y0": 0, "y1": 994, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 995, "x": 995, "y0": 0, "y1": 995, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 996, "x": 996, "y0": 0, "y1": 996, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 997, "x": 997, "y0": 0, "y1": 997, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 998, "x": 998, "y0": 0, "y1": 998, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 999, "x": 999, "y0": 0, "y1": 999, @@ -7284,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, @@ -13298,24 +17298,32 @@ Array [ "data": Array [ Object { "datum": undefined, + "initialY0": 0, + "initialY1": 1, "x": 1, "y0": 0, "y1": 1, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 2, "x": 2, "y0": 0, "y1": 2, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 3, "x": 3, "y0": 0, "y1": 3, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 4, "x": 4, "y0": 0, "y1": 4, @@ -13331,24 +17339,32 @@ 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, @@ -13364,24 +17380,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, @@ -13397,24 +17421,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, @@ -13435,18 +17467,24 @@ Array [ "data": Array [ Object { "datum": undefined, + "initialY0": 0, + "initialY1": 1, "x": 1, "y0": 0, "y1": 1, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 2, "x": 2, "y0": 0, "y1": 2, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 4, "x": 4, "y0": 0, "y1": 4, @@ -13462,12 +17500,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, @@ -13488,18 +17530,24 @@ Array [ "data": Array [ Object { "datum": undefined, + "initialY0": 0, + "initialY1": 1, "x": 1, "y0": 0, "y1": 1, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 4, "x": 4, "y0": 0, "y1": 4, }, Object { "datum": undefined, + "initialY0": 0, + "initialY1": 2, "x": 2, "y0": 0, "y1": 2, @@ -13515,12 +17563,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, @@ -13553,6 +17605,8 @@ Array [ "y1": 1, "y2": 3, }, + "initialY0": 0, + "initialY1": 1, "x": 0, "y0": 0, "y1": 1, @@ -13563,6 +17617,8 @@ Array [ "y1": 2, "y2": 7, }, + "initialY0": 0, + "initialY1": 2, "x": 1, "y0": 0, "y1": 2, @@ -13573,6 +17629,8 @@ Array [ "y1": 1, "y2": 2, }, + "initialY0": 0, + "initialY1": 1, "x": 2, "y0": 0, "y1": 1, @@ -13583,6 +17641,8 @@ Array [ "y1": 6, "y2": 10, }, + "initialY0": 0, + "initialY1": 6, "x": 3, "y0": 0, "y1": 6, @@ -13602,6 +17662,8 @@ Array [ "y1": 1, "y2": 3, }, + "initialY0": null, + "initialY1": 3, "x": 0, "y0": 1, "y1": 4, @@ -13612,6 +17674,8 @@ Array [ "y1": 2, "y2": 7, }, + "initialY0": null, + "initialY1": 7, "x": 1, "y0": 2, "y1": 9, @@ -13622,6 +17686,8 @@ Array [ "y1": 1, "y2": 2, }, + "initialY0": null, + "initialY1": 2, "x": 2, "y0": 1, "y1": 3, @@ -13632,6 +17698,8 @@ Array [ "y1": 6, "y2": 10, }, + "initialY0": null, + "initialY1": 10, "x": 3, "y0": 6, "y1": 16, diff --git a/src/lib/series/rendering.areas.test.ts b/src/lib/series/rendering.areas.test.ts index b425515983..70138226a5 100644 --- a/src/lib/series/rendering.areas.test.ts +++ b/src/lib/series/rendering.areas.test.ts @@ -78,6 +78,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 0, y: 10, }, @@ -97,6 +98,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1, y: 5, }, @@ -205,6 +207,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 0, y: 10, }, @@ -223,6 +226,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1, y: 5, }, @@ -249,6 +253,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 0, y: 20, }, @@ -267,6 +272,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1, y: 10, }, @@ -337,6 +343,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 0, y: 10, }, @@ -355,6 +362,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1, y: 5, }, @@ -462,6 +470,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 0, y: 10, }, @@ -480,6 +489,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1, y: 5, }, @@ -506,6 +516,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 0, y: 20, }, @@ -524,6 +535,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1, y: 10, }, @@ -594,6 +606,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1546300800000, y: 10, }, @@ -612,6 +625,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1546387200000, y: 5, }, @@ -704,6 +718,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1546300800000, y: 10, }, @@ -722,6 +737,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1546387200000, y: 5, }, @@ -748,6 +764,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1546300800000, y: 20, }, @@ -766,6 +783,7 @@ describe('Rendering points - areas', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1546387200000, y: 10, }, diff --git a/src/lib/series/rendering.bars.test.ts b/src/lib/series/rendering.bars.test.ts index 0060f6a789..7614ecc9d6 100644 --- a/src/lib/series/rendering.bars.test.ts +++ b/src/lib/series/rendering.bars.test.ts @@ -43,6 +43,7 @@ describe('Rendering bars', () => { height: 100, color: 'red', value: { + accessor: 'y1', x: 0, y: 10, }, @@ -58,6 +59,7 @@ describe('Rendering bars', () => { height: 50, color: 'red', value: { + accessor: 'y1', x: 1, y: 5, }, @@ -118,6 +120,7 @@ describe('Rendering bars', () => { height: 50, color: 'red', value: { + accessor: 'y1', x: 0, y: 10, }, @@ -133,6 +136,7 @@ describe('Rendering bars', () => { height: 25, color: 'red', value: { + accessor: 'y1', x: 1, y: 5, }, @@ -160,6 +164,7 @@ describe('Rendering bars', () => { height: 100, color: 'blue', value: { + accessor: 'y1', x: 0, y: 20, }, @@ -175,6 +180,7 @@ describe('Rendering bars', () => { height: 50, color: 'blue', value: { + accessor: 'y1', x: 1, y: 10, }, @@ -220,6 +226,7 @@ describe('Rendering bars', () => { height: 100, color: 'red', value: { + accessor: 'y1', x: 0, y: 10, }, @@ -235,6 +242,7 @@ describe('Rendering bars', () => { height: 50, color: 'red', value: { + accessor: 'y1', x: 1, y: 5, }, @@ -295,6 +303,7 @@ describe('Rendering bars', () => { height: 50, color: 'red', value: { + accessor: 'y1', x: 0, y: 10, }, @@ -310,6 +319,7 @@ describe('Rendering bars', () => { height: 25, color: 'red', value: { + accessor: 'y1', x: 1, y: 5, }, @@ -337,6 +347,7 @@ describe('Rendering bars', () => { height: 100, color: 'blue', value: { + accessor: 'y1', x: 0, y: 20, }, @@ -352,6 +363,7 @@ describe('Rendering bars', () => { height: 50, color: 'blue', value: { + accessor: 'y1', x: 1, y: 10, }, @@ -412,6 +424,7 @@ describe('Rendering bars', () => { height: 50, color: 'red', value: { + accessor: 'y1', x: 1546300800000, y: 10, }, @@ -427,6 +440,7 @@ describe('Rendering bars', () => { height: 25, color: 'red', value: { + accessor: 'y1', x: 1546387200000, y: 5, }, @@ -454,6 +468,7 @@ describe('Rendering bars', () => { height: 100, color: 'blue', value: { + accessor: 'y1', x: 1546300800000, y: 20, }, @@ -469,6 +484,7 @@ describe('Rendering bars', () => { height: 50, color: 'blue', value: { + accessor: 'y1', x: 1546387200000, y: 10, }, diff --git a/src/lib/series/rendering.lines.test.ts b/src/lib/series/rendering.lines.test.ts index 73bb1acef8..bdda5cbaec 100644 --- a/src/lib/series/rendering.lines.test.ts +++ b/src/lib/series/rendering.lines.test.ts @@ -68,6 +68,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 0, y: 10, }, @@ -86,6 +87,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1, y: 5, }, @@ -192,6 +194,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 0, y: 10, }, @@ -210,6 +213,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1, y: 5, }, @@ -236,6 +240,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 0, y: 20, }, @@ -254,6 +259,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1, y: 10, }, @@ -323,6 +329,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 0, y: 10, }, @@ -341,6 +348,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1, y: 5, }, @@ -446,6 +454,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 0, y: 10, }, @@ -463,7 +472,11 @@ describe('Rendering points - line', () => { specId: spec1Id, seriesKey: [], }, - value: { x: 1, y: 5 }, + value: { + accessor: 'y1', + x: 1, + y: 5, + }, transform: { x: 0, y: 0, @@ -487,6 +500,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 0, y: 20, }, @@ -505,6 +519,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1, y: 10, }, @@ -574,6 +589,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1546300800000, y: 10, }, @@ -592,6 +608,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1546387200000, y: 5, }, @@ -684,6 +701,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1546300800000, y: 10, }, @@ -702,6 +720,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1546387200000, y: 5, }, @@ -728,6 +747,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1546300800000, y: 20, }, @@ -746,6 +766,7 @@ describe('Rendering points - line', () => { seriesKey: [], }, value: { + accessor: 'y1', x: 1546387200000, y: 10, }, diff --git a/src/lib/series/rendering.ts b/src/lib/series/rendering.ts index d55062055e..f8da842a52 100644 --- a/src/lib/series/rendering.ts +++ b/src/lib/series/rendering.ts @@ -17,6 +17,7 @@ export interface GeometryId { export interface GeometryValue { y: any; x: any; + accessor: 'y1' | 'y0'; } /** Shared style properties for varies geometries */ @@ -100,7 +101,7 @@ export function renderPoints( if (hasY0Accessors) { yDatums.unshift(datum.y0); } - yDatums.forEach((yDatum) => { + yDatums.forEach((yDatum, index) => { let y; let radius = 10; const isHidden = yDatum === null || (isLogScale && yDatum <= 0); @@ -111,6 +112,7 @@ export function renderPoints( } else { y = yScale.scale(yDatum); } + const originalY = hasY0Accessors && index === 0 ? datum.initialY0 : datum.initialY1; const pointGeometry: PointGeometry = { radius, x, @@ -118,7 +120,8 @@ export function renderPoints( color, value: { x: datum.x, - y: yDatum, + y: originalY, + accessor: hasY0Accessors && index === 0 ? 'y0' : 'y1', }, transform: { x: shift, @@ -193,6 +196,7 @@ export function renderBars( value: { x: datum.x, y: y1, + accessor: 'y1', }, geometryId: { specId, diff --git a/src/lib/series/series.ts b/src/lib/series/series.ts index eabe939746..2a6f8d0079 100644 --- a/src/lib/series/series.ts +++ b/src/lib/series/series.ts @@ -22,6 +22,10 @@ export interface DataSeriesDatum { 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; } @@ -324,6 +328,8 @@ export function formatNonStackedDataValues( x, y1, y0, + initialY1: y1, + initialY0: y0, datum, }; formattedValues.data.push(formattedValue); @@ -380,6 +386,8 @@ export function formatStackedDataSeriesValues( x, y1, y0: computedY0, + initialY1: y1, + initialY0: computedY0, datum, }); } else { @@ -394,6 +402,8 @@ export function formatStackedDataSeriesValues( x, y1: stackedY1, y0: stackedY0, + initialY1: y1, + initialY0: data.y0 || null, datum, }); } diff --git a/src/lib/series/tooltip.ts b/src/lib/series/tooltip.ts index d526499c40..05f3354c0c 100644 --- a/src/lib/series/tooltip.ts +++ b/src/lib/series/tooltip.ts @@ -29,13 +29,20 @@ export function formatTooltip( isHighlighted: boolean, yAxis?: AxisSpec, ): TooltipValue[] { - const { y } = searchIndexValue.value; + const { y, accessor } = searchIndexValue.value; const { seriesKey } = searchIndexValue.geometryId; let yAccessors = spec.yAccessors; if (yAccessors.length > 1) { // the last element of the seriesKey is the yAccessor yAccessors = seriesKey.slice(-1); } + let accessors = yAccessors; + if (accessor === 'y0' && spec.y0Accessors) { + const y1AccessorIndex = spec.yAccessors.findIndex((acc) => { + return acc === yAccessors[0]; + }); + accessors = [spec.y0Accessors[y1AccessorIndex]]; + } let name: string | undefined; if (seriesKey.length > 0) { name = seriesKey.join(' - '); @@ -47,7 +54,7 @@ export function formatTooltip( spec.id, seriesKey, y, - yAccessors, + accessors, color, yAxis ? yAxis.tickFormat : emptyFormatter, isHighlighted, diff --git a/src/state/__snapshots__/utils.test.ts.snap b/src/state/__snapshots__/utils.test.ts.snap index 3607900249..7af9513fbd 100644 --- a/src/state/__snapshots__/utils.test.ts.snap +++ b/src/state/__snapshots__/utils.test.ts.snap @@ -17,6 +17,8 @@ Array [ "x": 0, "y": 1, }, + "initialY0": 0, + "initialY1": 1, "x": 0, "y0": 0, "y1": 1, @@ -26,6 +28,8 @@ Array [ "x": 1, "y": 2, }, + "initialY0": 0, + "initialY1": 2, "x": 1, "y0": 0, "y1": 2, @@ -35,6 +39,8 @@ Array [ "x": 2, "y": 10, }, + "initialY0": 0, + "initialY1": 10, "x": 2, "y0": 0, "y1": 10, @@ -44,6 +50,8 @@ Array [ "x": 3, "y": 6, }, + "initialY0": 0, + "initialY1": 6, "x": 3, "y0": 0, "y1": 6, @@ -71,6 +79,8 @@ Array [ "x": 0, "y": 1, }, + "initialY0": 0, + "initialY1": 1, "x": 0, "y0": 0, "y1": 1, @@ -80,6 +90,8 @@ Array [ "x": 1, "y": 2, }, + "initialY0": 0, + "initialY1": 2, "x": 1, "y0": 0, "y1": 2, @@ -89,6 +101,8 @@ Array [ "x": 2, "y": 10, }, + "initialY0": 0, + "initialY1": 10, "x": 2, "y0": 0, "y1": 10, @@ -98,6 +112,8 @@ Array [ "x": 3, "y": 6, }, + "initialY0": 0, + "initialY1": 6, "x": 3, "y0": 0, "y1": 6, @@ -131,6 +147,8 @@ Array [ "x": 0, "y": 1, }, + "initialY0": 0, + "initialY1": 1, "x": 0, "y0": 0, "y1": 1, @@ -141,6 +159,8 @@ Array [ "x": 1, "y": 2, }, + "initialY0": 0, + "initialY1": 2, "x": 1, "y0": 0, "y1": 2, @@ -151,6 +171,8 @@ Array [ "x": 2, "y": 3, }, + "initialY0": 0, + "initialY1": 3, "x": 2, "y0": 0, "y1": 3, @@ -161,6 +183,8 @@ Array [ "x": 3, "y": 4, }, + "initialY0": 0, + "initialY1": 4, "x": 3, "y0": 0, "y1": 4, @@ -180,6 +204,8 @@ Array [ "x": 0, "y": 2, }, + "initialY0": null, + "initialY1": 2, "x": 0, "y0": 1, "y1": 3, @@ -190,6 +216,8 @@ Array [ "x": 1, "y": 3, }, + "initialY0": null, + "initialY1": 3, "x": 1, "y0": 2, "y1": 5, @@ -200,6 +228,8 @@ Array [ "x": 2, "y": 4, }, + "initialY0": null, + "initialY1": 4, "x": 2, "y0": 3, "y1": 7, @@ -210,6 +240,8 @@ Array [ "x": 3, "y": 5, }, + "initialY0": null, + "initialY1": 5, "x": 3, "y0": 4, "y1": 9, @@ -245,6 +277,8 @@ Array [ "x": 0, "y": 1, }, + "initialY0": 0, + "initialY1": 1, "x": 0, "y0": 0, "y1": 1, @@ -255,6 +289,8 @@ Array [ "x": 1, "y": 2, }, + "initialY0": 0, + "initialY1": 2, "x": 1, "y0": 0, "y1": 2, @@ -265,6 +301,8 @@ Array [ "x": 2, "y": 3, }, + "initialY0": 0, + "initialY1": 3, "x": 2, "y0": 0, "y1": 3, @@ -275,6 +313,8 @@ Array [ "x": 3, "y": 4, }, + "initialY0": 0, + "initialY1": 4, "x": 3, "y0": 0, "y1": 4, @@ -294,6 +334,8 @@ Array [ "x": 0, "y": 2, }, + "initialY0": 0, + "initialY1": 2, "x": 0, "y0": 0, "y1": 2, @@ -304,6 +346,8 @@ Array [ "x": 1, "y": 3, }, + "initialY0": 0, + "initialY1": 3, "x": 1, "y0": 0, "y1": 3, @@ -314,6 +358,8 @@ Array [ "x": 2, "y": 4, }, + "initialY0": 0, + "initialY1": 4, "x": 2, "y0": 0, "y1": 4, @@ -324,6 +370,8 @@ Array [ "x": 3, "y": 5, }, + "initialY0": 0, + "initialY1": 5, "x": 3, "y0": 0, "y1": 5, diff --git a/src/state/annotation_marker.test.tsx b/src/state/annotation_marker.test.tsx index a5e4243e17..64e2ce886d 100644 --- a/src/state/annotation_marker.test.tsx +++ b/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/src/state/chart_state.test.ts b/src/state/chart_state.test.ts index e0e8154a72..0e98b3c8ba 100644 --- a/src/state/chart_state.test.ts +++ b/src/state/chart_state.test.ts @@ -671,6 +671,7 @@ describe('Chart Store', () => { value: { x: 0, y: 1, + accessor: 'y1', }, x: 0, y: 0, @@ -686,6 +687,7 @@ describe('Chart Store', () => { value: { x: 0, y: 3, + accessor: 'y1', }, x: 50, y: 0, @@ -706,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/src/state/chart_state.ts b/src/state/chart_state.ts index 21136354a9..bdc1c2887a 100644 --- a/src/state/chart_state.ts +++ b/src/state/chart_state.ts @@ -380,7 +380,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(); @@ -604,7 +604,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/src/state/test/interactions.test.ts b/src/state/test/interactions.test.ts index efd4ce3fc4..63158268a3 100644 --- a/src/state/test/interactions.test.ts +++ b/src/state/test/interactions.test.ts @@ -82,7 +82,8 @@ const indexedGeom1Red: BarGeometry = { height: 100, value: { x: 0, - y: 0, + y: 10, + accessor: 'y1', }, geometryId: { specId: SPEC_ID, @@ -98,6 +99,7 @@ const indexedGeom2Blue: BarGeometry = { value: { x: 1, y: 5, + accessor: 'y1', }, geometryId: { specId: SPEC_ID, @@ -221,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 }); @@ -242,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 }); @@ -263,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 }); @@ -286,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 }); @@ -297,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); }); @@ -324,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); }); } From 2b1424572cb77d979160666245e030d494c45e4a Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 10 Apr 2019 00:04:22 +0200 Subject: [PATCH 05/11] fix: stacked bar tooltip with initial y1 value --- src/lib/series/rendering.ts | 4 +-- stories/area_chart.tsx | 2 +- stories/bar_chart.tsx | 54 +++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/src/lib/series/rendering.ts b/src/lib/series/rendering.ts index f8da842a52..242b70bdda 100644 --- a/src/lib/series/rendering.ts +++ b/src/lib/series/rendering.ts @@ -164,7 +164,7 @@ export function renderBars( const xScaleType = xScale.type; const barGeometries: BarGeometry[] = []; dataset.forEach((datum) => { - const { y0, y1 } = datum; + const { y0, y1, initialY1 } = datum; if (xScaleType === ScaleType.Ordinal && !xDomain.includes(datum.x)) { return; @@ -195,7 +195,7 @@ export function renderBars( color, value: { x: datum.x, - y: y1, + y: initialY1, accessor: 'y1', }, geometryId: { diff --git a/stories/area_chart.tsx b/stories/area_chart.tsx index 397b5e151b..bf4315d76c 100644 --- a/stories/area_chart.tsx +++ b/stories/area_chart.tsx @@ -368,7 +368,7 @@ storiesOf('Area Chart', module) ); }) - .add('Band area chart', () => { + .add('band area chart', () => { const data = KIBANA_METRICS.metrics.kibana_os_load[0].data.map((d) => { return { x: d[0], diff --git a/stories/bar_chart.tsx b/stories/bar_chart.tsx index 08f4bb81dc..eff5d82495 100644 --- a/stories/bar_chart.tsx +++ b/stories/bar_chart.tsx @@ -11,6 +11,7 @@ import { getAxisId, getSpecId, LIGHT_THEME, + LineSeries, niceTimeFormatByDay, Position, ScaleType, @@ -886,6 +887,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 ( From 06fa0c3caf37f3029038caa1a33ac3e4bee46349 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 10 Apr 2019 00:06:28 +0200 Subject: [PATCH 06/11] fix: missing accessor prop on geometry --- src/lib/series/rendering.test.ts | 2 ++ src/lib/utils/interactions.test.ts | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/lib/series/rendering.test.ts b/src/lib/series/rendering.test.ts index c7fb7d8760..57c2cd0d29 100644 --- a/src/lib/series/rendering.test.ts +++ b/src/lib/series/rendering.test.ts @@ -10,6 +10,7 @@ describe('Rendering utils', () => { specId: getSpecId('id'), }, value: { + accessor: 'y1', x: 0, y: 0, }, @@ -34,6 +35,7 @@ describe('Rendering utils', () => { specId: getSpecId('id'), }, value: { + accessor: 'y1', x: 0, y: 0, }, diff --git a/src/lib/utils/interactions.test.ts b/src/lib/utils/interactions.test.ts index adef5c69e7..85d5d92e7a 100644 --- a/src/lib/utils/interactions.test.ts +++ b/src/lib/utils/interactions.test.ts @@ -17,6 +17,7 @@ const ig1: IndexedGeometry = { seriesKey: [0, 1, 2], }, value: { + accessor: 'y1', x: 0, y: 1, }, @@ -31,6 +32,7 @@ const ig2: IndexedGeometry = { seriesKey: [0, 1, 2], }, value: { + accessor: 'y1', x: 0, y: 1, }, @@ -46,6 +48,7 @@ const ig3: IndexedGeometry = { seriesKey: [123, 123, 123], }, value: { + accessor: 'y1', x: 123, y: 123, }, @@ -62,6 +65,7 @@ const ig4: IndexedGeometry = { seriesKey: [123, 123, 123], }, value: { + accessor: 'y1', x: 123, y: 123, }, @@ -77,6 +81,7 @@ const ig5: IndexedGeometry = { seriesKey: [123, 123, 123], }, value: { + accessor: 'y1', x: 123, y: 123, }, @@ -92,6 +97,7 @@ const ig6: PointGeometry = { seriesKey: [123, 123, 123], }, value: { + accessor: 'y1', x: 123, y: 123, }, From f33271549051a9a4b0ccba43d91b6d208a9a7ddb Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 10 Apr 2019 14:21:22 +0200 Subject: [PATCH 07/11] test: updated tests for tooltip This commit also remove the wrongly conceived seriesKey with an undefined element in there. It's now a clean empty array if you wrongly specified a wrong split accessor --- src/lib/series/series.ts | 8 +- src/lib/series/tooltip.test.ts | 109 ++++++++++++++++++++++ src/lib/series/tooltip.ts | 114 +++++------------------ src/lib/utils/interactions.ts | 2 +- src/state/chart_state.timescales.test.ts | 36 +++---- src/state/chart_state.ts | 11 +-- stories/area_chart.tsx | 2 - 7 files changed, 159 insertions(+), 123 deletions(-) create mode 100644 src/lib/series/tooltip.test.ts diff --git a/src/lib/series/series.ts b/src/lib/series/series.ts index 2a6f8d0079..a9b17d78c3 100644 --- a/src/lib/series/series.ts +++ b/src/lib/series/series.ts @@ -156,9 +156,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); } /** diff --git a/src/lib/series/tooltip.test.ts b/src/lib/series/tooltip.test.ts new file mode 100644 index 0000000000..0522b6643a --- /dev/null +++ b/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/src/lib/series/tooltip.ts b/src/lib/series/tooltip.ts index 05f3354c0c..801238aae4 100644 --- a/src/lib/series/tooltip.ts +++ b/src/lib/series/tooltip.ts @@ -1,9 +1,7 @@ -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, TickFormatter } from './specs'; +import { AxisSpec, BasicSeriesSpec } from './specs'; export function getSeriesTooltipValues(tooltipValues: TooltipValue[]): Map { // map from seriesKey to tooltipValue @@ -25,105 +23,35 @@ export function getSeriesTooltipValues(tooltipValues: TooltipValue[]): Map 1) { - // the last element of the seriesKey is the yAccessor - yAccessors = seriesKey.slice(-1); - } - let accessors = yAccessors; - if (accessor === 'y0' && spec.y0Accessors) { - const y1AccessorIndex = spec.yAccessors.findIndex((acc) => { - return acc === yAccessors[0]; - }); - accessors = [spec.y0Accessors[y1AccessorIndex]]; - } - let name: string | undefined; - if (seriesKey.length > 0) { - name = seriesKey.join(' - '); - } else { - name = spec.name || `${spec.id}`; - } - // format y value - return formatAccessor( - spec.id, - seriesKey, - y, - accessors, - 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, + axisSpec?: AxisSpec, ): TooltipValue { + const { id } = spec; + const { + color, + value: { x, y }, + geometryId: { seriesKey }, + } = searchIndexValue; + const seriesKeyAsString = getColorValuesAsString(seriesKey, id); let name: string | undefined; - const { seriesKey } = searchIndexValue.geometryId; - const { x } = searchIndexValue.value; if (seriesKey.length > 0) { name = seriesKey.join(' - '); } else { name = spec.name || `${spec.id}`; } - const xValues = formatAccessor( - spec.id, - seriesKey, - x, - [spec.xAccessor], - color, - xAxis ? xAxis.tickFormat : emptyFormatter, - false, // never highlighted - true, // always x value - name, - ); - return xValues[0]; -} - -export function formatAccessor( - specId: SpecId, - seriesKeys: any[], - value: any, - 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(value), - color, - isHighlighted, - isXValue, - }; - }, - ); + const value = isXValue ? x : y; + return { + seriesKey: seriesKeyAsString, + name, + 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/src/lib/utils/interactions.ts b/src/lib/utils/interactions.ts index 9c937a60b3..e48e0f12cd 100644 --- a/src/lib/utils/interactions.ts +++ b/src/lib/utils/interactions.ts @@ -90,7 +90,7 @@ 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; diff --git a/src/state/chart_state.timescales.test.ts b/src/state/chart_state.timescales.test.ts index f9e43f439b..5d179d0d16 100644 --- a/src/state/chart_state.timescales.test.ts +++ b/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/src/state/chart_state.ts b/src/state/chart_state.ts index bdc1c2887a..a17ef9d668 100644 --- a/src/state/chart_state.ts +++ b/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'; @@ -330,7 +330,6 @@ export class ChartStore { (acc, indexedGeometry) => { const { geometryId: { specId }, - color, } = indexedGeometry; const spec = this.seriesSpecs.get(specId); @@ -361,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[], ); diff --git a/stories/area_chart.tsx b/stories/area_chart.tsx index bf4315d76c..a6b20eee0b 100644 --- a/stories/area_chart.tsx +++ b/stories/area_chart.tsx @@ -404,8 +404,6 @@ storiesOf('Area Chart', module) yAccessors={['max']} y0Accessors={['min']} data={data} - // this is a temporary hack to display names for min and max values - splitSeriesAccessors={['fake']} yScaleToDataExtent={scaleToDataExtent} curve={CurveType.CURVE_MONOTONE_X} /> From 4c155faf57e4130e19d4d42bba76b5e9b1bc77de Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 10 Apr 2019 19:44:23 +0200 Subject: [PATCH 08/11] refactor: moved stack processing to external function The logic of data structure in stacked charts is changed a bit to reflect correctly what are the initial values of the datum and what are the current stacked data --- .../series/__snapshots__/series.test.ts.snap | 2428 ++++++++++------- src/lib/series/rendering.ts | 4 +- src/lib/series/series.test.ts | 123 + src/lib/series/series.ts | 42 +- src/lib/series/stacked_series_utils.test.ts | 361 +++ src/lib/series/stacked_series_utils.ts | 48 + src/state/__snapshots__/utils.test.ts.snap | 8 +- stories/bar_chart.tsx | 67 + 8 files changed, 2028 insertions(+), 1053 deletions(-) create mode 100644 src/lib/series/stacked_series_utils.test.ts create mode 100644 src/lib/series/stacked_series_utils.ts diff --git a/src/lib/series/__snapshots__/series.test.ts.snap b/src/lib/series/__snapshots__/series.test.ts.snap index 037f6cf473..f4719d2e7c 100644 --- a/src/lib/series/__snapshots__/series.test.ts.snap +++ b/src/lib/series/__snapshots__/series.test.ts.snap @@ -1275,7 +1275,7 @@ Array [ "data": Array [ Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 0, "x": 0, "y0": 0, @@ -1283,7 +1283,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 1, "x": 1, "y0": 0, @@ -1291,7 +1291,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 2, "x": 2, "y0": 0, @@ -1299,7 +1299,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 3, "x": 3, "y0": 0, @@ -1307,7 +1307,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 4, "x": 4, "y0": 0, @@ -1315,7 +1315,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 5, "x": 5, "y0": 0, @@ -1323,7 +1323,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 6, "x": 6, "y0": 0, @@ -1331,7 +1331,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 7, "x": 7, "y0": 0, @@ -1339,7 +1339,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 8, "x": 8, "y0": 0, @@ -1347,7 +1347,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 9, "x": 9, "y0": 0, @@ -1355,7 +1355,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 10, "x": 10, "y0": 0, @@ -1363,7 +1363,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 11, "x": 11, "y0": 0, @@ -1371,7 +1371,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 12, "x": 12, "y0": 0, @@ -1379,7 +1379,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 13, "x": 13, "y0": 0, @@ -1387,7 +1387,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 14, "x": 14, "y0": 0, @@ -1395,7 +1395,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 15, "x": 15, "y0": 0, @@ -1403,7 +1403,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 16, "x": 16, "y0": 0, @@ -1411,7 +1411,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 17, "x": 17, "y0": 0, @@ -1419,7 +1419,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 18, "x": 18, "y0": 0, @@ -1427,7 +1427,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 19, "x": 19, "y0": 0, @@ -1435,7 +1435,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 20, "x": 20, "y0": 0, @@ -1443,7 +1443,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 21, "x": 21, "y0": 0, @@ -1451,7 +1451,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 22, "x": 22, "y0": 0, @@ -1459,7 +1459,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 23, "x": 23, "y0": 0, @@ -1467,7 +1467,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 24, "x": 24, "y0": 0, @@ -1475,7 +1475,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 25, "x": 25, "y0": 0, @@ -1483,7 +1483,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 26, "x": 26, "y0": 0, @@ -1491,7 +1491,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 27, "x": 27, "y0": 0, @@ -1499,7 +1499,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 28, "x": 28, "y0": 0, @@ -1507,7 +1507,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 29, "x": 29, "y0": 0, @@ -1515,7 +1515,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 30, "x": 30, "y0": 0, @@ -1523,7 +1523,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 31, "x": 31, "y0": 0, @@ -1531,7 +1531,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 32, "x": 32, "y0": 0, @@ -1539,7 +1539,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 33, "x": 33, "y0": 0, @@ -1547,7 +1547,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 34, "x": 34, "y0": 0, @@ -1555,7 +1555,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 35, "x": 35, "y0": 0, @@ -1563,7 +1563,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 36, "x": 36, "y0": 0, @@ -1571,7 +1571,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 37, "x": 37, "y0": 0, @@ -1579,7 +1579,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 38, "x": 38, "y0": 0, @@ -1587,7 +1587,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 39, "x": 39, "y0": 0, @@ -1595,7 +1595,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 40, "x": 40, "y0": 0, @@ -1603,7 +1603,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 41, "x": 41, "y0": 0, @@ -1611,7 +1611,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 42, "x": 42, "y0": 0, @@ -1619,7 +1619,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 43, "x": 43, "y0": 0, @@ -1627,7 +1627,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 44, "x": 44, "y0": 0, @@ -1635,7 +1635,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 45, "x": 45, "y0": 0, @@ -1643,7 +1643,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 46, "x": 46, "y0": 0, @@ -1651,7 +1651,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 47, "x": 47, "y0": 0, @@ -1659,7 +1659,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 48, "x": 48, "y0": 0, @@ -1667,7 +1667,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 49, "x": 49, "y0": 0, @@ -1675,7 +1675,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 50, "x": 50, "y0": 0, @@ -1683,7 +1683,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 51, "x": 51, "y0": 0, @@ -1691,7 +1691,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 52, "x": 52, "y0": 0, @@ -1699,7 +1699,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 53, "x": 53, "y0": 0, @@ -1707,7 +1707,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 54, "x": 54, "y0": 0, @@ -1715,7 +1715,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 55, "x": 55, "y0": 0, @@ -1723,7 +1723,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 56, "x": 56, "y0": 0, @@ -1731,7 +1731,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 57, "x": 57, "y0": 0, @@ -1739,7 +1739,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 58, "x": 58, "y0": 0, @@ -1747,7 +1747,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 59, "x": 59, "y0": 0, @@ -1755,7 +1755,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 60, "x": 60, "y0": 0, @@ -1763,7 +1763,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 61, "x": 61, "y0": 0, @@ -1771,7 +1771,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 62, "x": 62, "y0": 0, @@ -1779,7 +1779,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 63, "x": 63, "y0": 0, @@ -1787,7 +1787,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 64, "x": 64, "y0": 0, @@ -1795,7 +1795,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 65, "x": 65, "y0": 0, @@ -1803,7 +1803,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 66, "x": 66, "y0": 0, @@ -1811,7 +1811,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 67, "x": 67, "y0": 0, @@ -1819,7 +1819,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 68, "x": 68, "y0": 0, @@ -1827,7 +1827,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 69, "x": 69, "y0": 0, @@ -1835,7 +1835,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 70, "x": 70, "y0": 0, @@ -1843,7 +1843,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 71, "x": 71, "y0": 0, @@ -1851,7 +1851,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 72, "x": 72, "y0": 0, @@ -1859,7 +1859,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 73, "x": 73, "y0": 0, @@ -1867,7 +1867,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 74, "x": 74, "y0": 0, @@ -1875,7 +1875,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 75, "x": 75, "y0": 0, @@ -1883,7 +1883,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 76, "x": 76, "y0": 0, @@ -1891,7 +1891,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 77, "x": 77, "y0": 0, @@ -1899,7 +1899,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 78, "x": 78, "y0": 0, @@ -1907,7 +1907,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 79, "x": 79, "y0": 0, @@ -1915,7 +1915,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 80, "x": 80, "y0": 0, @@ -1923,7 +1923,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 81, "x": 81, "y0": 0, @@ -1931,7 +1931,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 82, "x": 82, "y0": 0, @@ -1939,7 +1939,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 83, "x": 83, "y0": 0, @@ -1947,7 +1947,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 84, "x": 84, "y0": 0, @@ -1955,7 +1955,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 85, "x": 85, "y0": 0, @@ -1963,7 +1963,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 86, "x": 86, "y0": 0, @@ -1971,7 +1971,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 87, "x": 87, "y0": 0, @@ -1979,7 +1979,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 88, "x": 88, "y0": 0, @@ -1987,7 +1987,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 89, "x": 89, "y0": 0, @@ -1995,7 +1995,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 90, "x": 90, "y0": 0, @@ -2003,7 +2003,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 91, "x": 91, "y0": 0, @@ -2011,7 +2011,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 92, "x": 92, "y0": 0, @@ -2019,7 +2019,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 93, "x": 93, "y0": 0, @@ -2027,7 +2027,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 94, "x": 94, "y0": 0, @@ -2035,7 +2035,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 95, "x": 95, "y0": 0, @@ -2043,7 +2043,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 96, "x": 96, "y0": 0, @@ -2051,7 +2051,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 97, "x": 97, "y0": 0, @@ -2059,7 +2059,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 98, "x": 98, "y0": 0, @@ -2067,7 +2067,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 99, "x": 99, "y0": 0, @@ -2075,7 +2075,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 100, "x": 100, "y0": 0, @@ -2083,7 +2083,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 101, "x": 101, "y0": 0, @@ -2091,7 +2091,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 102, "x": 102, "y0": 0, @@ -2099,7 +2099,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 103, "x": 103, "y0": 0, @@ -2107,7 +2107,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 104, "x": 104, "y0": 0, @@ -2115,7 +2115,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 105, "x": 105, "y0": 0, @@ -2123,7 +2123,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 106, "x": 106, "y0": 0, @@ -2131,7 +2131,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 107, "x": 107, "y0": 0, @@ -2139,7 +2139,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 108, "x": 108, "y0": 0, @@ -2147,7 +2147,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 109, "x": 109, "y0": 0, @@ -2155,7 +2155,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 110, "x": 110, "y0": 0, @@ -2163,7 +2163,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 111, "x": 111, "y0": 0, @@ -2171,7 +2171,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 112, "x": 112, "y0": 0, @@ -2179,7 +2179,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 113, "x": 113, "y0": 0, @@ -2187,7 +2187,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 114, "x": 114, "y0": 0, @@ -2195,7 +2195,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 115, "x": 115, "y0": 0, @@ -2203,7 +2203,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 116, "x": 116, "y0": 0, @@ -2211,7 +2211,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 117, "x": 117, "y0": 0, @@ -2219,7 +2219,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 118, "x": 118, "y0": 0, @@ -2227,7 +2227,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 119, "x": 119, "y0": 0, @@ -2235,7 +2235,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 120, "x": 120, "y0": 0, @@ -2243,7 +2243,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 121, "x": 121, "y0": 0, @@ -2251,7 +2251,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 122, "x": 122, "y0": 0, @@ -2259,7 +2259,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 123, "x": 123, "y0": 0, @@ -2267,7 +2267,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 124, "x": 124, "y0": 0, @@ -2275,7 +2275,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 125, "x": 125, "y0": 0, @@ -2283,7 +2283,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 126, "x": 126, "y0": 0, @@ -2291,7 +2291,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 127, "x": 127, "y0": 0, @@ -2299,7 +2299,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 128, "x": 128, "y0": 0, @@ -2307,7 +2307,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 129, "x": 129, "y0": 0, @@ -2315,7 +2315,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 130, "x": 130, "y0": 0, @@ -2323,7 +2323,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 131, "x": 131, "y0": 0, @@ -2331,7 +2331,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 132, "x": 132, "y0": 0, @@ -2339,7 +2339,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 133, "x": 133, "y0": 0, @@ -2347,7 +2347,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 134, "x": 134, "y0": 0, @@ -2355,7 +2355,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 135, "x": 135, "y0": 0, @@ -2363,7 +2363,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 136, "x": 136, "y0": 0, @@ -2371,7 +2371,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 137, "x": 137, "y0": 0, @@ -2379,7 +2379,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 138, "x": 138, "y0": 0, @@ -2387,7 +2387,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 139, "x": 139, "y0": 0, @@ -2395,7 +2395,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 140, "x": 140, "y0": 0, @@ -2403,7 +2403,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 141, "x": 141, "y0": 0, @@ -2411,7 +2411,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 142, "x": 142, "y0": 0, @@ -2419,7 +2419,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 143, "x": 143, "y0": 0, @@ -2427,7 +2427,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 144, "x": 144, "y0": 0, @@ -2435,7 +2435,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 145, "x": 145, "y0": 0, @@ -2443,7 +2443,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 146, "x": 146, "y0": 0, @@ -2451,7 +2451,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 147, "x": 147, "y0": 0, @@ -2459,7 +2459,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 148, "x": 148, "y0": 0, @@ -2467,7 +2467,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 149, "x": 149, "y0": 0, @@ -2475,7 +2475,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 150, "x": 150, "y0": 0, @@ -2483,7 +2483,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 151, "x": 151, "y0": 0, @@ -2491,7 +2491,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 152, "x": 152, "y0": 0, @@ -2499,7 +2499,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 153, "x": 153, "y0": 0, @@ -2507,7 +2507,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 154, "x": 154, "y0": 0, @@ -2515,7 +2515,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 155, "x": 155, "y0": 0, @@ -2523,7 +2523,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 156, "x": 156, "y0": 0, @@ -2531,7 +2531,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 157, "x": 157, "y0": 0, @@ -2539,7 +2539,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 158, "x": 158, "y0": 0, @@ -2547,7 +2547,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 159, "x": 159, "y0": 0, @@ -2555,7 +2555,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 160, "x": 160, "y0": 0, @@ -2563,7 +2563,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 161, "x": 161, "y0": 0, @@ -2571,7 +2571,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 162, "x": 162, "y0": 0, @@ -2579,7 +2579,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 163, "x": 163, "y0": 0, @@ -2587,7 +2587,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 164, "x": 164, "y0": 0, @@ -2595,7 +2595,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 165, "x": 165, "y0": 0, @@ -2603,7 +2603,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 166, "x": 166, "y0": 0, @@ -2611,7 +2611,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 167, "x": 167, "y0": 0, @@ -2619,7 +2619,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 168, "x": 168, "y0": 0, @@ -2627,7 +2627,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 169, "x": 169, "y0": 0, @@ -2635,7 +2635,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 170, "x": 170, "y0": 0, @@ -2643,7 +2643,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 171, "x": 171, "y0": 0, @@ -2651,7 +2651,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 172, "x": 172, "y0": 0, @@ -2659,7 +2659,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 173, "x": 173, "y0": 0, @@ -2667,7 +2667,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 174, "x": 174, "y0": 0, @@ -2675,7 +2675,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 175, "x": 175, "y0": 0, @@ -2683,7 +2683,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 176, "x": 176, "y0": 0, @@ -2691,7 +2691,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 177, "x": 177, "y0": 0, @@ -2699,7 +2699,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 178, "x": 178, "y0": 0, @@ -2707,7 +2707,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 179, "x": 179, "y0": 0, @@ -2715,7 +2715,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 180, "x": 180, "y0": 0, @@ -2723,7 +2723,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 181, "x": 181, "y0": 0, @@ -2731,7 +2731,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 182, "x": 182, "y0": 0, @@ -2739,7 +2739,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 183, "x": 183, "y0": 0, @@ -2747,7 +2747,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 184, "x": 184, "y0": 0, @@ -2755,7 +2755,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 185, "x": 185, "y0": 0, @@ -2763,7 +2763,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 186, "x": 186, "y0": 0, @@ -2771,7 +2771,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 187, "x": 187, "y0": 0, @@ -2779,7 +2779,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 188, "x": 188, "y0": 0, @@ -2787,7 +2787,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 189, "x": 189, "y0": 0, @@ -2795,7 +2795,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 190, "x": 190, "y0": 0, @@ -2803,7 +2803,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 191, "x": 191, "y0": 0, @@ -2811,7 +2811,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 192, "x": 192, "y0": 0, @@ -2819,7 +2819,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 193, "x": 193, "y0": 0, @@ -2827,7 +2827,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 194, "x": 194, "y0": 0, @@ -2835,7 +2835,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 195, "x": 195, "y0": 0, @@ -2843,7 +2843,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 196, "x": 196, "y0": 0, @@ -2851,7 +2851,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 197, "x": 197, "y0": 0, @@ -2859,7 +2859,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 198, "x": 198, "y0": 0, @@ -2867,7 +2867,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 199, "x": 199, "y0": 0, @@ -2875,7 +2875,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 200, "x": 200, "y0": 0, @@ -2883,7 +2883,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 201, "x": 201, "y0": 0, @@ -2891,7 +2891,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 202, "x": 202, "y0": 0, @@ -2899,7 +2899,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 203, "x": 203, "y0": 0, @@ -2907,7 +2907,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 204, "x": 204, "y0": 0, @@ -2915,7 +2915,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 205, "x": 205, "y0": 0, @@ -2923,7 +2923,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 206, "x": 206, "y0": 0, @@ -2931,7 +2931,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 207, "x": 207, "y0": 0, @@ -2939,7 +2939,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 208, "x": 208, "y0": 0, @@ -2947,7 +2947,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 209, "x": 209, "y0": 0, @@ -2955,7 +2955,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 210, "x": 210, "y0": 0, @@ -2963,7 +2963,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 211, "x": 211, "y0": 0, @@ -2971,7 +2971,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 212, "x": 212, "y0": 0, @@ -2979,7 +2979,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 213, "x": 213, "y0": 0, @@ -2987,7 +2987,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 214, "x": 214, "y0": 0, @@ -2995,7 +2995,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 215, "x": 215, "y0": 0, @@ -3003,7 +3003,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 216, "x": 216, "y0": 0, @@ -3011,7 +3011,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 217, "x": 217, "y0": 0, @@ -3019,7 +3019,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 218, "x": 218, "y0": 0, @@ -3027,7 +3027,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 219, "x": 219, "y0": 0, @@ -3035,7 +3035,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 220, "x": 220, "y0": 0, @@ -3043,7 +3043,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 221, "x": 221, "y0": 0, @@ -3051,7 +3051,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 222, "x": 222, "y0": 0, @@ -3059,7 +3059,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 223, "x": 223, "y0": 0, @@ -3067,7 +3067,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 224, "x": 224, "y0": 0, @@ -3075,7 +3075,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 225, "x": 225, "y0": 0, @@ -3083,7 +3083,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 226, "x": 226, "y0": 0, @@ -3091,7 +3091,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 227, "x": 227, "y0": 0, @@ -3099,7 +3099,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 228, "x": 228, "y0": 0, @@ -3107,7 +3107,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 229, "x": 229, "y0": 0, @@ -3115,7 +3115,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 230, "x": 230, "y0": 0, @@ -3123,7 +3123,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 231, "x": 231, "y0": 0, @@ -3131,7 +3131,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 232, "x": 232, "y0": 0, @@ -3139,7 +3139,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 233, "x": 233, "y0": 0, @@ -3147,7 +3147,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 234, "x": 234, "y0": 0, @@ -3155,7 +3155,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 235, "x": 235, "y0": 0, @@ -3163,7 +3163,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 236, "x": 236, "y0": 0, @@ -3171,7 +3171,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 237, "x": 237, "y0": 0, @@ -3179,7 +3179,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 238, "x": 238, "y0": 0, @@ -3187,7 +3187,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 239, "x": 239, "y0": 0, @@ -3195,7 +3195,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 240, "x": 240, "y0": 0, @@ -3203,7 +3203,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 241, "x": 241, "y0": 0, @@ -3211,7 +3211,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 242, "x": 242, "y0": 0, @@ -3219,7 +3219,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 243, "x": 243, "y0": 0, @@ -3227,7 +3227,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 244, "x": 244, "y0": 0, @@ -3235,7 +3235,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 245, "x": 245, "y0": 0, @@ -3243,7 +3243,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 246, "x": 246, "y0": 0, @@ -3251,7 +3251,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 247, "x": 247, "y0": 0, @@ -3259,7 +3259,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 248, "x": 248, "y0": 0, @@ -3267,7 +3267,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 249, "x": 249, "y0": 0, @@ -3275,7 +3275,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 250, "x": 250, "y0": 0, @@ -3283,7 +3283,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 251, "x": 251, "y0": 0, @@ -3291,7 +3291,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 252, "x": 252, "y0": 0, @@ -3299,7 +3299,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 253, "x": 253, "y0": 0, @@ -3307,7 +3307,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 254, "x": 254, "y0": 0, @@ -3315,7 +3315,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 255, "x": 255, "y0": 0, @@ -3323,7 +3323,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 256, "x": 256, "y0": 0, @@ -3331,7 +3331,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 257, "x": 257, "y0": 0, @@ -3339,7 +3339,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 258, "x": 258, "y0": 0, @@ -3347,7 +3347,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 259, "x": 259, "y0": 0, @@ -3355,7 +3355,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 260, "x": 260, "y0": 0, @@ -3363,7 +3363,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 261, "x": 261, "y0": 0, @@ -3371,7 +3371,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 262, "x": 262, "y0": 0, @@ -3379,7 +3379,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 263, "x": 263, "y0": 0, @@ -3387,7 +3387,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 264, "x": 264, "y0": 0, @@ -3395,7 +3395,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 265, "x": 265, "y0": 0, @@ -3403,7 +3403,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 266, "x": 266, "y0": 0, @@ -3411,7 +3411,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 267, "x": 267, "y0": 0, @@ -3419,7 +3419,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 268, "x": 268, "y0": 0, @@ -3427,7 +3427,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 269, "x": 269, "y0": 0, @@ -3435,7 +3435,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 270, "x": 270, "y0": 0, @@ -3443,7 +3443,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 271, "x": 271, "y0": 0, @@ -3451,7 +3451,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 272, "x": 272, "y0": 0, @@ -3459,7 +3459,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 273, "x": 273, "y0": 0, @@ -3467,7 +3467,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 274, "x": 274, "y0": 0, @@ -3475,7 +3475,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 275, "x": 275, "y0": 0, @@ -3483,7 +3483,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 276, "x": 276, "y0": 0, @@ -3491,7 +3491,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 277, "x": 277, "y0": 0, @@ -3499,7 +3499,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 278, "x": 278, "y0": 0, @@ -3507,7 +3507,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 279, "x": 279, "y0": 0, @@ -3515,7 +3515,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 280, "x": 280, "y0": 0, @@ -3523,7 +3523,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 281, "x": 281, "y0": 0, @@ -3531,7 +3531,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 282, "x": 282, "y0": 0, @@ -3539,7 +3539,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 283, "x": 283, "y0": 0, @@ -3547,7 +3547,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 284, "x": 284, "y0": 0, @@ -3555,7 +3555,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 285, "x": 285, "y0": 0, @@ -3563,7 +3563,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 286, "x": 286, "y0": 0, @@ -3571,7 +3571,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 287, "x": 287, "y0": 0, @@ -3579,7 +3579,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 288, "x": 288, "y0": 0, @@ -3587,7 +3587,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 289, "x": 289, "y0": 0, @@ -3595,7 +3595,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 290, "x": 290, "y0": 0, @@ -3603,7 +3603,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 291, "x": 291, "y0": 0, @@ -3611,7 +3611,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 292, "x": 292, "y0": 0, @@ -3619,7 +3619,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 293, "x": 293, "y0": 0, @@ -3627,7 +3627,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 294, "x": 294, "y0": 0, @@ -3635,7 +3635,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 295, "x": 295, "y0": 0, @@ -3643,7 +3643,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 296, "x": 296, "y0": 0, @@ -3651,7 +3651,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 297, "x": 297, "y0": 0, @@ -3659,7 +3659,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 298, "x": 298, "y0": 0, @@ -3667,7 +3667,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 299, "x": 299, "y0": 0, @@ -3675,7 +3675,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 300, "x": 300, "y0": 0, @@ -3683,7 +3683,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 301, "x": 301, "y0": 0, @@ -3691,7 +3691,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 302, "x": 302, "y0": 0, @@ -3699,7 +3699,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 303, "x": 303, "y0": 0, @@ -3707,7 +3707,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 304, "x": 304, "y0": 0, @@ -3715,7 +3715,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 305, "x": 305, "y0": 0, @@ -3723,7 +3723,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 306, "x": 306, "y0": 0, @@ -3731,7 +3731,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 307, "x": 307, "y0": 0, @@ -3739,7 +3739,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 308, "x": 308, "y0": 0, @@ -3747,7 +3747,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 309, "x": 309, "y0": 0, @@ -3755,7 +3755,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 310, "x": 310, "y0": 0, @@ -3763,7 +3763,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 311, "x": 311, "y0": 0, @@ -3771,7 +3771,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 312, "x": 312, "y0": 0, @@ -3779,7 +3779,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 313, "x": 313, "y0": 0, @@ -3787,7 +3787,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 314, "x": 314, "y0": 0, @@ -3795,7 +3795,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 315, "x": 315, "y0": 0, @@ -3803,7 +3803,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 316, "x": 316, "y0": 0, @@ -3811,7 +3811,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 317, "x": 317, "y0": 0, @@ -3819,7 +3819,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 318, "x": 318, "y0": 0, @@ -3827,7 +3827,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 319, "x": 319, "y0": 0, @@ -3835,7 +3835,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 320, "x": 320, "y0": 0, @@ -3843,7 +3843,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 321, "x": 321, "y0": 0, @@ -3851,7 +3851,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 322, "x": 322, "y0": 0, @@ -3859,7 +3859,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 323, "x": 323, "y0": 0, @@ -3867,7 +3867,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 324, "x": 324, "y0": 0, @@ -3875,7 +3875,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 325, "x": 325, "y0": 0, @@ -3883,7 +3883,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 326, "x": 326, "y0": 0, @@ -3891,7 +3891,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 327, "x": 327, "y0": 0, @@ -3899,7 +3899,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 328, "x": 328, "y0": 0, @@ -3907,7 +3907,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 329, "x": 329, "y0": 0, @@ -3915,7 +3915,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 330, "x": 330, "y0": 0, @@ -3923,7 +3923,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 331, "x": 331, "y0": 0, @@ -3931,7 +3931,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 332, "x": 332, "y0": 0, @@ -3939,7 +3939,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 333, "x": 333, "y0": 0, @@ -3947,7 +3947,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 334, "x": 334, "y0": 0, @@ -3955,7 +3955,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 335, "x": 335, "y0": 0, @@ -3963,7 +3963,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 336, "x": 336, "y0": 0, @@ -3971,7 +3971,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 337, "x": 337, "y0": 0, @@ -3979,7 +3979,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 338, "x": 338, "y0": 0, @@ -3987,7 +3987,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 339, "x": 339, "y0": 0, @@ -3995,7 +3995,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 340, "x": 340, "y0": 0, @@ -4003,7 +4003,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 341, "x": 341, "y0": 0, @@ -4011,7 +4011,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 342, "x": 342, "y0": 0, @@ -4019,7 +4019,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 343, "x": 343, "y0": 0, @@ -4027,7 +4027,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 344, "x": 344, "y0": 0, @@ -4035,7 +4035,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 345, "x": 345, "y0": 0, @@ -4043,7 +4043,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 346, "x": 346, "y0": 0, @@ -4051,7 +4051,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 347, "x": 347, "y0": 0, @@ -4059,7 +4059,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 348, "x": 348, "y0": 0, @@ -4067,7 +4067,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 349, "x": 349, "y0": 0, @@ -4075,7 +4075,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 350, "x": 350, "y0": 0, @@ -4083,7 +4083,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 351, "x": 351, "y0": 0, @@ -4091,7 +4091,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 352, "x": 352, "y0": 0, @@ -4099,7 +4099,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 353, "x": 353, "y0": 0, @@ -4107,7 +4107,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 354, "x": 354, "y0": 0, @@ -4115,7 +4115,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 355, "x": 355, "y0": 0, @@ -4123,7 +4123,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 356, "x": 356, "y0": 0, @@ -4131,7 +4131,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 357, "x": 357, "y0": 0, @@ -4139,7 +4139,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 358, "x": 358, "y0": 0, @@ -4147,7 +4147,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 359, "x": 359, "y0": 0, @@ -4155,7 +4155,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 360, "x": 360, "y0": 0, @@ -4163,7 +4163,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 361, "x": 361, "y0": 0, @@ -4171,7 +4171,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 362, "x": 362, "y0": 0, @@ -4179,7 +4179,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 363, "x": 363, "y0": 0, @@ -4187,7 +4187,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 364, "x": 364, "y0": 0, @@ -4195,7 +4195,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 365, "x": 365, "y0": 0, @@ -4203,7 +4203,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 366, "x": 366, "y0": 0, @@ -4211,7 +4211,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 367, "x": 367, "y0": 0, @@ -4219,7 +4219,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 368, "x": 368, "y0": 0, @@ -4227,7 +4227,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 369, "x": 369, "y0": 0, @@ -4235,7 +4235,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 370, "x": 370, "y0": 0, @@ -4243,7 +4243,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 371, "x": 371, "y0": 0, @@ -4251,7 +4251,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 372, "x": 372, "y0": 0, @@ -4259,7 +4259,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 373, "x": 373, "y0": 0, @@ -4267,7 +4267,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 374, "x": 374, "y0": 0, @@ -4275,7 +4275,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 375, "x": 375, "y0": 0, @@ -4283,7 +4283,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 376, "x": 376, "y0": 0, @@ -4291,7 +4291,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 377, "x": 377, "y0": 0, @@ -4299,7 +4299,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 378, "x": 378, "y0": 0, @@ -4307,7 +4307,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 379, "x": 379, "y0": 0, @@ -4315,7 +4315,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 380, "x": 380, "y0": 0, @@ -4323,7 +4323,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 381, "x": 381, "y0": 0, @@ -4331,7 +4331,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 382, "x": 382, "y0": 0, @@ -4339,7 +4339,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 383, "x": 383, "y0": 0, @@ -4347,7 +4347,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 384, "x": 384, "y0": 0, @@ -4355,7 +4355,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 385, "x": 385, "y0": 0, @@ -4363,7 +4363,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 386, "x": 386, "y0": 0, @@ -4371,7 +4371,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 387, "x": 387, "y0": 0, @@ -4379,7 +4379,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 388, "x": 388, "y0": 0, @@ -4387,7 +4387,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 389, "x": 389, "y0": 0, @@ -4395,7 +4395,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 390, "x": 390, "y0": 0, @@ -4403,7 +4403,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 391, "x": 391, "y0": 0, @@ -4411,7 +4411,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 392, "x": 392, "y0": 0, @@ -4419,7 +4419,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 393, "x": 393, "y0": 0, @@ -4427,7 +4427,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 394, "x": 394, "y0": 0, @@ -4435,7 +4435,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 395, "x": 395, "y0": 0, @@ -4443,7 +4443,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 396, "x": 396, "y0": 0, @@ -4451,7 +4451,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 397, "x": 397, "y0": 0, @@ -4459,7 +4459,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 398, "x": 398, "y0": 0, @@ -4467,7 +4467,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 399, "x": 399, "y0": 0, @@ -4475,7 +4475,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 400, "x": 400, "y0": 0, @@ -4483,7 +4483,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 401, "x": 401, "y0": 0, @@ -4491,7 +4491,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 402, "x": 402, "y0": 0, @@ -4499,7 +4499,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 403, "x": 403, "y0": 0, @@ -4507,7 +4507,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 404, "x": 404, "y0": 0, @@ -4515,7 +4515,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 405, "x": 405, "y0": 0, @@ -4523,7 +4523,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 406, "x": 406, "y0": 0, @@ -4531,7 +4531,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 407, "x": 407, "y0": 0, @@ -4539,7 +4539,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 408, "x": 408, "y0": 0, @@ -4547,7 +4547,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 409, "x": 409, "y0": 0, @@ -4555,7 +4555,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 410, "x": 410, "y0": 0, @@ -4563,7 +4563,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 411, "x": 411, "y0": 0, @@ -4571,7 +4571,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 412, "x": 412, "y0": 0, @@ -4579,7 +4579,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 413, "x": 413, "y0": 0, @@ -4587,7 +4587,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 414, "x": 414, "y0": 0, @@ -4595,7 +4595,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 415, "x": 415, "y0": 0, @@ -4603,7 +4603,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 416, "x": 416, "y0": 0, @@ -4611,7 +4611,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 417, "x": 417, "y0": 0, @@ -4619,7 +4619,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 418, "x": 418, "y0": 0, @@ -4627,7 +4627,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 419, "x": 419, "y0": 0, @@ -4635,7 +4635,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 420, "x": 420, "y0": 0, @@ -4643,7 +4643,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 421, "x": 421, "y0": 0, @@ -4651,7 +4651,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 422, "x": 422, "y0": 0, @@ -4659,7 +4659,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 423, "x": 423, "y0": 0, @@ -4667,7 +4667,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 424, "x": 424, "y0": 0, @@ -4675,7 +4675,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 425, "x": 425, "y0": 0, @@ -4683,7 +4683,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 426, "x": 426, "y0": 0, @@ -4691,7 +4691,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 427, "x": 427, "y0": 0, @@ -4699,7 +4699,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 428, "x": 428, "y0": 0, @@ -4707,7 +4707,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 429, "x": 429, "y0": 0, @@ -4715,7 +4715,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 430, "x": 430, "y0": 0, @@ -4723,7 +4723,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 431, "x": 431, "y0": 0, @@ -4731,7 +4731,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 432, "x": 432, "y0": 0, @@ -4739,7 +4739,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 433, "x": 433, "y0": 0, @@ -4747,7 +4747,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 434, "x": 434, "y0": 0, @@ -4755,7 +4755,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 435, "x": 435, "y0": 0, @@ -4763,7 +4763,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 436, "x": 436, "y0": 0, @@ -4771,7 +4771,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 437, "x": 437, "y0": 0, @@ -4779,7 +4779,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 438, "x": 438, "y0": 0, @@ -4787,7 +4787,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 439, "x": 439, "y0": 0, @@ -4795,7 +4795,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 440, "x": 440, "y0": 0, @@ -4803,7 +4803,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 441, "x": 441, "y0": 0, @@ -4811,7 +4811,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 442, "x": 442, "y0": 0, @@ -4819,7 +4819,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 443, "x": 443, "y0": 0, @@ -4827,7 +4827,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 444, "x": 444, "y0": 0, @@ -4835,7 +4835,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 445, "x": 445, "y0": 0, @@ -4843,7 +4843,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 446, "x": 446, "y0": 0, @@ -4851,7 +4851,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 447, "x": 447, "y0": 0, @@ -4859,7 +4859,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 448, "x": 448, "y0": 0, @@ -4867,7 +4867,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 449, "x": 449, "y0": 0, @@ -4875,7 +4875,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 450, "x": 450, "y0": 0, @@ -4883,7 +4883,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 451, "x": 451, "y0": 0, @@ -4891,7 +4891,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 452, "x": 452, "y0": 0, @@ -4899,7 +4899,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 453, "x": 453, "y0": 0, @@ -4907,7 +4907,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 454, "x": 454, "y0": 0, @@ -4915,7 +4915,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 455, "x": 455, "y0": 0, @@ -4923,7 +4923,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 456, "x": 456, "y0": 0, @@ -4931,7 +4931,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 457, "x": 457, "y0": 0, @@ -4939,7 +4939,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 458, "x": 458, "y0": 0, @@ -4947,7 +4947,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 459, "x": 459, "y0": 0, @@ -4955,7 +4955,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 460, "x": 460, "y0": 0, @@ -4963,7 +4963,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 461, "x": 461, "y0": 0, @@ -4971,7 +4971,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 462, "x": 462, "y0": 0, @@ -4979,7 +4979,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 463, "x": 463, "y0": 0, @@ -4987,7 +4987,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 464, "x": 464, "y0": 0, @@ -4995,7 +4995,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 465, "x": 465, "y0": 0, @@ -5003,7 +5003,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 466, "x": 466, "y0": 0, @@ -5011,7 +5011,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 467, "x": 467, "y0": 0, @@ -5019,7 +5019,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 468, "x": 468, "y0": 0, @@ -5027,7 +5027,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 469, "x": 469, "y0": 0, @@ -5035,7 +5035,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 470, "x": 470, "y0": 0, @@ -5043,7 +5043,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 471, "x": 471, "y0": 0, @@ -5051,7 +5051,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 472, "x": 472, "y0": 0, @@ -5059,7 +5059,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 473, "x": 473, "y0": 0, @@ -5067,7 +5067,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 474, "x": 474, "y0": 0, @@ -5075,7 +5075,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 475, "x": 475, "y0": 0, @@ -5083,7 +5083,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 476, "x": 476, "y0": 0, @@ -5091,7 +5091,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 477, "x": 477, "y0": 0, @@ -5099,7 +5099,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 478, "x": 478, "y0": 0, @@ -5107,7 +5107,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 479, "x": 479, "y0": 0, @@ -5115,7 +5115,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 480, "x": 480, "y0": 0, @@ -5123,7 +5123,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 481, "x": 481, "y0": 0, @@ -5131,7 +5131,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 482, "x": 482, "y0": 0, @@ -5139,7 +5139,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 483, "x": 483, "y0": 0, @@ -5147,7 +5147,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 484, "x": 484, "y0": 0, @@ -5155,7 +5155,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 485, "x": 485, "y0": 0, @@ -5163,7 +5163,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 486, "x": 486, "y0": 0, @@ -5171,7 +5171,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 487, "x": 487, "y0": 0, @@ -5179,7 +5179,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 488, "x": 488, "y0": 0, @@ -5187,7 +5187,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 489, "x": 489, "y0": 0, @@ -5195,7 +5195,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 490, "x": 490, "y0": 0, @@ -5203,7 +5203,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 491, "x": 491, "y0": 0, @@ -5211,7 +5211,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 492, "x": 492, "y0": 0, @@ -5219,7 +5219,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 493, "x": 493, "y0": 0, @@ -5227,7 +5227,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 494, "x": 494, "y0": 0, @@ -5235,7 +5235,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 495, "x": 495, "y0": 0, @@ -5243,7 +5243,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 496, "x": 496, "y0": 0, @@ -5251,7 +5251,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 497, "x": 497, "y0": 0, @@ -5259,7 +5259,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 498, "x": 498, "y0": 0, @@ -5267,7 +5267,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 499, "x": 499, "y0": 0, @@ -5275,7 +5275,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 500, "x": 500, "y0": 0, @@ -5283,7 +5283,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 501, "x": 501, "y0": 0, @@ -5291,7 +5291,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 502, "x": 502, "y0": 0, @@ -5299,7 +5299,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 503, "x": 503, "y0": 0, @@ -5307,7 +5307,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 504, "x": 504, "y0": 0, @@ -5315,7 +5315,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 505, "x": 505, "y0": 0, @@ -5323,7 +5323,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 506, "x": 506, "y0": 0, @@ -5331,7 +5331,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 507, "x": 507, "y0": 0, @@ -5339,7 +5339,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 508, "x": 508, "y0": 0, @@ -5347,7 +5347,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 509, "x": 509, "y0": 0, @@ -5355,7 +5355,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 510, "x": 510, "y0": 0, @@ -5363,7 +5363,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 511, "x": 511, "y0": 0, @@ -5371,7 +5371,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 512, "x": 512, "y0": 0, @@ -5379,7 +5379,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 513, "x": 513, "y0": 0, @@ -5387,7 +5387,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 514, "x": 514, "y0": 0, @@ -5395,7 +5395,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 515, "x": 515, "y0": 0, @@ -5403,7 +5403,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 516, "x": 516, "y0": 0, @@ -5411,7 +5411,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 517, "x": 517, "y0": 0, @@ -5419,7 +5419,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 518, "x": 518, "y0": 0, @@ -5427,7 +5427,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 519, "x": 519, "y0": 0, @@ -5435,7 +5435,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 520, "x": 520, "y0": 0, @@ -5443,7 +5443,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 521, "x": 521, "y0": 0, @@ -5451,7 +5451,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 522, "x": 522, "y0": 0, @@ -5459,7 +5459,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 523, "x": 523, "y0": 0, @@ -5467,7 +5467,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 524, "x": 524, "y0": 0, @@ -5475,7 +5475,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 525, "x": 525, "y0": 0, @@ -5483,7 +5483,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 526, "x": 526, "y0": 0, @@ -5491,7 +5491,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 527, "x": 527, "y0": 0, @@ -5499,7 +5499,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 528, "x": 528, "y0": 0, @@ -5507,7 +5507,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 529, "x": 529, "y0": 0, @@ -5515,7 +5515,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 530, "x": 530, "y0": 0, @@ -5523,7 +5523,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 531, "x": 531, "y0": 0, @@ -5531,7 +5531,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 532, "x": 532, "y0": 0, @@ -5539,7 +5539,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 533, "x": 533, "y0": 0, @@ -5547,7 +5547,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 534, "x": 534, "y0": 0, @@ -5555,7 +5555,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 535, "x": 535, "y0": 0, @@ -5563,7 +5563,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 536, "x": 536, "y0": 0, @@ -5571,7 +5571,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 537, "x": 537, "y0": 0, @@ -5579,7 +5579,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 538, "x": 538, "y0": 0, @@ -5587,7 +5587,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 539, "x": 539, "y0": 0, @@ -5595,7 +5595,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 540, "x": 540, "y0": 0, @@ -5603,7 +5603,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 541, "x": 541, "y0": 0, @@ -5611,7 +5611,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 542, "x": 542, "y0": 0, @@ -5619,7 +5619,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 543, "x": 543, "y0": 0, @@ -5627,7 +5627,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 544, "x": 544, "y0": 0, @@ -5635,7 +5635,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 545, "x": 545, "y0": 0, @@ -5643,7 +5643,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 546, "x": 546, "y0": 0, @@ -5651,7 +5651,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 547, "x": 547, "y0": 0, @@ -5659,7 +5659,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 548, "x": 548, "y0": 0, @@ -5667,7 +5667,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 549, "x": 549, "y0": 0, @@ -5675,7 +5675,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 550, "x": 550, "y0": 0, @@ -5683,7 +5683,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 551, "x": 551, "y0": 0, @@ -5691,7 +5691,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 552, "x": 552, "y0": 0, @@ -5699,7 +5699,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 553, "x": 553, "y0": 0, @@ -5707,7 +5707,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 554, "x": 554, "y0": 0, @@ -5715,7 +5715,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 555, "x": 555, "y0": 0, @@ -5723,7 +5723,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 556, "x": 556, "y0": 0, @@ -5731,7 +5731,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 557, "x": 557, "y0": 0, @@ -5739,7 +5739,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 558, "x": 558, "y0": 0, @@ -5747,7 +5747,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 559, "x": 559, "y0": 0, @@ -5755,7 +5755,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 560, "x": 560, "y0": 0, @@ -5763,7 +5763,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 561, "x": 561, "y0": 0, @@ -5771,7 +5771,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 562, "x": 562, "y0": 0, @@ -5779,7 +5779,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 563, "x": 563, "y0": 0, @@ -5787,7 +5787,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 564, "x": 564, "y0": 0, @@ -5795,7 +5795,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 565, "x": 565, "y0": 0, @@ -5803,7 +5803,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 566, "x": 566, "y0": 0, @@ -5811,7 +5811,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 567, "x": 567, "y0": 0, @@ -5819,7 +5819,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 568, "x": 568, "y0": 0, @@ -5827,7 +5827,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 569, "x": 569, "y0": 0, @@ -5835,7 +5835,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 570, "x": 570, "y0": 0, @@ -5843,7 +5843,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 571, "x": 571, "y0": 0, @@ -5851,7 +5851,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 572, "x": 572, "y0": 0, @@ -5859,7 +5859,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 573, "x": 573, "y0": 0, @@ -5867,7 +5867,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 574, "x": 574, "y0": 0, @@ -5875,7 +5875,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 575, "x": 575, "y0": 0, @@ -5883,7 +5883,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 576, "x": 576, "y0": 0, @@ -5891,7 +5891,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 577, "x": 577, "y0": 0, @@ -5899,7 +5899,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 578, "x": 578, "y0": 0, @@ -5907,7 +5907,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 579, "x": 579, "y0": 0, @@ -5915,7 +5915,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 580, "x": 580, "y0": 0, @@ -5923,7 +5923,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 581, "x": 581, "y0": 0, @@ -5931,7 +5931,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 582, "x": 582, "y0": 0, @@ -5939,7 +5939,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 583, "x": 583, "y0": 0, @@ -5947,7 +5947,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 584, "x": 584, "y0": 0, @@ -5955,7 +5955,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 585, "x": 585, "y0": 0, @@ -5963,7 +5963,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 586, "x": 586, "y0": 0, @@ -5971,7 +5971,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 587, "x": 587, "y0": 0, @@ -5979,7 +5979,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 588, "x": 588, "y0": 0, @@ -5987,7 +5987,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 589, "x": 589, "y0": 0, @@ -5995,7 +5995,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 590, "x": 590, "y0": 0, @@ -6003,7 +6003,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 591, "x": 591, "y0": 0, @@ -6011,7 +6011,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 592, "x": 592, "y0": 0, @@ -6019,7 +6019,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 593, "x": 593, "y0": 0, @@ -6027,7 +6027,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 594, "x": 594, "y0": 0, @@ -6035,7 +6035,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 595, "x": 595, "y0": 0, @@ -6043,7 +6043,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 596, "x": 596, "y0": 0, @@ -6051,7 +6051,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 597, "x": 597, "y0": 0, @@ -6059,7 +6059,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 598, "x": 598, "y0": 0, @@ -6067,7 +6067,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 599, "x": 599, "y0": 0, @@ -6075,7 +6075,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 600, "x": 600, "y0": 0, @@ -6083,7 +6083,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 601, "x": 601, "y0": 0, @@ -6091,7 +6091,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 602, "x": 602, "y0": 0, @@ -6099,7 +6099,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 603, "x": 603, "y0": 0, @@ -6107,7 +6107,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 604, "x": 604, "y0": 0, @@ -6115,7 +6115,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 605, "x": 605, "y0": 0, @@ -6123,7 +6123,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 606, "x": 606, "y0": 0, @@ -6131,7 +6131,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 607, "x": 607, "y0": 0, @@ -6139,7 +6139,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 608, "x": 608, "y0": 0, @@ -6147,7 +6147,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 609, "x": 609, "y0": 0, @@ -6155,7 +6155,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 610, "x": 610, "y0": 0, @@ -6163,7 +6163,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 611, "x": 611, "y0": 0, @@ -6171,7 +6171,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 612, "x": 612, "y0": 0, @@ -6179,7 +6179,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 613, "x": 613, "y0": 0, @@ -6187,7 +6187,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 614, "x": 614, "y0": 0, @@ -6195,7 +6195,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 615, "x": 615, "y0": 0, @@ -6203,7 +6203,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 616, "x": 616, "y0": 0, @@ -6211,7 +6211,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 617, "x": 617, "y0": 0, @@ -6219,7 +6219,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 618, "x": 618, "y0": 0, @@ -6227,7 +6227,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 619, "x": 619, "y0": 0, @@ -6235,7 +6235,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 620, "x": 620, "y0": 0, @@ -6243,7 +6243,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 621, "x": 621, "y0": 0, @@ -6251,7 +6251,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 622, "x": 622, "y0": 0, @@ -6259,7 +6259,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 623, "x": 623, "y0": 0, @@ -6267,7 +6267,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 624, "x": 624, "y0": 0, @@ -6275,7 +6275,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 625, "x": 625, "y0": 0, @@ -6283,7 +6283,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 626, "x": 626, "y0": 0, @@ -6291,7 +6291,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 627, "x": 627, "y0": 0, @@ -6299,7 +6299,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 628, "x": 628, "y0": 0, @@ -6307,7 +6307,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 629, "x": 629, "y0": 0, @@ -6315,7 +6315,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 630, "x": 630, "y0": 0, @@ -6323,7 +6323,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 631, "x": 631, "y0": 0, @@ -6331,7 +6331,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 632, "x": 632, "y0": 0, @@ -6339,7 +6339,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 633, "x": 633, "y0": 0, @@ -6347,7 +6347,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 634, "x": 634, "y0": 0, @@ -6355,7 +6355,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 635, "x": 635, "y0": 0, @@ -6363,7 +6363,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 636, "x": 636, "y0": 0, @@ -6371,7 +6371,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 637, "x": 637, "y0": 0, @@ -6379,7 +6379,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 638, "x": 638, "y0": 0, @@ -6387,7 +6387,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 639, "x": 639, "y0": 0, @@ -6395,7 +6395,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 640, "x": 640, "y0": 0, @@ -6403,7 +6403,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 641, "x": 641, "y0": 0, @@ -6411,7 +6411,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 642, "x": 642, "y0": 0, @@ -6419,7 +6419,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 643, "x": 643, "y0": 0, @@ -6427,7 +6427,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 644, "x": 644, "y0": 0, @@ -6435,7 +6435,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 645, "x": 645, "y0": 0, @@ -6443,7 +6443,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 646, "x": 646, "y0": 0, @@ -6451,7 +6451,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 647, "x": 647, "y0": 0, @@ -6459,7 +6459,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 648, "x": 648, "y0": 0, @@ -6467,7 +6467,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 649, "x": 649, "y0": 0, @@ -6475,7 +6475,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 650, "x": 650, "y0": 0, @@ -6483,7 +6483,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 651, "x": 651, "y0": 0, @@ -6491,7 +6491,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 652, "x": 652, "y0": 0, @@ -6499,7 +6499,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 653, "x": 653, "y0": 0, @@ -6507,7 +6507,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 654, "x": 654, "y0": 0, @@ -6515,7 +6515,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 655, "x": 655, "y0": 0, @@ -6523,7 +6523,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 656, "x": 656, "y0": 0, @@ -6531,7 +6531,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 657, "x": 657, "y0": 0, @@ -6539,7 +6539,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 658, "x": 658, "y0": 0, @@ -6547,7 +6547,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 659, "x": 659, "y0": 0, @@ -6555,7 +6555,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 660, "x": 660, "y0": 0, @@ -6563,7 +6563,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 661, "x": 661, "y0": 0, @@ -6571,7 +6571,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 662, "x": 662, "y0": 0, @@ -6579,7 +6579,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 663, "x": 663, "y0": 0, @@ -6587,7 +6587,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 664, "x": 664, "y0": 0, @@ -6595,7 +6595,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 665, "x": 665, "y0": 0, @@ -6603,7 +6603,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 666, "x": 666, "y0": 0, @@ -6611,7 +6611,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 667, "x": 667, "y0": 0, @@ -6619,7 +6619,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 668, "x": 668, "y0": 0, @@ -6627,7 +6627,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 669, "x": 669, "y0": 0, @@ -6635,7 +6635,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 670, "x": 670, "y0": 0, @@ -6643,7 +6643,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 671, "x": 671, "y0": 0, @@ -6651,7 +6651,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 672, "x": 672, "y0": 0, @@ -6659,7 +6659,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 673, "x": 673, "y0": 0, @@ -6667,7 +6667,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 674, "x": 674, "y0": 0, @@ -6675,7 +6675,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 675, "x": 675, "y0": 0, @@ -6683,7 +6683,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 676, "x": 676, "y0": 0, @@ -6691,7 +6691,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 677, "x": 677, "y0": 0, @@ -6699,7 +6699,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 678, "x": 678, "y0": 0, @@ -6707,7 +6707,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 679, "x": 679, "y0": 0, @@ -6715,7 +6715,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 680, "x": 680, "y0": 0, @@ -6723,7 +6723,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 681, "x": 681, "y0": 0, @@ -6731,7 +6731,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 682, "x": 682, "y0": 0, @@ -6739,7 +6739,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 683, "x": 683, "y0": 0, @@ -6747,7 +6747,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 684, "x": 684, "y0": 0, @@ -6755,7 +6755,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 685, "x": 685, "y0": 0, @@ -6763,7 +6763,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 686, "x": 686, "y0": 0, @@ -6771,7 +6771,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 687, "x": 687, "y0": 0, @@ -6779,7 +6779,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 688, "x": 688, "y0": 0, @@ -6787,7 +6787,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 689, "x": 689, "y0": 0, @@ -6795,7 +6795,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 690, "x": 690, "y0": 0, @@ -6803,7 +6803,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 691, "x": 691, "y0": 0, @@ -6811,7 +6811,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 692, "x": 692, "y0": 0, @@ -6819,7 +6819,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 693, "x": 693, "y0": 0, @@ -6827,7 +6827,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 694, "x": 694, "y0": 0, @@ -6835,7 +6835,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 695, "x": 695, "y0": 0, @@ -6843,7 +6843,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 696, "x": 696, "y0": 0, @@ -6851,7 +6851,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 697, "x": 697, "y0": 0, @@ -6859,7 +6859,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 698, "x": 698, "y0": 0, @@ -6867,7 +6867,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 699, "x": 699, "y0": 0, @@ -6875,7 +6875,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 700, "x": 700, "y0": 0, @@ -6883,7 +6883,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 701, "x": 701, "y0": 0, @@ -6891,7 +6891,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 702, "x": 702, "y0": 0, @@ -6899,7 +6899,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 703, "x": 703, "y0": 0, @@ -6907,7 +6907,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 704, "x": 704, "y0": 0, @@ -6915,7 +6915,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 705, "x": 705, "y0": 0, @@ -6923,7 +6923,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 706, "x": 706, "y0": 0, @@ -6931,7 +6931,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 707, "x": 707, "y0": 0, @@ -6939,7 +6939,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 708, "x": 708, "y0": 0, @@ -6947,7 +6947,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 709, "x": 709, "y0": 0, @@ -6955,7 +6955,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 710, "x": 710, "y0": 0, @@ -6963,7 +6963,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 711, "x": 711, "y0": 0, @@ -6971,7 +6971,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 712, "x": 712, "y0": 0, @@ -6979,7 +6979,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 713, "x": 713, "y0": 0, @@ -6987,7 +6987,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 714, "x": 714, "y0": 0, @@ -6995,7 +6995,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 715, "x": 715, "y0": 0, @@ -7003,7 +7003,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 716, "x": 716, "y0": 0, @@ -7011,7 +7011,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 717, "x": 717, "y0": 0, @@ -7019,7 +7019,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 718, "x": 718, "y0": 0, @@ -7027,7 +7027,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 719, "x": 719, "y0": 0, @@ -7035,7 +7035,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 720, "x": 720, "y0": 0, @@ -7043,7 +7043,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 721, "x": 721, "y0": 0, @@ -7051,7 +7051,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 722, "x": 722, "y0": 0, @@ -7059,7 +7059,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 723, "x": 723, "y0": 0, @@ -7067,7 +7067,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 724, "x": 724, "y0": 0, @@ -7075,7 +7075,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 725, "x": 725, "y0": 0, @@ -7083,7 +7083,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 726, "x": 726, "y0": 0, @@ -7091,7 +7091,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 727, "x": 727, "y0": 0, @@ -7099,7 +7099,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 728, "x": 728, "y0": 0, @@ -7107,7 +7107,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 729, "x": 729, "y0": 0, @@ -7115,7 +7115,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 730, "x": 730, "y0": 0, @@ -7123,7 +7123,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 731, "x": 731, "y0": 0, @@ -7131,7 +7131,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 732, "x": 732, "y0": 0, @@ -7139,7 +7139,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 733, "x": 733, "y0": 0, @@ -7147,7 +7147,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 734, "x": 734, "y0": 0, @@ -7155,7 +7155,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 735, "x": 735, "y0": 0, @@ -7163,7 +7163,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 736, "x": 736, "y0": 0, @@ -7171,7 +7171,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 737, "x": 737, "y0": 0, @@ -7179,7 +7179,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 738, "x": 738, "y0": 0, @@ -7187,7 +7187,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 739, "x": 739, "y0": 0, @@ -7195,7 +7195,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 740, "x": 740, "y0": 0, @@ -7203,7 +7203,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 741, "x": 741, "y0": 0, @@ -7211,7 +7211,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 742, "x": 742, "y0": 0, @@ -7219,7 +7219,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 743, "x": 743, "y0": 0, @@ -7227,7 +7227,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 744, "x": 744, "y0": 0, @@ -7235,7 +7235,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 745, "x": 745, "y0": 0, @@ -7243,7 +7243,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 746, "x": 746, "y0": 0, @@ -7251,7 +7251,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 747, "x": 747, "y0": 0, @@ -7259,7 +7259,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 748, "x": 748, "y0": 0, @@ -7267,7 +7267,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 749, "x": 749, "y0": 0, @@ -7275,7 +7275,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 750, "x": 750, "y0": 0, @@ -7283,7 +7283,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 751, "x": 751, "y0": 0, @@ -7291,7 +7291,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 752, "x": 752, "y0": 0, @@ -7299,7 +7299,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 753, "x": 753, "y0": 0, @@ -7307,7 +7307,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 754, "x": 754, "y0": 0, @@ -7315,7 +7315,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 755, "x": 755, "y0": 0, @@ -7323,7 +7323,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 756, "x": 756, "y0": 0, @@ -7331,7 +7331,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 757, "x": 757, "y0": 0, @@ -7339,7 +7339,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 758, "x": 758, "y0": 0, @@ -7347,7 +7347,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 759, "x": 759, "y0": 0, @@ -7355,7 +7355,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 760, "x": 760, "y0": 0, @@ -7363,7 +7363,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 761, "x": 761, "y0": 0, @@ -7371,7 +7371,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 762, "x": 762, "y0": 0, @@ -7379,7 +7379,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 763, "x": 763, "y0": 0, @@ -7387,7 +7387,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 764, "x": 764, "y0": 0, @@ -7395,7 +7395,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 765, "x": 765, "y0": 0, @@ -7403,7 +7403,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 766, "x": 766, "y0": 0, @@ -7411,7 +7411,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 767, "x": 767, "y0": 0, @@ -7419,7 +7419,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 768, "x": 768, "y0": 0, @@ -7427,7 +7427,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 769, "x": 769, "y0": 0, @@ -7435,7 +7435,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 770, "x": 770, "y0": 0, @@ -7443,7 +7443,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 771, "x": 771, "y0": 0, @@ -7451,7 +7451,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 772, "x": 772, "y0": 0, @@ -7459,7 +7459,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 773, "x": 773, "y0": 0, @@ -7467,7 +7467,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 774, "x": 774, "y0": 0, @@ -7475,7 +7475,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 775, "x": 775, "y0": 0, @@ -7483,7 +7483,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 776, "x": 776, "y0": 0, @@ -7491,7 +7491,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 777, "x": 777, "y0": 0, @@ -7499,7 +7499,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 778, "x": 778, "y0": 0, @@ -7507,7 +7507,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 779, "x": 779, "y0": 0, @@ -7515,7 +7515,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 780, "x": 780, "y0": 0, @@ -7523,7 +7523,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 781, "x": 781, "y0": 0, @@ -7531,7 +7531,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 782, "x": 782, "y0": 0, @@ -7539,7 +7539,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 783, "x": 783, "y0": 0, @@ -7547,7 +7547,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 784, "x": 784, "y0": 0, @@ -7555,7 +7555,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 785, "x": 785, "y0": 0, @@ -7563,7 +7563,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 786, "x": 786, "y0": 0, @@ -7571,7 +7571,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 787, "x": 787, "y0": 0, @@ -7579,7 +7579,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 788, "x": 788, "y0": 0, @@ -7587,7 +7587,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 789, "x": 789, "y0": 0, @@ -7595,7 +7595,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 790, "x": 790, "y0": 0, @@ -7603,7 +7603,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 791, "x": 791, "y0": 0, @@ -7611,7 +7611,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 792, "x": 792, "y0": 0, @@ -7619,7 +7619,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 793, "x": 793, "y0": 0, @@ -7627,7 +7627,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 794, "x": 794, "y0": 0, @@ -7635,7 +7635,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 795, "x": 795, "y0": 0, @@ -7643,7 +7643,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 796, "x": 796, "y0": 0, @@ -7651,7 +7651,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 797, "x": 797, "y0": 0, @@ -7659,7 +7659,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 798, "x": 798, "y0": 0, @@ -7667,7 +7667,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 799, "x": 799, "y0": 0, @@ -7675,7 +7675,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 800, "x": 800, "y0": 0, @@ -7683,7 +7683,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 801, "x": 801, "y0": 0, @@ -7691,7 +7691,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 802, "x": 802, "y0": 0, @@ -7699,7 +7699,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 803, "x": 803, "y0": 0, @@ -7707,7 +7707,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 804, "x": 804, "y0": 0, @@ -7715,7 +7715,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 805, "x": 805, "y0": 0, @@ -7723,7 +7723,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 806, "x": 806, "y0": 0, @@ -7731,7 +7731,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 807, "x": 807, "y0": 0, @@ -7739,7 +7739,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 808, "x": 808, "y0": 0, @@ -7747,7 +7747,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 809, "x": 809, "y0": 0, @@ -7755,7 +7755,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 810, "x": 810, "y0": 0, @@ -7763,7 +7763,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 811, "x": 811, "y0": 0, @@ -7771,7 +7771,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 812, "x": 812, "y0": 0, @@ -7779,7 +7779,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 813, "x": 813, "y0": 0, @@ -7787,7 +7787,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 814, "x": 814, "y0": 0, @@ -7795,7 +7795,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 815, "x": 815, "y0": 0, @@ -7803,7 +7803,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 816, "x": 816, "y0": 0, @@ -7811,7 +7811,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 817, "x": 817, "y0": 0, @@ -7819,7 +7819,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 818, "x": 818, "y0": 0, @@ -7827,7 +7827,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 819, "x": 819, "y0": 0, @@ -7835,7 +7835,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 820, "x": 820, "y0": 0, @@ -7843,7 +7843,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 821, "x": 821, "y0": 0, @@ -7851,7 +7851,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 822, "x": 822, "y0": 0, @@ -7859,7 +7859,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 823, "x": 823, "y0": 0, @@ -7867,7 +7867,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 824, "x": 824, "y0": 0, @@ -7875,7 +7875,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 825, "x": 825, "y0": 0, @@ -7883,7 +7883,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 826, "x": 826, "y0": 0, @@ -7891,7 +7891,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 827, "x": 827, "y0": 0, @@ -7899,7 +7899,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 828, "x": 828, "y0": 0, @@ -7907,7 +7907,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 829, "x": 829, "y0": 0, @@ -7915,7 +7915,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 830, "x": 830, "y0": 0, @@ -7923,7 +7923,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 831, "x": 831, "y0": 0, @@ -7931,7 +7931,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 832, "x": 832, "y0": 0, @@ -7939,7 +7939,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 833, "x": 833, "y0": 0, @@ -7947,7 +7947,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 834, "x": 834, "y0": 0, @@ -7955,7 +7955,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 835, "x": 835, "y0": 0, @@ -7963,7 +7963,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 836, "x": 836, "y0": 0, @@ -7971,7 +7971,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 837, "x": 837, "y0": 0, @@ -7979,7 +7979,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 838, "x": 838, "y0": 0, @@ -7987,7 +7987,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 839, "x": 839, "y0": 0, @@ -7995,7 +7995,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 840, "x": 840, "y0": 0, @@ -8003,7 +8003,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 841, "x": 841, "y0": 0, @@ -8011,7 +8011,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 842, "x": 842, "y0": 0, @@ -8019,7 +8019,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 843, "x": 843, "y0": 0, @@ -8027,7 +8027,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 844, "x": 844, "y0": 0, @@ -8035,7 +8035,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 845, "x": 845, "y0": 0, @@ -8043,7 +8043,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 846, "x": 846, "y0": 0, @@ -8051,7 +8051,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 847, "x": 847, "y0": 0, @@ -8059,7 +8059,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 848, "x": 848, "y0": 0, @@ -8067,7 +8067,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 849, "x": 849, "y0": 0, @@ -8075,7 +8075,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 850, "x": 850, "y0": 0, @@ -8083,7 +8083,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 851, "x": 851, "y0": 0, @@ -8091,7 +8091,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 852, "x": 852, "y0": 0, @@ -8099,7 +8099,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 853, "x": 853, "y0": 0, @@ -8107,7 +8107,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 854, "x": 854, "y0": 0, @@ -8115,7 +8115,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 855, "x": 855, "y0": 0, @@ -8123,7 +8123,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 856, "x": 856, "y0": 0, @@ -8131,7 +8131,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 857, "x": 857, "y0": 0, @@ -8139,7 +8139,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 858, "x": 858, "y0": 0, @@ -8147,7 +8147,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 859, "x": 859, "y0": 0, @@ -8155,7 +8155,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 860, "x": 860, "y0": 0, @@ -8163,7 +8163,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 861, "x": 861, "y0": 0, @@ -8171,7 +8171,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 862, "x": 862, "y0": 0, @@ -8179,7 +8179,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 863, "x": 863, "y0": 0, @@ -8187,7 +8187,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 864, "x": 864, "y0": 0, @@ -8195,7 +8195,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 865, "x": 865, "y0": 0, @@ -8203,7 +8203,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 866, "x": 866, "y0": 0, @@ -8211,7 +8211,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 867, "x": 867, "y0": 0, @@ -8219,7 +8219,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 868, "x": 868, "y0": 0, @@ -8227,7 +8227,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 869, "x": 869, "y0": 0, @@ -8235,7 +8235,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 870, "x": 870, "y0": 0, @@ -8243,7 +8243,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 871, "x": 871, "y0": 0, @@ -8251,7 +8251,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 872, "x": 872, "y0": 0, @@ -8259,7 +8259,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 873, "x": 873, "y0": 0, @@ -8267,7 +8267,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 874, "x": 874, "y0": 0, @@ -8275,7 +8275,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 875, "x": 875, "y0": 0, @@ -8283,7 +8283,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 876, "x": 876, "y0": 0, @@ -8291,7 +8291,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 877, "x": 877, "y0": 0, @@ -8299,7 +8299,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 878, "x": 878, "y0": 0, @@ -8307,7 +8307,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 879, "x": 879, "y0": 0, @@ -8315,7 +8315,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 880, "x": 880, "y0": 0, @@ -8323,7 +8323,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 881, "x": 881, "y0": 0, @@ -8331,7 +8331,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 882, "x": 882, "y0": 0, @@ -8339,7 +8339,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 883, "x": 883, "y0": 0, @@ -8347,7 +8347,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 884, "x": 884, "y0": 0, @@ -8355,7 +8355,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 885, "x": 885, "y0": 0, @@ -8363,7 +8363,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 886, "x": 886, "y0": 0, @@ -8371,7 +8371,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 887, "x": 887, "y0": 0, @@ -8379,7 +8379,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 888, "x": 888, "y0": 0, @@ -8387,7 +8387,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 889, "x": 889, "y0": 0, @@ -8395,7 +8395,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 890, "x": 890, "y0": 0, @@ -8403,7 +8403,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 891, "x": 891, "y0": 0, @@ -8411,7 +8411,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 892, "x": 892, "y0": 0, @@ -8419,7 +8419,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 893, "x": 893, "y0": 0, @@ -8427,7 +8427,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 894, "x": 894, "y0": 0, @@ -8435,7 +8435,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 895, "x": 895, "y0": 0, @@ -8443,7 +8443,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 896, "x": 896, "y0": 0, @@ -8451,7 +8451,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 897, "x": 897, "y0": 0, @@ -8459,7 +8459,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 898, "x": 898, "y0": 0, @@ -8467,7 +8467,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 899, "x": 899, "y0": 0, @@ -8475,7 +8475,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 900, "x": 900, "y0": 0, @@ -8483,7 +8483,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 901, "x": 901, "y0": 0, @@ -8491,7 +8491,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 902, "x": 902, "y0": 0, @@ -8499,7 +8499,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 903, "x": 903, "y0": 0, @@ -8507,7 +8507,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 904, "x": 904, "y0": 0, @@ -8515,7 +8515,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 905, "x": 905, "y0": 0, @@ -8523,7 +8523,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 906, "x": 906, "y0": 0, @@ -8531,7 +8531,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 907, "x": 907, "y0": 0, @@ -8539,7 +8539,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 908, "x": 908, "y0": 0, @@ -8547,7 +8547,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 909, "x": 909, "y0": 0, @@ -8555,7 +8555,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 910, "x": 910, "y0": 0, @@ -8563,7 +8563,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 911, "x": 911, "y0": 0, @@ -8571,7 +8571,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 912, "x": 912, "y0": 0, @@ -8579,7 +8579,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 913, "x": 913, "y0": 0, @@ -8587,7 +8587,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 914, "x": 914, "y0": 0, @@ -8595,7 +8595,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 915, "x": 915, "y0": 0, @@ -8603,7 +8603,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 916, "x": 916, "y0": 0, @@ -8611,7 +8611,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 917, "x": 917, "y0": 0, @@ -8619,7 +8619,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 918, "x": 918, "y0": 0, @@ -8627,7 +8627,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 919, "x": 919, "y0": 0, @@ -8635,7 +8635,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 920, "x": 920, "y0": 0, @@ -8643,7 +8643,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 921, "x": 921, "y0": 0, @@ -8651,7 +8651,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 922, "x": 922, "y0": 0, @@ -8659,7 +8659,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 923, "x": 923, "y0": 0, @@ -8667,7 +8667,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 924, "x": 924, "y0": 0, @@ -8675,7 +8675,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 925, "x": 925, "y0": 0, @@ -8683,7 +8683,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 926, "x": 926, "y0": 0, @@ -8691,7 +8691,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 927, "x": 927, "y0": 0, @@ -8699,7 +8699,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 928, "x": 928, "y0": 0, @@ -8707,7 +8707,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 929, "x": 929, "y0": 0, @@ -8715,7 +8715,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 930, "x": 930, "y0": 0, @@ -8723,7 +8723,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 931, "x": 931, "y0": 0, @@ -8731,7 +8731,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 932, "x": 932, "y0": 0, @@ -8739,7 +8739,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 933, "x": 933, "y0": 0, @@ -8747,7 +8747,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 934, "x": 934, "y0": 0, @@ -8755,7 +8755,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 935, "x": 935, "y0": 0, @@ -8763,7 +8763,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 936, "x": 936, "y0": 0, @@ -8771,7 +8771,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 937, "x": 937, "y0": 0, @@ -8779,7 +8779,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 938, "x": 938, "y0": 0, @@ -8787,7 +8787,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 939, "x": 939, "y0": 0, @@ -8795,7 +8795,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 940, "x": 940, "y0": 0, @@ -8803,7 +8803,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 941, "x": 941, "y0": 0, @@ -8811,7 +8811,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 942, "x": 942, "y0": 0, @@ -8819,7 +8819,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 943, "x": 943, "y0": 0, @@ -8827,7 +8827,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 944, "x": 944, "y0": 0, @@ -8835,7 +8835,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 945, "x": 945, "y0": 0, @@ -8843,7 +8843,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 946, "x": 946, "y0": 0, @@ -8851,7 +8851,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 947, "x": 947, "y0": 0, @@ -8859,7 +8859,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 948, "x": 948, "y0": 0, @@ -8867,7 +8867,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 949, "x": 949, "y0": 0, @@ -8875,7 +8875,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 950, "x": 950, "y0": 0, @@ -8883,7 +8883,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 951, "x": 951, "y0": 0, @@ -8891,7 +8891,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 952, "x": 952, "y0": 0, @@ -8899,7 +8899,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 953, "x": 953, "y0": 0, @@ -8907,7 +8907,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 954, "x": 954, "y0": 0, @@ -8915,7 +8915,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 955, "x": 955, "y0": 0, @@ -8923,7 +8923,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 956, "x": 956, "y0": 0, @@ -8931,7 +8931,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 957, "x": 957, "y0": 0, @@ -8939,7 +8939,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 958, "x": 958, "y0": 0, @@ -8947,7 +8947,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 959, "x": 959, "y0": 0, @@ -8955,7 +8955,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 960, "x": 960, "y0": 0, @@ -8963,7 +8963,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 961, "x": 961, "y0": 0, @@ -8971,7 +8971,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 962, "x": 962, "y0": 0, @@ -8979,7 +8979,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 963, "x": 963, "y0": 0, @@ -8987,7 +8987,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 964, "x": 964, "y0": 0, @@ -8995,7 +8995,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 965, "x": 965, "y0": 0, @@ -9003,7 +9003,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 966, "x": 966, "y0": 0, @@ -9011,7 +9011,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 967, "x": 967, "y0": 0, @@ -9019,7 +9019,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 968, "x": 968, "y0": 0, @@ -9027,7 +9027,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 969, "x": 969, "y0": 0, @@ -9035,7 +9035,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 970, "x": 970, "y0": 0, @@ -9043,7 +9043,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 971, "x": 971, "y0": 0, @@ -9051,7 +9051,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 972, "x": 972, "y0": 0, @@ -9059,7 +9059,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 973, "x": 973, "y0": 0, @@ -9067,7 +9067,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 974, "x": 974, "y0": 0, @@ -9075,7 +9075,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 975, "x": 975, "y0": 0, @@ -9083,7 +9083,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 976, "x": 976, "y0": 0, @@ -9091,7 +9091,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 977, "x": 977, "y0": 0, @@ -9099,7 +9099,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 978, "x": 978, "y0": 0, @@ -9107,7 +9107,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 979, "x": 979, "y0": 0, @@ -9115,7 +9115,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 980, "x": 980, "y0": 0, @@ -9123,7 +9123,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 981, "x": 981, "y0": 0, @@ -9131,7 +9131,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 982, "x": 982, "y0": 0, @@ -9139,7 +9139,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 983, "x": 983, "y0": 0, @@ -9147,7 +9147,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 984, "x": 984, "y0": 0, @@ -9155,7 +9155,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 985, "x": 985, "y0": 0, @@ -9163,7 +9163,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 986, "x": 986, "y0": 0, @@ -9171,7 +9171,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 987, "x": 987, "y0": 0, @@ -9179,7 +9179,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 988, "x": 988, "y0": 0, @@ -9187,7 +9187,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 989, "x": 989, "y0": 0, @@ -9195,7 +9195,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 990, "x": 990, "y0": 0, @@ -9203,7 +9203,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 991, "x": 991, "y0": 0, @@ -9211,7 +9211,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 992, "x": 992, "y0": 0, @@ -9219,7 +9219,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 993, "x": 993, "y0": 0, @@ -9227,7 +9227,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 994, "x": 994, "y0": 0, @@ -9235,7 +9235,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 995, "x": 995, "y0": 0, @@ -9243,7 +9243,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 996, "x": 996, "y0": 0, @@ -9251,7 +9251,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 997, "x": 997, "y0": 0, @@ -9259,7 +9259,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 998, "x": 998, "y0": 0, @@ -9267,7 +9267,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 999, "x": 999, "y0": 0, @@ -17298,7 +17298,7 @@ Array [ "data": Array [ Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 1, "x": 1, "y0": 0, @@ -17306,7 +17306,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 2, "x": 2, "y0": 0, @@ -17314,7 +17314,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 3, "x": 3, "y0": 0, @@ -17322,7 +17322,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 4, "x": 4, "y0": 0, @@ -17461,32 +17461,40 @@ Array [ ] `; -exports[`Series Can stack simple dataseries 1`] = ` +exports[`Series Can stack multiple dataseries with scale to extent 1`] = ` Array [ Object { "data": Array [ Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 1, "x": 1, - "y0": 0, + "y0": 1, "y1": 1, }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 2, "x": 2, - "y0": 0, + "y0": 2, "y1": 2, }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, + "initialY1": 3, + "x": 3, + "y0": 3, + "y1": 3, + }, + Object { + "datum": undefined, + "initialY0": null, "initialY1": 4, "x": 4, - "y0": 0, + "y0": 4, "y1": 4, }, ], @@ -17501,7 +17509,231 @@ Array [ Object { "datum": undefined, "initialY0": null, - "initialY1": 21, + "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 simple 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": 2, + "x": 2, + "y0": 0, + "y1": 2, + }, + Object { + "datum": undefined, + "initialY0": null, + "initialY1": 4, + "x": 4, + "y0": 0, + "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 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, @@ -17524,13 +17756,171 @@ Array [ ] `; +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": 0, + "initialY0": null, "initialY1": 1, "x": 1, "y0": 0, @@ -17538,7 +17928,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 4, "x": 4, "y0": 0, @@ -17546,7 +17936,7 @@ Array [ }, Object { "datum": undefined, - "initialY0": 0, + "initialY0": null, "initialY1": 2, "x": 2, "y0": 0, @@ -17605,7 +17995,7 @@ Array [ "y1": 1, "y2": 3, }, - "initialY0": 0, + "initialY0": null, "initialY1": 1, "x": 0, "y0": 0, @@ -17617,7 +18007,7 @@ Array [ "y1": 2, "y2": 7, }, - "initialY0": 0, + "initialY0": null, "initialY1": 2, "x": 1, "y0": 0, @@ -17629,7 +18019,7 @@ Array [ "y1": 1, "y2": 2, }, - "initialY0": 0, + "initialY0": null, "initialY1": 1, "x": 2, "y0": 0, @@ -17641,7 +18031,7 @@ Array [ "y1": 6, "y2": 10, }, - "initialY0": 0, + "initialY0": null, "initialY1": 6, "x": 3, "y0": 0, diff --git a/src/lib/series/rendering.ts b/src/lib/series/rendering.ts index 242b70bdda..4832a8da8f 100644 --- a/src/lib/series/rendering.ts +++ b/src/lib/series/rendering.ts @@ -165,7 +165,9 @@ export function renderBars( const barGeometries: BarGeometry[] = []; dataset.forEach((datum) => { const { y0, y1, initialY1 } = datum; - + if (initialY1 === null) { + return; + } if (xScaleType === ScaleType.Ordinal && !xDomain.includes(datum.x)) { return; } diff --git a/src/lib/series/series.test.ts b/src/lib/series/series.test.ts index cc9d805cd5..f9444f37b4 100644 --- a/src/lib/series/series.test.ts +++ b/src/lib/series/series.test.ts @@ -170,6 +170,129 @@ describe('Series', () => { 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 = { diff --git a/src/lib/series/series.ts b/src/lib/series/series.ts index a9b17d78c3..727b2a7614 100644 --- a/src/lib/series/series.ts +++ b/src/lib/series/series.ts @@ -4,6 +4,7 @@ import { Accessor } from '../utils/accessor'; import { GroupId, SpecId } from '../utils/ids'; import { splitSpecsByGroupId, YBasicSeriesSpec } from './domains/y_domain'; import { BasicSeriesSpec, Datum, SeriesAccessors } from './specs'; +import { computeYStackedMapValues, getYValueStackMap } from './stacked_series_utils'; export interface RawDataSeriesDatum { /** the x value */ @@ -343,32 +344,9 @@ 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); - if (datum.y1 !== null) { - stack[index] = datum.y1; - 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 yValueStackMap: Map = getYValueStackMap(dataseries); + + const stackedValues = computeYStackedMapValues(yValueStackMap, scaleToExtent); const stackedDataSeries: DataSeries[] = dataseries.map((ds, seriesIndex) => { const newData: DataSeriesDatum[] = []; @@ -383,13 +361,14 @@ export function formatStackedDataSeriesValues( } 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: computedY0, + initialY0, datum, }); } else { @@ -399,13 +378,18 @@ export function formatStackedDataSeriesValues( } const stackY = stack[seriesIndex]; const stackedY1 = y1 !== null ? stackY + y1 : null; - const stackedY0 = data.y0 == null ? stackY : stackY + data.y0; + 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: data.y0 || null, + initialY0: data.y0 === undefined ? null : data.y0, datum, }); } diff --git a/src/lib/series/stacked_series_utils.test.ts b/src/lib/series/stacked_series_utils.test.ts new file mode 100644 index 0000000000..af214a8393 --- /dev/null +++ b/src/lib/series/stacked_series_utils.test.ts @@ -0,0 +1,361 @@ +import { getSpecId } from '../utils/ids'; +import { formatStackedDataSeriesValues, RawDataSeries } from './series'; +import { computeYStackedMapValues, 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/src/lib/series/stacked_series_utils.ts b/src/lib/series/stacked_series_utils.ts new file mode 100644 index 0000000000..7eb2a75290 --- /dev/null +++ b/src/lib/series/stacked_series_utils.ts @@ -0,0 +1,48 @@ +import { 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; +} diff --git a/src/state/__snapshots__/utils.test.ts.snap b/src/state/__snapshots__/utils.test.ts.snap index 7af9513fbd..d7312b93b8 100644 --- a/src/state/__snapshots__/utils.test.ts.snap +++ b/src/state/__snapshots__/utils.test.ts.snap @@ -147,7 +147,7 @@ Array [ "x": 0, "y": 1, }, - "initialY0": 0, + "initialY0": null, "initialY1": 1, "x": 0, "y0": 0, @@ -159,7 +159,7 @@ Array [ "x": 1, "y": 2, }, - "initialY0": 0, + "initialY0": null, "initialY1": 2, "x": 1, "y0": 0, @@ -171,7 +171,7 @@ Array [ "x": 2, "y": 3, }, - "initialY0": 0, + "initialY0": null, "initialY1": 3, "x": 2, "y0": 0, @@ -183,7 +183,7 @@ Array [ "x": 3, "y": 4, }, - "initialY0": 0, + "initialY0": null, "initialY1": 4, "x": 3, "y0": 0, diff --git a/stories/bar_chart.tsx b/stories/bar_chart.tsx index eff5d82495..a1bf8e9571 100644 --- a/stories/bar_chart.tsx +++ b/stories/bar_chart.tsx @@ -1073,4 +1073,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)} + /> + + + ); }); From 8e0bfe7b0e396bb632777b685c2ed4ce57efec4b Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 10 Apr 2019 22:43:34 +0200 Subject: [PATCH 09/11] refactor: add comments and remove unnecessary type --- src/lib/series/rendering.ts | 2 ++ src/lib/series/series.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib/series/rendering.ts b/src/lib/series/rendering.ts index 4832a8da8f..033368376b 100644 --- a/src/lib/series/rendering.ts +++ b/src/lib/series/rendering.ts @@ -165,9 +165,11 @@ export function renderBars( const barGeometries: BarGeometry[] = []; dataset.forEach((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; } diff --git a/src/lib/series/series.ts b/src/lib/series/series.ts index 727b2a7614..06766def85 100644 --- a/src/lib/series/series.ts +++ b/src/lib/series/series.ts @@ -344,7 +344,7 @@ export function formatStackedDataSeriesValues( dataseries: RawDataSeries[], scaleToExtent: boolean, ): DataSeries[] { - const yValueStackMap: Map = getYValueStackMap(dataseries); + const yValueStackMap = getYValueStackMap(dataseries); const stackedValues = computeYStackedMapValues(yValueStackMap, scaleToExtent); From bdd54ac90bd74935a52a535f001a2fb9cb69fa1d Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 11 Apr 2019 00:17:00 +0200 Subject: [PATCH 10/11] test: increase coverage for series and rendering bands --- .../series/__snapshots__/series.test.ts.snap | 1 - .../series/nonstacked_series_utils.test.ts | 343 +++++++++++++++ src/lib/series/nonstacked_series_utils.ts | 54 +++ src/lib/series/rendering.areas.test.ts | 21 +- src/lib/series/rendering.bands.test.ts | 403 ++++++++++++++++++ src/lib/series/rendering.bars.test.ts | 2 +- src/lib/series/rendering.lines.test.ts | 11 +- src/lib/series/rendering.ts | 4 + src/lib/series/series.test.ts | 2 +- src/lib/series/series.ts | 121 +----- src/lib/series/stacked_series_utils.test.ts | 8 +- src/lib/series/stacked_series_utils.ts | 67 ++- src/state/__snapshots__/utils.test.ts.snap | 36 +- stories/area_chart.tsx | 32 ++ stories/bar_chart.tsx | 63 ++- 15 files changed, 993 insertions(+), 175 deletions(-) create mode 100644 src/lib/series/nonstacked_series_utils.test.ts create mode 100644 src/lib/series/nonstacked_series_utils.ts create mode 100644 src/lib/series/rendering.bands.test.ts diff --git a/src/lib/series/__snapshots__/series.test.ts.snap b/src/lib/series/__snapshots__/series.test.ts.snap index f4719d2e7c..fa861ab914 100644 --- a/src/lib/series/__snapshots__/series.test.ts.snap +++ b/src/lib/series/__snapshots__/series.test.ts.snap @@ -17983,7 +17983,6 @@ Array [ "counts": Object { "areaSeries": 0, "barSeries": 0, - "basicSeries": 0, "lineSeries": 2, }, "dataSeries": Array [ diff --git a/src/lib/series/nonstacked_series_utils.test.ts b/src/lib/series/nonstacked_series_utils.test.ts new file mode 100644 index 0000000000..eac49aac9a --- /dev/null +++ b/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/src/lib/series/nonstacked_series_utils.ts b/src/lib/series/nonstacked_series_utils.ts new file mode 100644 index 0000000000..949db4d826 --- /dev/null +++ b/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/src/lib/series/rendering.areas.test.ts b/src/lib/series/rendering.areas.test.ts index 70138226a5..3c996fa481 100644 --- a/src/lib/series/rendering.areas.test.ts +++ b/src/lib/series/rendering.areas.test.ts @@ -2,13 +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, - isPointGeometry, - PointGeometry, - 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'); @@ -847,17 +841,10 @@ 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); + // all the points expect null geometries + expect(indexedGeometries.size).toEqual(8); const nullIndexdGeometry = indexedGeometries.get(2)!; - - expect(nullIndexdGeometry).toBeDefined(); - expect(nullIndexdGeometry.length).toBe(1); - expect(isPointGeometry(nullIndexdGeometry[0])).toBe(true); - // moved to the bottom of the chart - expect(nullIndexdGeometry[0].y).toBe(100); - // 0 radius point - expect((nullIndexdGeometry[0] as PointGeometry).radius).toBe(0); + expect(nullIndexdGeometry).toBeUndefined(); const zeroValueIndexdGeometry = indexedGeometries.get(5)!; expect(zeroValueIndexdGeometry).toBeDefined(); diff --git a/src/lib/series/rendering.bands.test.ts b/src/lib/series/rendering.bands.test.ts new file mode 100644 index 0000000000..2752101322 --- /dev/null +++ b/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/src/lib/series/rendering.bars.test.ts b/src/lib/series/rendering.bars.test.ts index 7614ecc9d6..ada7063f0f 100644 --- a/src/lib/series/rendering.bars.test.ts +++ b/src/lib/series/rendering.bars.test.ts @@ -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, diff --git a/src/lib/series/rendering.lines.test.ts b/src/lib/series/rendering.lines.test.ts index bdda5cbaec..30a5b69c88 100644 --- a/src/lib/series/rendering.lines.test.ts +++ b/src/lib/series/rendering.lines.test.ts @@ -829,15 +829,10 @@ 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); + // all the points expect null geometries + expect(indexedGeometries.size).toEqual(8); const nullIndexdGeometry = indexedGeometries.get(2)!; - expect(nullIndexdGeometry).toBeDefined(); - expect(nullIndexdGeometry.length).toBe(1); - // moved to the bottom of the chart - expect(nullIndexdGeometry[0].y).toBe(100); - // 0 radius point - expect((nullIndexdGeometry[0] as PointGeometry).radius).toBe(0); + expect(nullIndexdGeometry).toBeUndefined(); const zeroValueIndexdGeometry = indexedGeometries.get(5)!; expect(zeroValueIndexdGeometry).toBeDefined(); diff --git a/src/lib/series/rendering.ts b/src/lib/series/rendering.ts index 033368376b..ebe78c4571 100644 --- a/src/lib/series/rendering.ts +++ b/src/lib/series/rendering.ts @@ -102,6 +102,10 @@ export function renderPoints( yDatums.unshift(datum.y0); } 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); diff --git a/src/lib/series/series.test.ts b/src/lib/series/series.test.ts index f9444f37b4..884cd3db3f 100644 --- a/src/lib/series/series.test.ts +++ b/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', () => { diff --git a/src/lib/series/series.ts b/src/lib/series/series.ts index 06766def85..720df2f573 100644 --- a/src/lib/series/series.ts +++ b/src/lib/series/series.ts @@ -3,8 +3,9 @@ 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 { computeYStackedMapValues, getYValueStackMap } from './stacked_series_utils'; +import { formatStackedDataSeriesValues } from './stacked_series_utils'; export interface RawDataSeriesDatum { /** the x value */ @@ -54,7 +55,6 @@ export interface DataSeriesCounts { barSeries: number; lineSeries: number; areaSeries: number; - basicSeries: number; } export interface DataSeriesColorsValues { @@ -259,7 +259,6 @@ export function getRawDataSeries( barSeries: 0, lineSeries: 0, areaSeries: 0, - basicSeries: 0, }; const seriesSpecsCount = seriesSpecs.length; let i; @@ -277,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) { @@ -292,119 +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 data = dataSeries.data[i]; - const { x, y1, datum } = data; - let y0: number | null; - if (scaleToExtent) { - y0 = data.y0 ? data.y0 : y1; - } else { - y0 = data.y0 ? data.y0 : 0; - } - const formattedValue: DataSeriesDatum = { - x, - y1, - y0, - initialY1: y1, - initialY0: y0, - datum, - }; - formattedValues.data.push(formattedValue); - } - return formattedValues; -} - -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: data.y0 === undefined ? null : data.y0, - datum, - }); - } - }); - return { - specId: ds.specId, - key: ds.key, - seriesColorKey: ds.seriesColorKey, - data: newData, - }; - }); - - return stackedDataSeries; -} - export function getSplittedSeries( seriesSpecs: Map, deselectedDataSeries?: DataSeriesColorsValues[] | null, diff --git a/src/lib/series/stacked_series_utils.test.ts b/src/lib/series/stacked_series_utils.test.ts index af214a8393..7366c9aa3d 100644 --- a/src/lib/series/stacked_series_utils.test.ts +++ b/src/lib/series/stacked_series_utils.test.ts @@ -1,6 +1,10 @@ import { getSpecId } from '../utils/ids'; -import { formatStackedDataSeriesValues, RawDataSeries } from './series'; -import { computeYStackedMapValues, getYValueStackMap } from './stacked_series_utils'; +import { RawDataSeries } from './series'; +import { + computeYStackedMapValues, + formatStackedDataSeriesValues, + getYValueStackMap, +} from './stacked_series_utils'; describe('Stacked Series Utils', () => { const EMPTY_DATA_SET: RawDataSeries[] = [ diff --git a/src/lib/series/stacked_series_utils.ts b/src/lib/series/stacked_series_utils.ts index 7eb2a75290..8900cb2b88 100644 --- a/src/lib/series/stacked_series_utils.ts +++ b/src/lib/series/stacked_series_utils.ts @@ -1,4 +1,4 @@ -import { RawDataSeries } from './series'; +import { DataSeries, DataSeriesDatum, RawDataSeries } from './series'; /** * Map each y value from a RawDataSeries on it's specific x value into, @@ -46,3 +46,68 @@ export function computeYStackedMapValues( }); 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/src/state/__snapshots__/utils.test.ts.snap b/src/state/__snapshots__/utils.test.ts.snap index d7312b93b8..dbeb3298fe 100644 --- a/src/state/__snapshots__/utils.test.ts.snap +++ b/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,7 +16,7 @@ Array [ "x": 0, "y": 1, }, - "initialY0": 0, + "initialY0": null, "initialY1": 1, "x": 0, "y0": 0, @@ -28,7 +27,7 @@ Array [ "x": 1, "y": 2, }, - "initialY0": 0, + "initialY0": null, "initialY1": 2, "x": 1, "y0": 0, @@ -39,7 +38,7 @@ Array [ "x": 2, "y": 10, }, - "initialY0": 0, + "initialY0": null, "initialY1": 10, "x": 2, "y0": 0, @@ -50,7 +49,7 @@ Array [ "x": 3, "y": 6, }, - "initialY0": 0, + "initialY0": null, "initialY1": 6, "x": 3, "y0": 0, @@ -68,7 +67,6 @@ Array [ "counts": Object { "areaSeries": 0, "barSeries": 0, - "basicSeries": 0, "lineSeries": 1, }, "dataSeries": Array [ @@ -79,7 +77,7 @@ Array [ "x": 0, "y": 1, }, - "initialY0": 0, + "initialY0": null, "initialY1": 1, "x": 0, "y0": 0, @@ -90,7 +88,7 @@ Array [ "x": 1, "y": 2, }, - "initialY0": 0, + "initialY0": null, "initialY1": 2, "x": 1, "y0": 0, @@ -101,7 +99,7 @@ Array [ "x": 2, "y": 10, }, - "initialY0": 0, + "initialY0": null, "initialY1": 10, "x": 2, "y0": 0, @@ -112,7 +110,7 @@ Array [ "x": 3, "y": 6, }, - "initialY0": 0, + "initialY0": null, "initialY1": 6, "x": 3, "y0": 0, @@ -135,7 +133,6 @@ Array [ "counts": Object { "areaSeries": 0, "barSeries": 0, - "basicSeries": 0, "lineSeries": 2, }, "dataSeries": Array [ @@ -265,7 +262,6 @@ Array [ "counts": Object { "areaSeries": 0, "barSeries": 0, - "basicSeries": 0, "lineSeries": 2, }, "dataSeries": Array [ @@ -277,7 +273,7 @@ Array [ "x": 0, "y": 1, }, - "initialY0": 0, + "initialY0": null, "initialY1": 1, "x": 0, "y0": 0, @@ -289,7 +285,7 @@ Array [ "x": 1, "y": 2, }, - "initialY0": 0, + "initialY0": null, "initialY1": 2, "x": 1, "y0": 0, @@ -301,7 +297,7 @@ Array [ "x": 2, "y": 3, }, - "initialY0": 0, + "initialY0": null, "initialY1": 3, "x": 2, "y0": 0, @@ -313,7 +309,7 @@ Array [ "x": 3, "y": 4, }, - "initialY0": 0, + "initialY0": null, "initialY1": 4, "x": 3, "y0": 0, @@ -334,7 +330,7 @@ Array [ "x": 0, "y": 2, }, - "initialY0": 0, + "initialY0": null, "initialY1": 2, "x": 0, "y0": 0, @@ -346,7 +342,7 @@ Array [ "x": 1, "y": 3, }, - "initialY0": 0, + "initialY0": null, "initialY1": 3, "x": 1, "y0": 0, @@ -358,7 +354,7 @@ Array [ "x": 2, "y": 4, }, - "initialY0": 0, + "initialY0": null, "initialY1": 4, "x": 2, "y0": 0, @@ -370,7 +366,7 @@ Array [ "x": 3, "y": 5, }, - "initialY0": 0, + "initialY0": null, "initialY1": 5, "x": 3, "y0": 0, diff --git a/stories/area_chart.tsx b/stories/area_chart.tsx index a6b20eee0b..f2c4533d0a 100644 --- a/stories/area_chart.tsx +++ b/stories/area_chart.tsx @@ -91,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 ( diff --git a/stories/bar_chart.tsx b/stories/bar_chart.tsx index a1bf8e9571..f9d213e182 100644 --- a/stories/bar_chart.tsx +++ b/stories/bar_chart.tsx @@ -799,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 ( @@ -847,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) { From c2156d96d1c0219e2c8f9dcce99b5bfd81577753 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 11 Apr 2019 00:21:51 +0200 Subject: [PATCH 11/11] test: fix missing updated test --- src/lib/series/scales.test.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/lib/series/scales.test.ts b/src/lib/series/scales.test.ts index 7693282fc6..fcef4db3fc 100644 --- a/src/lib/series/scales.test.ts +++ b/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,