diff --git a/api/charts.api.md b/api/charts.api.md index 5496fab1c0..89941fe149 100644 --- a/api/charts.api.md +++ b/api/charts.api.md @@ -80,7 +80,7 @@ export type AreaSeriesSpec = BasicSeriesSpec & HistogramConfig & Postfixes & { seriesType: typeof SeriesTypes.Area; curve?: CurveType; areaSeriesStyle?: RecursivePartial; - stackAsPercentage?: boolean; + stackMode?: StackMode; pointStyleAccessor?: PointStyleAccessor; fit?: Exclude | FitConfig; }; @@ -208,7 +208,7 @@ export type BarSeriesSpec = BasicSeriesSpec & Postfixes & { seriesType: typeof SeriesTypes.Bar; enableHistogramMode?: boolean; barSeriesStyle?: RecursivePartial; - stackAsPercentage?: boolean; + stackMode?: StackMode; styleAccessor?: BarStyleAccessor; minBarHeight?: number; }; @@ -225,10 +225,8 @@ export interface BarSeriesStyle { rectBorder: RectBorderStyle; } -// Warning: (ae-forgotten-export) The symbol "RawDataSeriesDatum" needs to be exported by the entry point index.d.ts -// // @public -export type BarStyleAccessor = (datum: RawDataSeriesDatum, seriesIdentifier: XYChartSeriesIdentifier) => BarStyleOverride; +export type BarStyleAccessor = (datum: DataSeriesDatum, seriesIdentifier: XYChartSeriesIdentifier) => BarStyleOverride; // @public (undocumented) export type BarStyleOverride = RecursivePartial | Color | null; @@ -460,6 +458,18 @@ export class DataGenerator { }[]; } +// @public (undocumented) +export interface DataSeriesDatum { + datum: T; + filled?: FilledValues; + initialY0: number | null; + initialY1: number | null; + mark: number | null; + x: number | string; + y0: number | null; + y1: number | null; +} + // @public (undocumented) export type Datum = any; @@ -550,6 +560,13 @@ export interface ExternalPointerEventsSettings { }; } +// @public (undocumented) +export interface FilledValues { + x?: number | string; + y0?: number; + y1?: number; +} + // Warning: (ae-missing-release-tag) "FillStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1049,7 +1066,7 @@ export interface PointStyle { } // @public -export type PointStyleAccessor = (datum: RawDataSeriesDatum, seriesIdentifier: XYChartSeriesIdentifier) => PointStyleOverride; +export type PointStyleAccessor = (datum: DataSeriesDatum, seriesIdentifier: XYChartSeriesIdentifier) => PointStyleOverride; // @public (undocumented) export type PointStyleOverride = RecursivePartial | Color | null; @@ -1254,8 +1271,6 @@ export interface SeriesSpec extends Spec { // @public (undocumented) export type SeriesSpecs = Array; -// Warning: (ae-missing-release-tag) "SeriesTypes" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export const SeriesTypes: Readonly<{ Area: "area"; @@ -1384,6 +1399,16 @@ export const SpecTypes: Readonly<{ // @public (undocumented) export type SpecTypes = $Values; +// @public +export const StackMode: Readonly<{ + Percentage: "percentage"; + Wiggle: "wiggle"; + Silhouette: "silhouette"; +}>; + +// @public +export type StackMode = $Values; + // @public export interface StrokeDashArray { dash: number[]; diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-stacked-band-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-stacked-band-visually-looks-correct-1-snap.png index a179f2a132..4a9690b87c 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-stacked-band-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-stacked-band-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-stacked-percentage-with-zeros-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-stacked-percentage-with-zeros-visually-looks-correct-1-snap.png index 3619083da4..a1e0aa1c5b 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-stacked-percentage-with-zeros-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-stacked-percentage-with-zeros-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-test-stacked-with-missing-values-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-test-stacked-with-missing-values-visually-looks-correct-1-snap.png index 058a023cc6..97b527154b 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-test-stacked-with-missing-values-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-test-stacked-with-missing-values-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-with-log-y-axis-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-with-log-y-axis-visually-looks-correct-1-snap.png index 526cdb1f27..2f2da18472 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-with-log-y-axis-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-with-log-y-axis-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-axes-custom-mixed-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-axes-custom-mixed-visually-looks-correct-1-snap.png index 1f93c9ddd1..d93329a6d0 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-axes-custom-mixed-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-axes-custom-mixed-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-1-y-0-g-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-1-y-0-g-visually-looks-correct-1-snap.png index e4a39fe22e..9a8a5016a0 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-1-y-0-g-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-1-y-0-g-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-1-y-1-g-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-1-y-1-g-visually-looks-correct-1-snap.png index b6709e4842..c987914077 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-1-y-1-g-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-1-y-1-g-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-2-y-0-g-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-2-y-0-g-visually-looks-correct-1-snap.png index ce3589898c..a9be912be7 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-2-y-0-g-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-2-y-0-g-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-2-y-1-g-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-2-y-1-g-visually-looks-correct-1-snap.png index faa9ceef77..ab775be57b 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-2-y-1-g-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-2-y-1-g-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-2-y-2-g-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-2-y-2-g-visually-looks-correct-1-snap.png index 3532241eaa..22874ca4c9 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-2-y-2-g-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-bar-chart-2-y-2-g-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-scale-to-extent-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-scale-to-extent-visually-looks-correct-1-snap.png index a9215ea30c..b07ea70a63 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-scale-to-extent-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-scale-to-extent-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-stacked-to-extent-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-stacked-to-extent-visually-looks-correct-1-snap.png index 2139b90bce..c1ab8438bf 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-stacked-to-extent-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-stacked-to-extent-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-tooltip-series-visibility-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-tooltip-series-visibility-visually-looks-correct-1-snap.png index 3532241eaa..22874ca4c9 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-tooltip-series-visibility-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-bar-chart-tooltip-series-visibility-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-legend-display-values-in-legend-elements-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-legend-display-values-in-legend-elements-visually-looks-correct-1-snap.png index 16505efd51..188c394e87 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-legend-display-values-in-legend-elements-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-legend-display-values-in-legend-elements-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-line-chart-multi-series-with-log-values-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-line-chart-multi-series-with-log-values-visually-looks-correct-1-snap.png index b34c893576..d1bf5c6f3f 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-line-chart-multi-series-with-log-values-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-line-chart-multi-series-with-log-values-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-mixed-charts-fitting-functions-non-stacked-series-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-mixed-charts-fitting-functions-non-stacked-series-visually-looks-correct-1-snap.png index f9b989306b..1c0dc9d46d 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-mixed-charts-fitting-functions-non-stacked-series-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-mixed-charts-fitting-functions-non-stacked-series-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-mixed-charts-fitting-functions-stacked-series-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-mixed-charts-fitting-functions-stacked-series-visually-looks-correct-1-snap.png new file mode 100644 index 0000000000..a49e580076 Binary files /dev/null and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-mixed-charts-fitting-functions-stacked-series-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-negative-90-degree-ordinal-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-negative-90-degree-ordinal-visually-looks-correct-1-snap.png index 288cd4c1d9..3ada87312b 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-negative-90-degree-ordinal-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-negative-90-degree-ordinal-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-rotations-0-deg-ordinal-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-rotations-0-deg-ordinal-visually-looks-correct-1-snap.png index bb478da44d..d2335295b1 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-rotations-0-deg-ordinal-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-rotations-0-deg-ordinal-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-rotations-180-deg-ordinal-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-rotations-180-deg-ordinal-visually-looks-correct-1-snap.png index 34c7e5cad5..19e67e82e3 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-rotations-180-deg-ordinal-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-rotations-180-deg-ordinal-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-rotations-90-deg-ordinal-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-rotations-90-deg-ordinal-visually-looks-correct-1-snap.png index a34f506d5a..98fcad705e 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-rotations-90-deg-ordinal-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-rotations-90-deg-ordinal-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-with-ordinal-axis-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-with-ordinal-axis-visually-looks-correct-1-snap.png index 61d47bbc50..3ae378ea36 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-with-ordinal-axis-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-rotations-with-ordinal-axis-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-streamgraph-basic-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-streamgraph-basic-visually-looks-correct-1-snap.png new file mode 100644 index 0000000000..0e00df661f Binary files /dev/null and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-streamgraph-basic-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-area-series-color-variant-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-area-series-color-variant-visually-looks-correct-1-snap.png index 8c876a6bf1..45231070e3 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-area-series-color-variant-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-area-series-color-variant-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-bar-series-color-variant-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-bar-series-color-variant-visually-looks-correct-1-snap.png index f796e0fdb8..a049531bf8 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-bar-series-color-variant-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-bar-series-color-variant-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-colors-via-accessor-function-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-colors-via-accessor-function-visually-looks-correct-1-snap.png index 18d053731a..0f3c68dddb 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-colors-via-accessor-function-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-colors-via-accessor-function-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-name-config-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-name-config-visually-looks-correct-1-snap.png index 79b09c342a..6502c79d78 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-name-config-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-name-config-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-name-formatting-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-name-formatting-visually-looks-correct-1-snap.png index fdf21db7f0..cec80dbbcb 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-name-formatting-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-name-formatting-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-name-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-name-visually-looks-correct-1-snap.png index 010c710fc4..5342c24eb8 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-name-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-custom-series-name-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-line-series-color-variant-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-line-series-color-variant-visually-looks-correct-1-snap.png index be56065df8..ea86cf2e6e 100644 Binary files a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-line-series-color-variant-visually-looks-correct-1-snap.png and b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-line-series-color-variant-visually-looks-correct-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-scale-to-extents-domain-fit-is-false-should-show-correct-extents-banded-1-snap.png b/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-scale-to-extents-domain-fit-is-false-should-show-correct-extents-banded-1-snap.png index a179f2a132..4a9690b87c 100644 Binary files a/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-scale-to-extents-domain-fit-is-false-should-show-correct-extents-banded-1-snap.png and b/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-scale-to-extents-domain-fit-is-false-should-show-correct-extents-banded-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-scale-to-extents-domain-fit-is-false-should-show-correct-extents-stacked-1-snap.png b/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-scale-to-extents-domain-fit-is-false-should-show-correct-extents-stacked-1-snap.png deleted file mode 100644 index a179f2a132..0000000000 Binary files a/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-scale-to-extents-domain-fit-is-false-should-show-correct-extents-stacked-1-snap.png and /dev/null differ diff --git a/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-scale-to-extents-domain-fit-is-true-should-show-correct-extents-banded-1-snap.png b/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-scale-to-extents-domain-fit-is-true-should-show-correct-extents-banded-1-snap.png index a83b05a327..4a9690b87c 100644 Binary files a/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-scale-to-extents-domain-fit-is-true-should-show-correct-extents-banded-1-snap.png and b/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-scale-to-extents-domain-fit-is-true-should-show-correct-extents-banded-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-scale-to-extents-domain-fit-is-true-should-show-correct-extents-stacked-1-snap.png b/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-scale-to-extents-domain-fit-is-true-should-show-correct-extents-stacked-1-snap.png deleted file mode 100644 index a83b05a327..0000000000 Binary files a/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-scale-to-extents-domain-fit-is-true-should-show-correct-extents-stacked-1-snap.png and /dev/null differ diff --git a/integration/tests/__image_snapshots__/axis-stories-test-ts-axis-stories-should-render-with-domain-constraints-1-snap.png b/integration/tests/__image_snapshots__/axis-stories-test-ts-axis-stories-should-render-with-domain-constraints-1-snap.png index 4311cb706b..5235c4813b 100644 Binary files a/integration/tests/__image_snapshots__/axis-stories-test-ts-axis-stories-should-render-with-domain-constraints-1-snap.png and b/integration/tests/__image_snapshots__/axis-stories-test-ts-axis-stories-should-render-with-domain-constraints-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png index db39ba78b5..35c7a9b566 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png index 9663015c9a..02949dd3cc 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png index 6baf739a96..23b7511938 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png index bd54026518..b885e1a935 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png index cc0880ac50..9f2b0faaa0 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png index 6ccf96e255..57c575743f 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png index 112441511c..cb9cd0671c 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png index 713b820f78..a7395c0dce 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-average-1-snap.png index 1cf32db1de..e85fe1d03f 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-average-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-carry-1-snap.png index f52d9023d3..b690d9360c 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-carry-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-explicit-1-snap.png index 6baf739a96..23b7511938 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-explicit-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-linear-1-snap.png index 26c9614bfd..2d0b51af76 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-linear-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-lookahead-1-snap.png index f24896271b..9f4a25c027 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-lookahead-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-nearest-1-snap.png index 6ccf96e255..57c575743f 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-nearest-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-none-1-snap.png index 112441511c..cb9cd0671c 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-none-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-zero-1-snap.png index 713b820f78..a7395c0dce 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-zero-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-average-1-snap.png index f9b989306b..1c0dc9d46d 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-average-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png index 53acd55d27..2c5f24ab5c 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png index 6baf739a96..23b7511938 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png index 093ab3cc57..884f6852dc 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png index ecb96bba00..f23c1f2cee 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png index 6ccf96e255..57c575743f 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-none-1-snap.png index 112441511c..cb9cd0671c 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-none-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png index 713b820f78..a7395c0dce 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-average-1-snap.png index f7f54f7fde..f17eb2d6de 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-average-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png index b694ec3f62..7f408fa218 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png index 6d0db2425a..1d2630f12a 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png index 49d077a9f1..9de9ed2716 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png index 8cfcad3262..9207650821 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png index 19d83cec4f..7f2221b0f6 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-none-1-snap.png index 96ff95abdc..319ef15244 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-none-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png index f7954f0148..a7750d7b56 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png index db39ba78b5..35c7a9b566 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png index 9663015c9a..02949dd3cc 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png index 6baf739a96..23b7511938 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png index bd54026518..b885e1a935 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png index cc0880ac50..9f2b0faaa0 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png index 6ccf96e255..57c575743f 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png index 112441511c..cb9cd0671c 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png index 713b820f78..a7395c0dce 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png index 713c0f6f26..2c3efadc22 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png index 9bf2d342dc..32399cb3ec 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png index 645bb84521..ab8653c909 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png index 4eb3afae30..04558d5216 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png index 052d98d644..2133b5c623 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png index 4625b7e1dc..6f68ce6e53 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png index 48f2c29d40..b0e4e20264 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png index 8f6d38ba8c..df79815aba 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-average-1-snap.png index 4495399dad..421e024986 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-average-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png index ca2ccf61a6..5c90e44930 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png index 645bb84521..ab8653c909 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png index 769ce79c9d..a282636158 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png index 6d9347c04b..3d3ecf0d79 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png index 4625b7e1dc..6f68ce6e53 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-none-1-snap.png index 48f2c29d40..b0e4e20264 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-none-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png index 8f6d38ba8c..df79815aba 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png index 713c0f6f26..2c3efadc22 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png index 9bf2d342dc..32399cb3ec 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png index 645bb84521..ab8653c909 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png index 4eb3afae30..04558d5216 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png index 052d98d644..2133b5c623 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png index 4625b7e1dc..6f68ce6e53 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png index 48f2c29d40..b0e4e20264 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png index 8f6d38ba8c..df79815aba 100644 Binary files a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-line-charts-with-curve-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png new file mode 100644 index 0000000000..8589a3a1d4 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png new file mode 100644 index 0000000000..8679420d31 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png new file mode 100644 index 0000000000..b89053b56a Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png new file mode 100644 index 0000000000..3d1e7d6a38 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png new file mode 100644 index 0000000000..c0ce515ed3 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png new file mode 100644 index 0000000000..85b14da3e4 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png new file mode 100644 index 0000000000..993314d349 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png new file mode 100644 index 0000000000..25f3f0147f Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-average-1-snap.png new file mode 100644 index 0000000000..293d693520 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-carry-1-snap.png new file mode 100644 index 0000000000..f4a355ee94 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-explicit-1-snap.png new file mode 100644 index 0000000000..b89053b56a Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-linear-1-snap.png new file mode 100644 index 0000000000..a6f51d7ce7 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-lookahead-1-snap.png new file mode 100644 index 0000000000..f000c6f908 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-nearest-1-snap.png new file mode 100644 index 0000000000..85b14da3e4 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-none-1-snap.png new file mode 100644 index 0000000000..993314d349 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-zero-1-snap.png new file mode 100644 index 0000000000..25f3f0147f Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-average-1-snap.png new file mode 100644 index 0000000000..a49e580076 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png new file mode 100644 index 0000000000..f843cc3c1f Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png new file mode 100644 index 0000000000..b89053b56a Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png new file mode 100644 index 0000000000..44ef20e60b Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png new file mode 100644 index 0000000000..153ef11cf2 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png new file mode 100644 index 0000000000..85b14da3e4 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-none-1-snap.png new file mode 100644 index 0000000000..993314d349 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png new file mode 100644 index 0000000000..25f3f0147f Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-average-1-snap.png new file mode 100644 index 0000000000..5daba4a782 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png new file mode 100644 index 0000000000..176ce53f2a Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png new file mode 100644 index 0000000000..298b1af9ee Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png new file mode 100644 index 0000000000..47cfe71fd6 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png new file mode 100644 index 0000000000..c2154e7209 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png new file mode 100644 index 0000000000..eaa4e518ca Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-none-1-snap.png new file mode 100644 index 0000000000..5060bd0d15 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png new file mode 100644 index 0000000000..5ed820e77a Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png new file mode 100644 index 0000000000..8589a3a1d4 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png new file mode 100644 index 0000000000..8679420d31 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png new file mode 100644 index 0000000000..b89053b56a Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png new file mode 100644 index 0000000000..3d1e7d6a38 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png new file mode 100644 index 0000000000..c0ce515ed3 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png new file mode 100644 index 0000000000..85b14da3e4 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png new file mode 100644 index 0000000000..993314d349 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png new file mode 100644 index 0000000000..25f3f0147f Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png new file mode 100644 index 0000000000..cfd549401d Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png new file mode 100644 index 0000000000..9afd4c1dff Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png new file mode 100644 index 0000000000..b6320a4fcd Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png new file mode 100644 index 0000000000..77294bdae5 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png new file mode 100644 index 0000000000..7c0416b9d3 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png new file mode 100644 index 0000000000..8915a7a8fe Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png new file mode 100644 index 0000000000..68c79e5476 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png new file mode 100644 index 0000000000..44b29a99c7 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-average-1-snap.png new file mode 100644 index 0000000000..e02650932a Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-carry-1-snap.png new file mode 100644 index 0000000000..be224498bf Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-explicit-1-snap.png new file mode 100644 index 0000000000..b6320a4fcd Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-linear-1-snap.png new file mode 100644 index 0000000000..272b98e7d4 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-lookahead-1-snap.png new file mode 100644 index 0000000000..0b5ffaef91 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-nearest-1-snap.png new file mode 100644 index 0000000000..8915a7a8fe Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-none-1-snap.png new file mode 100644 index 0000000000..68c79e5476 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-zero-1-snap.png new file mode 100644 index 0000000000..44b29a99c7 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-end-value-set-to-nearest-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-average-1-snap.png new file mode 100644 index 0000000000..df77bf970e Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png new file mode 100644 index 0000000000..e3cc4c0efe Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png new file mode 100644 index 0000000000..b6320a4fcd Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png new file mode 100644 index 0000000000..14cf79b708 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png new file mode 100644 index 0000000000..8e2763c633 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png new file mode 100644 index 0000000000..8915a7a8fe Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-none-1-snap.png new file mode 100644 index 0000000000..68c79e5476 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png new file mode 100644 index 0000000000..44b29a99c7 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-average-1-snap.png new file mode 100644 index 0000000000..5d7959a1aa Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png new file mode 100644 index 0000000000..9d8597d64c Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png new file mode 100644 index 0000000000..1b91faa923 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png new file mode 100644 index 0000000000..750e555d34 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png new file mode 100644 index 0000000000..76146aa39a Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png new file mode 100644 index 0000000000..cc0557e0b5 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-none-1-snap.png new file mode 100644 index 0000000000..a82c4851e7 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png new file mode 100644 index 0000000000..c86154bb40 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-ordinal-dataset-no-end-value-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png new file mode 100644 index 0000000000..cfd549401d Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-average-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png new file mode 100644 index 0000000000..9afd4c1dff Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-carry-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png new file mode 100644 index 0000000000..b6320a4fcd Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-explicit-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png new file mode 100644 index 0000000000..77294bdae5 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-linear-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png new file mode 100644 index 0000000000..7c0416b9d3 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-lookahead-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png new file mode 100644 index 0000000000..8915a7a8fe Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-nearest-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png new file mode 100644 index 0000000000..68c79e5476 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-none-1-snap.png differ diff --git a/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png new file mode 100644 index 0000000000..44b29a99c7 Binary files /dev/null and b/integration/tests/__image_snapshots__/mixed-stories-test-ts-mixed-series-stories-fitting-functions-stacked-charts-as-percentage-area-charts-with-curved-end-value-set-to-2-should-display-correct-fit-for-type-zero-1-snap.png differ diff --git a/integration/tests/area_stories.test.ts b/integration/tests/area_stories.test.ts index a667133c56..336ae1fbd6 100644 --- a/integration/tests/area_stories.test.ts +++ b/integration/tests/area_stories.test.ts @@ -40,10 +40,6 @@ describe('Area series stories', () => { it('should show correct extents - Banded', async() => { await common.expectChartAtUrlToMatchScreenshot(trueUrl); }); - - it('should show correct extents - stacked', async() => { - await common.expectChartAtUrlToMatchScreenshot(trueUrl); - }); }); describe('domain.fit is false', () => { @@ -52,10 +48,6 @@ describe('Area series stories', () => { it('should show correct extents - Banded', async() => { await common.expectChartAtUrlToMatchScreenshot(falseUrl); }); - - it('should show correct extents - stacked', async() => { - await common.expectChartAtUrlToMatchScreenshot(falseUrl); - }); }); }); }); diff --git a/integration/tests/mixed_stories.test.ts b/integration/tests/mixed_stories.test.ts index 7468bef816..35e719d8b6 100644 --- a/integration/tests/mixed_stories.test.ts +++ b/integration/tests/mixed_stories.test.ts @@ -26,7 +26,7 @@ describe('Mixed series stories', () => { Object.values(Fit).forEach((fitType) => { it(`should display correct fit for type - ${fitType}`, async() => { await common.expectChartAtUrlToMatchScreenshot( - `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=none&knob-Explicit valuve (using Fit.Explicit)=8`, + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=none&knob-Explicit value (using Fit.Explicit)=8`, ); }); }); @@ -36,7 +36,7 @@ describe('Mixed series stories', () => { Object.values(Fit).forEach((fitType) => { it(`should display correct fit for type - ${fitType}`, async() => { await common.expectChartAtUrlToMatchScreenshot( - `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=2&knob-Explicit valuve (using Fit.Explicit)=8`, + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=2&knob-Explicit value (using Fit.Explicit)=8`, ); }); }); @@ -46,7 +46,7 @@ describe('Mixed series stories', () => { Object.values(Fit).forEach((fitType) => { it(`should display correct fit for type - ${fitType}`, async() => { await common.expectChartAtUrlToMatchScreenshot( - `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=nearest&knob-Explicit valuve (using Fit.Explicit)=8`, + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=nearest&knob-Explicit value (using Fit.Explicit)=8`, ); }); }); @@ -56,7 +56,7 @@ describe('Mixed series stories', () => { Object.values(Fit).forEach((fitType) => { it(`should display correct fit for type - ${fitType}`, async() => { await common.expectChartAtUrlToMatchScreenshot( - `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=1&knob-End value=2&knob-Explicit valuve (using Fit.Explicit)=8`, + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=1&knob-End value=2&knob-Explicit value (using Fit.Explicit)=8`, ); }); }); @@ -66,7 +66,7 @@ describe('Mixed series stories', () => { Object.values(Fit).forEach((fitType) => { it(`should display correct fit for type - ${fitType}`, async() => { await common.expectChartAtUrlToMatchScreenshot( - `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=area&knob-dataset=ordinal&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=none&knob-Explicit valuve (using Fit.Explicit)=8`, + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=area&knob-dataset=ordinal&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=none&knob-Explicit value (using Fit.Explicit)=8`, ); }); }); @@ -76,7 +76,7 @@ describe('Mixed series stories', () => { Object.values(Fit).forEach((fitType) => { it(`should display correct fit for type - ${fitType}`, async() => { await common.expectChartAtUrlToMatchScreenshot( - `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=line&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=none&knob-Explicit valuve (using Fit.Explicit)=8`, + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=line&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=none&knob-Explicit value (using Fit.Explicit)=8`, ); }); }); @@ -86,7 +86,7 @@ describe('Mixed series stories', () => { Object.values(Fit).forEach((fitType) => { it(`should display correct fit for type - ${fitType}`, async() => { await common.expectChartAtUrlToMatchScreenshot( - `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=line&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=2&knob-Explicit valuve (using Fit.Explicit)=8`, + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=line&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=2&knob-Explicit value (using Fit.Explicit)=8`, ); }); }); @@ -96,7 +96,112 @@ describe('Mixed series stories', () => { Object.values(Fit).forEach((fitType) => { it(`should display correct fit for type - ${fitType}`, async() => { await common.expectChartAtUrlToMatchScreenshot( - `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=line&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=1&knob-End value=2&knob-Explicit valuve (using Fit.Explicit)=8`, + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&knob-seriesType=line&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=1&knob-End value=2&knob-Explicit value (using Fit.Explicit)=8`, + ); + }); + }); + }); + }); + + + describe('Fitting functions - Stacked charts', () => { + describe('Area charts - no endValue', () => { + Object.values(Fit).forEach((fitType) => { + it(`should display correct fit for type - ${fitType}`, async() => { + await common.expectChartAtUrlToMatchScreenshot( + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=none&knob-Explicit value (using Fit.Explicit)=8`, + ); + }); + }); + }); + + describe('Area charts - endValue set to 2', () => { + Object.values(Fit).forEach((fitType) => { + it(`should display correct fit for type - ${fitType}`, async() => { + await common.expectChartAtUrlToMatchScreenshot( + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=2&knob-Explicit value (using Fit.Explicit)=8`, + ); + }); + }); + }); + + describe('Area charts - endValue set to "nearest"', () => { + Object.values(Fit).forEach((fitType) => { + it(`should display correct fit for type - ${fitType}`, async() => { + await common.expectChartAtUrlToMatchScreenshot( + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=nearest&knob-Explicit value (using Fit.Explicit)=8`, + ); + }); + }); + }); + + describe('Area charts - with curved - endValue set to 2', () => { + Object.values(Fit).forEach((fitType) => { + it(`should display correct fit for type - ${fitType}`, async() => { + await common.expectChartAtUrlToMatchScreenshot( + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=1&knob-End value=2&knob-Explicit value (using Fit.Explicit)=8`, + ); + }); + }); + }); + + describe('Area charts - Ordinal dataset - no endValue', () => { + Object.values(Fit).forEach((fitType) => { + it(`should display correct fit for type - ${fitType}`, async() => { + await common.expectChartAtUrlToMatchScreenshot( + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-stacked-series&knob-seriesType=area&knob-dataset=ordinal&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=none&knob-Explicit value (using Fit.Explicit)=8`, + ); + }); + }); + }); + }); + + describe('Fitting functions - Stacked charts - as percentage', () => { + describe('Area charts - no endValue', () => { + Object.values(Fit).forEach((fitType) => { + it(`should display correct fit for type - ${fitType}`, async() => { + await common.expectChartAtUrlToMatchScreenshot( + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=none&knob-Explicit value (using Fit.Explicit)=8&knob-stackMode=percentage`, + ); + }); + }); + }); + + describe('Area charts - endValue set to 2', () => { + Object.values(Fit).forEach((fitType) => { + it(`should display correct fit for type - ${fitType}`, async() => { + await common.expectChartAtUrlToMatchScreenshot( + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=2&knob-Explicit value (using Fit.Explicit)=8&knob-stackMode=percentage`, + ); + }); + }); + }); + + describe('Area charts - endValue set to "nearest"', () => { + Object.values(Fit).forEach((fitType) => { + it(`should display correct fit for type - ${fitType}`, async() => { + await common.expectChartAtUrlToMatchScreenshot( + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=nearest&knob-Explicit value (using Fit.Explicit)=8&knob-stackMode=percentage`, + ); + }); + }); + }); + + describe('Area charts - with curved - endValue set to 2', () => { + Object.values(Fit).forEach((fitType) => { + it(`should display correct fit for type - ${fitType}`, async() => { + await common.expectChartAtUrlToMatchScreenshot( + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-stacked-series&knob-seriesType=area&knob-dataset=all&knob-fitting function=${fitType}&knob-Curve=1&knob-End value=2&knob-Explicit value (using Fit.Explicit)=8&knob-stackMode=percentage`, + ); + }); + }); + }); + + describe('Area charts - Ordinal dataset - no endValue', () => { + Object.values(Fit).forEach((fitType) => { + it(`should display correct fit for type - ${fitType}`, async() => { + await common.expectChartAtUrlToMatchScreenshot( + `http://localhost:9001/?path=/story/mixed-charts--fitting-functions-stacked-series&knob-seriesType=area&knob-dataset=ordinal&knob-fitting function=${fitType}&knob-Curve=0&knob-End value=none&knob-Explicit value (using Fit.Explicit)=8&knob-stackMode=percentage`, ); }); }); diff --git a/src/chart_types/xy_chart/domains/x_domain.test.ts b/src/chart_types/xy_chart/domains/x_domain.test.ts index 5650296ee1..b514a22511 100644 --- a/src/chart_types/xy_chart/domains/x_domain.test.ts +++ b/src/chart_types/xy_chart/domains/x_domain.test.ts @@ -20,7 +20,7 @@ import { ChartTypes } from '../..'; import { ScaleType } from '../../../scales/constants'; import { SpecTypes } from '../../../specs/constants'; -import { getSplittedSeries } from '../utils/series'; +import { getDataSeriesBySpecId } from '../utils/series'; import { BasicSeriesSpec, SeriesTypes } from '../utils/specs'; import { convertXScaleTypes, findMinInterval, mergeXDomain } from './x_domain'; @@ -221,7 +221,7 @@ describe('X Domain', () => { ], }; const specDataSeries: BasicSeriesSpec[] = [ds1, ds2]; - const { xValues } = getSplittedSeries(specDataSeries); + const { xValues } = getDataSeriesBySpecId(specDataSeries); const mergedDomain = mergeXDomain( [ { @@ -268,7 +268,7 @@ describe('X Domain', () => { }; const specDataSeries = [ds1, ds2]; - const { xValues } = getSplittedSeries(specDataSeries); + const { xValues } = getDataSeriesBySpecId(specDataSeries); const mergedDomain = mergeXDomain( [ { @@ -315,7 +315,7 @@ describe('X Domain', () => { }; const specDataSeries = [ds1, ds2]; - const { xValues } = getSplittedSeries(specDataSeries); + const { xValues } = getDataSeriesBySpecId(specDataSeries); const mergedDomain = mergeXDomain( [ { @@ -366,7 +366,7 @@ describe('X Domain', () => { }; const specDataSeries = [ds1, ds2]; - const { xValues } = getSplittedSeries(specDataSeries); + const { xValues } = getDataSeriesBySpecId(specDataSeries); const mergedDomain = mergeXDomain( [ { @@ -417,7 +417,7 @@ describe('X Domain', () => { }; const specDataSeries = [ds1, ds2]; - const { xValues } = getSplittedSeries(specDataSeries); + const { xValues } = getDataSeriesBySpecId(specDataSeries); const mergedDomain = mergeXDomain( [ { @@ -474,7 +474,7 @@ describe('X Domain', () => { min: 0, }; - const { xValues } = getSplittedSeries(specDataSeries); + const { xValues } = getDataSeriesBySpecId(specDataSeries); const getResult = () => mergeXDomain( [ { @@ -533,7 +533,7 @@ describe('X Domain', () => { }; const specDataSeries = [ds1, ds2]; - const { xValues } = getSplittedSeries(specDataSeries); + const { xValues } = getDataSeriesBySpecId(specDataSeries); const mergedDomain = mergeXDomain( [ { @@ -584,7 +584,7 @@ describe('X Domain', () => { }; const specDataSeries = [ds1, ds2]; - const { xValues } = getSplittedSeries(specDataSeries); + const { xValues } = getDataSeriesBySpecId(specDataSeries); const mergedDomain = mergeXDomain( [ { @@ -635,7 +635,7 @@ describe('X Domain', () => { }; const specDataSeries = [ds1, ds2]; - const { xValues } = getSplittedSeries(specDataSeries); + const { xValues } = getDataSeriesBySpecId(specDataSeries); const mergedDomain = mergeXDomain( [ { @@ -680,7 +680,7 @@ describe('X Domain', () => { }; const specDataSeries = [ds1, ds2]; - const { xValues } = getSplittedSeries(specDataSeries); + const { xValues } = getDataSeriesBySpecId(specDataSeries); const mergedDomain = mergeXDomain( [ diff --git a/src/chart_types/xy_chart/domains/y_domain.test.ts b/src/chart_types/xy_chart/domains/y_domain.test.ts index f44b274746..aaac194e0c 100644 --- a/src/chart_types/xy_chart/domains/y_domain.test.ts +++ b/src/chart_types/xy_chart/domains/y_domain.test.ts @@ -18,134 +18,126 @@ */ import { ChartTypes } from '../..'; -import { MockRawDataSeries, MockRawDataSeriesDatum } from '../../../mocks'; +import { MockSeriesSpec, MockGlobalSpec } from '../../../mocks/specs'; +import { MockStore } from '../../../mocks/store'; import { ScaleType } from '../../../scales/constants'; import { SpecTypes } from '../../../specs/constants'; +import { Position } from '../../../utils/commons'; import { BARCHART_1Y0G } from '../../../utils/data_samples/test_dataset'; -import { GroupId } from '../../../utils/ids'; -import { RawDataSeries } from '../utils/series'; -import { BasicSeriesSpec, SeriesTypes, YDomainRange } from '../utils/specs'; +import { computeSeriesDomainsSelector } from '../state/selectors/compute_series_domains'; +import { BasicSeriesSpec, SeriesTypes, DEFAULT_GLOBAL_ID, StackMode } from '../utils/specs'; import { coerceYScaleTypes, - getDataSeriesOnGroup, - mergeYDomain, splitSpecsByGroupId, - YBasicSeriesSpec, } from './y_domain'; -const domainGroup = new Map([ - ['a', { fit: true }], - ['b', { fit: true }], -]); +const DEMO_AREA_SPEC_1 = { + id: 'a', + groupId: 'a', + yAccessors: ['y1'], + stackAccessors: ['x'], + splitSeriesAccessors: ['g'], + yScaleType: ScaleType.Linear, + data: [ + { x: 1, y1: 2, g: 'a' }, + { x: 2, y1: 2, g: 'a' }, + { x: 3, y1: 2, g: 'a' }, + { x: 4, y1: 5, g: 'a' }, + + { x: 1, y1: 2, g: 'b' }, + { x: 4, y1: 7, g: 'b' }, + ], +}; +const DEMO_AREA_SPEC_2 = { + id: 'b', + yAccessors: ['y1'], + yScaleType: ScaleType.Log, + data: [ + { x: 1, y1: 10 }, + { x: 2, y1: 10 }, + { x: 3, y1: 2 }, + { x: 4, y1: 5 }, + ], +}; describe('Y Domain', () => { - test('Should merge Y domain', () => { - const dataSeries = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 2 }, - { x: 2, y1: 2 }, - { x: 3, y1: 2 }, - { x: 4, y1: 5 }, - ], - [ - { x: 1, y1: 2 }, - { x: 4, y1: 7 }, - ], - ], - { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', - }, - ); - const specDataSeries = new Map(); - specDataSeries.set('a', dataSeries); - const mergedDomain = mergeYDomain( - specDataSeries, - [ - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Linear, - groupId: 'a', - id: 'a', - stackAccessors: ['a'], - }, - ], - domainGroup, - ); - expect(mergedDomain).toEqual([ + test('Should merge Y domain for non zero baseline charts', () => { + const store = MockStore.default(); + MockStore.addSpecs([ + MockGlobalSpec.axis({ + id: 'y', + position: Position.Left, + domain: { fit: true }, + }), + MockSeriesSpec.line({ + ...DEMO_AREA_SPEC_1, + groupId: DEFAULT_GLOBAL_ID, + }), + ], store); + const { yDomain } = computeSeriesDomainsSelector(store.getState()); + + expect(yDomain).toEqual([ { type: 'yDomain', - groupId: 'a', + groupId: DEFAULT_GLOBAL_ID, domain: [2, 12], scaleType: ScaleType.Linear, isBandScale: false, }, ]); }); - test('Should merge Y domain different group', () => { - const dataSeries1 = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 2 }, - { x: 2, y1: 2 }, - { x: 3, y1: 2 }, - { x: 4, y1: 5 }, - ], - [ - { x: 1, y1: 2 }, - { x: 4, y1: 7 }, - ], - ], - { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', - }, - ); - const dataSeries2 = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 10 }, - { x: 2, y1: 10 }, - { x: 3, y1: 2 }, - { x: 4, y1: 5 }, - ], - ], + test('Should merge Y domain for zero baseline charts', () => { + const store = MockStore.default(); + MockStore.addSpecs([ + MockGlobalSpec.axis({ + id: 'y', + position: Position.Left, + domain: { fit: true }, + }), + MockSeriesSpec.area({ + ...DEMO_AREA_SPEC_1, + groupId: DEFAULT_GLOBAL_ID, + }), + ], store); + const { yDomain } = computeSeriesDomainsSelector(store.getState()); + + expect(yDomain).toEqual([ { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', + type: 'yDomain', + groupId: DEFAULT_GLOBAL_ID, + domain: [0, 12], + scaleType: ScaleType.Linear, + isBandScale: false, }, - ); - const specDataSeries = new Map(); - specDataSeries.set('a', dataSeries1); - specDataSeries.set('b', dataSeries2); - const mergedDomain = mergeYDomain( - specDataSeries, - [ - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Linear, - groupId: 'a', - id: 'a', - stackAccessors: ['a'], - }, - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Log, - groupId: 'b', - id: 'b', - stackAccessors: ['a'], - }, - ], - domainGroup, - ); - expect(mergedDomain).toEqual([ + ]); + }); + test('Should merge Y domain different group', () => { + const store = MockStore.default(); + MockStore.addSpecs([ + MockGlobalSpec.axis({ + id: 'y a', + groupId: 'a', + position: Position.Left, + domain: { fit: true }, + }), + MockGlobalSpec.axis({ + id: 'y b', + groupId: 'b', + position: Position.Left, + domain: { fit: true }, + }), + MockSeriesSpec.line(DEMO_AREA_SPEC_1), + MockSeriesSpec.line({ + ...DEMO_AREA_SPEC_2, + groupId: 'b', + }), + + + ], store); + const { yDomain } = computeSeriesDomainsSelector(store.getState()); + + + expect(yDomain).toEqual([ { groupId: 'a', domain: [2, 12], @@ -163,70 +155,27 @@ describe('Y Domain', () => { ]); }); test('Should merge Y domain same group all stacked', () => { - const dataSeries1 = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 2 }, - { x: 2, y1: 2 }, - { x: 3, y1: 2 }, - { x: 4, y1: 5 }, - ], - [ - { x: 1, y1: 2 }, - { x: 4, y1: 7 }, - ], - ], - { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', - }, - ); + const store = MockStore.default(); + MockStore.addSpecs([ + MockGlobalSpec.axis({ + id: 'y a', + groupId: 'a', + position: Position.Left, + domain: { fit: true }, + }), + MockSeriesSpec.area(DEMO_AREA_SPEC_1), + MockSeriesSpec.area({ + ...DEMO_AREA_SPEC_2, + groupId: 'a', + stackAccessors: ['x'], + }), + ], store); + const { yDomain } = computeSeriesDomainsSelector(store.getState()); - const dataSeries2 = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 10 }, - { x: 2, y1: 10 }, - { x: 3, y1: 2 }, - { x: 4, y1: 5 }, - ], - ], - { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', - }, - ); - const specDataSeries = new Map(); - specDataSeries.set('a', dataSeries1); - specDataSeries.set('b', dataSeries2); - const mergedDomain = mergeYDomain( - specDataSeries, - [ - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Linear, - groupId: 'a', - id: 'a', - stackAccessors: ['a'], - }, - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Log, - groupId: 'a', - id: 'b', - stackAccessors: ['a'], - }, - ], - domainGroup, - ); - expect(mergedDomain).toEqual([ + expect(yDomain).toEqual([ { groupId: 'a', - domain: [2, 17], + domain: [0, 17], scaleType: ScaleType.Linear, isBandScale: false, type: 'yDomain', @@ -234,129 +183,32 @@ describe('Y Domain', () => { ]); }); test('Should merge Y domain same group partially stacked', () => { - const dataSeries1 = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 2, mark: null }, - { x: 2, y1: 2, mark: null }, - { x: 3, y1: 2, mark: null }, - { x: 4, y1: 5, mark: null }, - ], - [ - { x: 1, y1: 2, mark: null }, - { x: 4, y1: 7, mark: null }, - ], - ], - { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', - }, - ); - const dataSeries2 = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 10, mark: null }, - { x: 2, y1: 10, mark: null }, - { x: 3, y1: 2, mark: null }, - { x: 4, y1: 5, mark: null }, - ], - ], - { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', - }, - ); - const specDataSeries = new Map(); - specDataSeries.set('a', dataSeries1); - specDataSeries.set('b', dataSeries2); - const mergedDomain = mergeYDomain( - specDataSeries, - [ - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Linear, - groupId: 'a', - id: 'a', - stackAccessors: ['a'], - }, - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Log, - groupId: 'a', - id: 'b', - }, - ], - domainGroup, - ); - expect(mergedDomain).toEqual([ + const store = MockStore.default(); + MockStore.addSpecs([ + MockGlobalSpec.axis({ + id: 'y a', + groupId: 'a', + position: Position.Left, + domain: { fit: true }, + }), + MockSeriesSpec.area(DEMO_AREA_SPEC_1), + MockSeriesSpec.area({ + ...DEMO_AREA_SPEC_2, + groupId: 'a', + }), + ], store); + const { yDomain } = computeSeriesDomainsSelector(store.getState()); + expect(yDomain).toEqual([ { groupId: 'a', - domain: [2, 12], + domain: [0, 12], scaleType: ScaleType.Linear, isBandScale: false, type: 'yDomain', }, ]); }); - test('Should merge Y high volume of data', () => { - const maxValues = 10000; - const data = new Array(maxValues).fill(0).map((_, i) => MockRawDataSeriesDatum.default({ x: i, y1: i })); - const dataSeries1: RawDataSeries[] = [ - { - specId: 'a', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [''], - key: '', - data, - }, - { - specId: 'a', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [''], - key: '', - data, - }, - ]; - const dataSeries2: RawDataSeries[] = [ - { - specId: 'a', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [''], - key: '', - data, - }, - ]; - const specDataSeries = new Map(); - specDataSeries.set('a', dataSeries1); - specDataSeries.set('b', dataSeries2); - const mergedDomain = mergeYDomain( - specDataSeries, - [ - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Linear, - groupId: 'a', - id: 'a', - stackAccessors: ['a'], - }, - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Log, - groupId: 'a', - id: 'b', - }, - ], - domainGroup, - ); - expect(mergedDomain.length).toEqual(1); - }); + test('Should split specs by groupId, two groups, non stacked', () => { const spec1: BasicSeriesSpec = { chartType: ChartTypes.XYAxis, @@ -520,87 +372,24 @@ describe('Y Domain', () => { expect(coerceYScaleTypes(specs)).toBe(ScaleType.Linear); }); - test('Should getDataSeriesOnGroup for matching specs', () => { - const dataSeries = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 2 }, - { x: 2, y1: 2 }, - { x: 3, y1: 2 }, - { x: 4, y1: 5 }, - ], - [ - { x: 1, y1: 2 }, - { x: 4, y1: 7 }, - ], - ], - { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', - }, - ); - const specDataSeries = new Map(); - specDataSeries.set('b', dataSeries); - const specs: YBasicSeriesSpec[] = [ - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Linear, - groupId: 'a', - id: 'a', - stackAccessors: ['a'], - }, - ]; - - const rawDataSeries = getDataSeriesOnGroup(specDataSeries, specs); - expect(rawDataSeries).toEqual([]); - }); test('Should merge Y domain accounting for custom domain limits: complete bounded domain', () => { - const groupId = 'a'; - const dataSeries = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 2 }, - { x: 2, y1: 2 }, - { x: 3, y1: 2 }, - { x: 4, y1: 5 }, - ], - [ - { x: 1, y1: 2 }, - { x: 4, y1: 7 }, - ], - ], - { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', - }, - ); - const specDataSeries = new Map(); - specDataSeries.set('a', dataSeries); - const domainsByGroupId = new Map(); - domainsByGroupId.set(groupId, { min: 0, max: 20, fit: true }); + const store = MockStore.default(); + MockStore.addSpecs([ + MockGlobalSpec.axis({ + id: 'y a', + groupId: 'a', + position: Position.Left, + domain: { min: 0, max: 20, fit: true }, + }), + MockSeriesSpec.area(DEMO_AREA_SPEC_1), + ], store); + const { yDomain } = computeSeriesDomainsSelector(store.getState()); - const mergedDomain = mergeYDomain( - specDataSeries, - [ - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Linear, - groupId, - id: 'a', - stackAccessors: ['a'], - }, - ], - domainsByGroupId, - ); - expect(mergedDomain).toEqual([ + expect(yDomain).toEqual([ { type: 'yDomain', - groupId, + groupId: 'a', domain: [0, 20], scaleType: ScaleType.Linear, isBandScale: false, @@ -608,49 +397,22 @@ describe('Y Domain', () => { ]); }); test('Should merge Y domain accounting for custom domain limits: partial lower bounded domain', () => { - const groupId = 'a'; - const dataSeries = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 2 }, - { x: 2, y1: 2 }, - { x: 3, y1: 2 }, - { x: 4, y1: 5 }, - ], - [ - { x: 1, y1: 2 }, - { x: 4, y1: 7 }, - ], - ], - { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', - }, - ); - const specDataSeries = new Map(); - specDataSeries.set('a', dataSeries); - const domainsByGroupId = new Map(); - domainsByGroupId.set(groupId, { min: 0, fit: true }); + const store = MockStore.default(); + MockStore.addSpecs([ + MockGlobalSpec.axis({ + id: 'y a', + groupId: 'a', + position: Position.Left, + domain: { min: 0, fit: true }, + }), + MockSeriesSpec.area(DEMO_AREA_SPEC_1), + ], store); + const { yDomain } = computeSeriesDomainsSelector(store.getState()); - const mergedDomain = mergeYDomain( - specDataSeries, - [ - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Linear, - groupId, - id: 'a', - stackAccessors: ['a'], - }, - ], - domainsByGroupId, - ); - expect(mergedDomain).toEqual([ + expect(yDomain).toEqual([ { type: 'yDomain', - groupId, + groupId: 'a', domain: [0, 12], scaleType: ScaleType.Linear, isBandScale: false, @@ -658,95 +420,42 @@ describe('Y Domain', () => { ]); }); test('Should not merge Y domain with invalid custom domain limits: partial lower bounded domain', () => { - const groupId = 'a'; - const dataSeries = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 2 }, - { x: 2, y1: 2 }, - { x: 3, y1: 2 }, - { x: 4, y1: 5 }, - ], - [ - { x: 1, y1: 2 }, - { x: 4, y1: 7 }, - ], - ], - { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', - }, - ); - const specDataSeries = new Map(); - specDataSeries.set('a', dataSeries); - const domainsByGroupId = new Map(); - domainsByGroupId.set(groupId, { min: 20, fit: true }); + const store = MockStore.default(); + MockStore.addSpecs([ + MockGlobalSpec.axis({ + id: 'y a', + groupId: 'a', + position: Position.Left, + domain: { min: 20, fit: true }, + }), + MockSeriesSpec.area(DEMO_AREA_SPEC_1), + ], store); const attemptToMerge = () => { - mergeYDomain( - specDataSeries, - [ - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Linear, - groupId, - id: 'a', - stackAccessors: ['a'], - }, - ], - domainsByGroupId, - ); + computeSeriesDomainsSelector(store.getState()); }; const errorMessage = 'custom yDomain for a is invalid, custom min is greater than computed max'; expect(attemptToMerge).toThrowError(errorMessage); }); test('Should merge Y domain accounting for custom domain limits: partial upper bounded domain', () => { - const groupId = 'a'; - const dataSeries = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 2 }, - { x: 2, y1: 2 }, - { x: 3, y1: 2 }, - { x: 4, y1: 5 }, - ], - [ - { x: 1, y1: 2 }, - { x: 4, y1: 7 }, - ], - ], - { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', - }, - ); - const specDataSeries = new Map(); - specDataSeries.set('a', dataSeries); - const domainsByGroupId = new Map(); - domainsByGroupId.set(groupId, { max: 20, fit: true }); + const store = MockStore.default(); + MockStore.addSpecs([ + MockGlobalSpec.axis({ + id: 'y a', + groupId: 'a', + position: Position.Left, + domain: { max: 20, fit: true }, + }), + MockSeriesSpec.line(DEMO_AREA_SPEC_1), + ], store); - const mergedDomain = mergeYDomain( - specDataSeries, - [ - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Linear, - groupId, - id: 'a', - stackAccessors: ['a'], - }, - ], - domainsByGroupId, - ); - expect(mergedDomain).toEqual([ + + const { yDomain } = computeSeriesDomainsSelector(store.getState()); + expect(yDomain).toEqual([ { type: 'yDomain', - groupId, + groupId: 'a', domain: [2, 20], scaleType: ScaleType.Linear, isBandScale: false, @@ -754,112 +463,40 @@ describe('Y Domain', () => { ]); }); test('Should not merge Y domain with invalid custom domain limits: partial upper bounded domain', () => { - const groupId = 'a'; - const dataSeries = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 2 }, - { x: 2, y1: 2 }, - { x: 3, y1: 2 }, - { x: 4, y1: 5 }, - ], - [ - { x: 1, y1: 2 }, - { x: 4, y1: 7 }, - ], - ], - { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', - }, - ); - const specDataSeries = new Map(); - specDataSeries.set('a', dataSeries); - const domainsByGroupId = new Map(); - domainsByGroupId.set(groupId, { max: -1, fit: true }); + const store = MockStore.default(); + MockStore.addSpecs([ + MockGlobalSpec.axis({ + id: 'y a', + groupId: 'a', + position: Position.Left, + domain: { max: -1, fit: true }, + }), + MockSeriesSpec.area(DEMO_AREA_SPEC_1), + ], store); const attemptToMerge = () => { - mergeYDomain( - specDataSeries, - [ - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Linear, - groupId, - id: 'a', - stackAccessors: ['a'], - }, - ], - domainsByGroupId, - ); + computeSeriesDomainsSelector(store.getState()); }; const errorMessage = 'custom yDomain for a is invalid, computed min is greater than custom max'; expect(attemptToMerge).toThrowError(errorMessage); }); test('Should merge Y domain with stacked as percentage', () => { - const dataSeries1 = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 2 }, - { x: 2, y1: 2 }, - { x: 3, y1: 2 }, - { x: 4, y1: 5 }, - ], - [ - { x: 1, y1: 2 }, - { x: 4, y1: 7 }, - ], - ], - { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', - }, - ); - const dataSeries2 = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 10 }, - { x: 2, y1: 10 }, - { x: 3, y1: 2 }, - { x: 4, y1: 5 }, - ], - ], - { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', - }, - ); - const specDataSeries = new Map(); - specDataSeries.set('a', dataSeries1); - specDataSeries.set('b', dataSeries2); - const mergedDomain = mergeYDomain( - specDataSeries, - [ - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Linear, - groupId: 'a', - id: 'a', - stackAccessors: ['a'], - stackAsPercentage: true, - }, - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Log, - groupId: 'a', - id: 'b', - }, - ], - domainGroup, - ); - expect(mergedDomain).toEqual([ + const store = MockStore.default(); + MockStore.addSpecs([ + MockSeriesSpec.area({ + ...DEMO_AREA_SPEC_1, + stackMode: StackMode.Percentage, + }), + MockSeriesSpec.area({ + ...DEMO_AREA_SPEC_2, + groupId: 'a', + }), + ], store); + + + const { yDomain } = computeSeriesDomainsSelector(store.getState()); + expect(yDomain).toEqual([ { groupId: 'a', domain: [0, 1], @@ -870,50 +507,24 @@ describe('Y Domain', () => { ]); }); test('Should merge Y domain with as percentage regadless of custom domains', () => { - const groupId = 'a'; - const dataSeries = MockRawDataSeries.fromData( - [ - [ - { x: 1, y1: 2 }, - { x: 2, y1: 2 }, - { x: 3, y1: 2 }, - { x: 4, y1: 5 }, - ], - [ - { x: 1, y1: 2 }, - { x: 4, y1: 7 }, - ], - ], - { - specId: 'a', - yAccessor: 'y1', - seriesKeys: [''], - key: '', - }, - ); - const specDataSeries = new Map(); - specDataSeries.set('a', dataSeries); - const domainsByGroupId = new Map(); - domainsByGroupId.set(groupId, { min: 2, max: 20, fit: true }); - - const mergedDomain = mergeYDomain( - specDataSeries, - [ - { - seriesType: SeriesTypes.Area, - yScaleType: ScaleType.Linear, - groupId, - id: 'a', - stackAccessors: ['a'], - stackAsPercentage: true, - }, - ], - domainsByGroupId, - ); - expect(mergedDomain).toEqual([ + const store = MockStore.default(); + MockStore.addSpecs([ + MockGlobalSpec.axis({ + id: 'y a', + groupId: 'a', + position: Position.Left, + domain: { min: 2, max: 20, fit: true }, + }), + MockSeriesSpec.area({ + ...DEMO_AREA_SPEC_1, + stackMode: StackMode.Percentage, + }), + ], store); + const { yDomain } = computeSeriesDomainsSelector(store.getState()); + expect(yDomain).toEqual([ { type: 'yDomain', - groupId, + groupId: 'a', domain: [0, 1], scaleType: ScaleType.Linear, isBandScale: false, diff --git a/src/chart_types/xy_chart/domains/y_domain.ts b/src/chart_types/xy_chart/domains/y_domain.ts index 6406a30320..bf8f2f0e99 100644 --- a/src/chart_types/xy_chart/domains/y_domain.ts +++ b/src/chart_types/xy_chart/domains/y_domain.ts @@ -17,32 +17,34 @@ * under the License. */ -import { sum } from 'd3-array'; - import { ScaleContinuousType } from '../../../scales'; import { ScaleType } from '../../../scales/constants'; import { identity } from '../../../utils/commons'; import { computeContinuousDataDomain } from '../../../utils/domain'; -import { GroupId, SpecId } from '../../../utils/ids'; +import { GroupId } from '../../../utils/ids'; +import { Logger } from '../../../utils/logger'; import { isCompleteBound, isLowerBound, isUpperBound } from '../utils/axis_type_utils'; -import { RawDataSeries } from '../utils/series'; -import { BasicSeriesSpec, YDomainRange, DEFAULT_GLOBAL_ID, SeriesTypes } from '../utils/specs'; +import { DataSeries, FormattedDataSeries } from '../utils/series'; +import { BasicSeriesSpec, YDomainRange, DEFAULT_GLOBAL_ID, SeriesTypes, StackMode } from '../utils/specs'; import { YDomain } from './types'; export type YBasicSeriesSpec = Pick< BasicSeriesSpec, 'id' | 'seriesType' | 'yScaleType' | 'groupId' | 'stackAccessors' | 'yScaleToDataExtent' | 'useDefaultGroupDomain' -> & { stackAsPercentage?: boolean; enableHistogramMode?: boolean }; +> & { stackMode?: StackMode; enableHistogramMode?: boolean }; interface GroupSpecs { - isPercentageStack: boolean; + stackMode?: StackMode; stacked: YBasicSeriesSpec[]; nonStacked: YBasicSeriesSpec[]; } /** @internal */ export function mergeYDomain( - dataSeries: Map, + { stacked, nonStacked }:{ + stacked: FormattedDataSeries[], + nonStacked: FormattedDataSeries[], + }, specs: YBasicSeriesSpec[], domainsByGroupId: Map, ): YDomain[] { @@ -53,7 +55,15 @@ export function mergeYDomain( const yDomains = specsByGroupIdsEntries.map(([groupId, groupSpecs]) => { const customDomain = domainsByGroupId.get(groupId); - return mergeYDomainForGroup(dataSeries, groupId, groupSpecs, customDomain); + const emptyDS: FormattedDataSeries = { + dataSeries: [], + groupId, + counts: { area: 0, bubble: 0, bar: 0, line: 0 }, + }; + const stackedDS = stacked.find((d) => (d.groupId === groupId)) ?? emptyDS; + const nonStackedDS = nonStacked.find((d) => (d.groupId === groupId)) ?? emptyDS; + const nonZeroBaselineSpecs = stackedDS.counts.bar + stackedDS.counts.area + nonStackedDS.counts.bar + nonStackedDS.counts.area; + return mergeYDomainForGroup(stackedDS.dataSeries, nonStackedDS.dataSeries, groupId, groupSpecs, nonZeroBaselineSpecs > 0, customDomain); }); const globalGroupIds: Set = specs.reduce>((acc, { groupId, useDefaultGroupDomain }) => { @@ -81,16 +91,18 @@ export function mergeYDomain( } function mergeYDomainForGroup( - dataSeries: Map, + stacked: DataSeries[], + nonStacked: DataSeries[], groupId: GroupId, groupSpecs: GroupSpecs, + hasZeroBaselineSpecs: boolean, customDomain?: YDomainRange, ): YDomain { const groupYScaleType = coerceYScaleTypes([...groupSpecs.stacked, ...groupSpecs.nonStacked]); - const { isPercentageStack } = groupSpecs; + const { stackMode } = groupSpecs; let domain: number[]; - if (isPercentageStack) { + if (stackMode === StackMode.Percentage) { domain = computeContinuousDataDomain([0, 1], identity, customDomain); } else { // TODO remove when removing yScaleToDataExtent @@ -102,12 +114,10 @@ function mergeYDomainForGroup( } // compute stacked domain - const stackedDataSeries = getDataSeriesOnGroup(dataSeries, groupSpecs.stacked); - const stackedDomain = computeYStackedDomain(stackedDataSeries); + const stackedDomain = computeYDomain(stacked, hasZeroBaselineSpecs); // compute non stacked domain - const nonStackedDataSeries = getDataSeriesOnGroup(dataSeries, groupSpecs.nonStacked); - const nonStackedDomain = computeYNonStackedDomain(nonStackedDataSeries); + const nonStackedDomain = computeYDomain(nonStacked, hasZeroBaselineSpecs); // merge stacked and non stacked domain together domain = computeContinuousDataDomain( @@ -144,46 +154,12 @@ function mergeYDomainForGroup( }; } -/** @internal */ -export function getDataSeriesOnGroup( - dataSeries: Map, - specs: YBasicSeriesSpec[], -): RawDataSeries[] { - return specs.reduce((acc, spec) => { - const ds = dataSeries.get(spec.id) || []; - return [...acc, ...ds]; - }, [] as RawDataSeries[]); -} - -function computeYStackedDomain(dataseries: RawDataSeries[]): number[] { - const stackMap = new Map(); - dataseries.forEach((ds, index) => { - ds.data.forEach((datum) => { - const stack = stackMap.get(datum.x) || []; - stack[index] = datum.y1; - stackMap.set(datum.x, stack); - }); - }); - const dataValues = []; - // eslint-disable-next-line no-restricted-syntax - for (const stackValues of stackMap) { - dataValues.push(...stackValues[1]); - if (stackValues[1].length > 1) { - dataValues.push(sum(stackValues[1])); - } - } - if (dataValues.length === 0) { - return []; - } - return computeContinuousDataDomain(dataValues, identity, null); -} - -function computeYNonStackedDomain(dataseries: RawDataSeries[]) { +function computeYDomain(dataseries: DataSeries[], hasZeroBaselineSpecs: boolean) { const yValues = new Set(); dataseries.forEach((ds) => { ds.data.forEach((datum) => { yValues.add(datum.y1); - if (datum.y0 != null) { + if (hasZeroBaselineSpecs && datum.y0 != null) { yValues.add(datum.y0); } }); @@ -198,16 +174,19 @@ function computeYNonStackedDomain(dataseries: RawDataSeries[]) { export function splitSpecsByGroupId(specs: YBasicSeriesSpec[]) { const specsByGroupIds = new Map< GroupId, - { isPercentageStack: boolean; stacked: YBasicSeriesSpec[]; nonStacked: YBasicSeriesSpec[] } + { stackMode: StackMode | undefined; stacked: YBasicSeriesSpec[]; nonStacked: YBasicSeriesSpec[] } >(); // After mobx->redux https://github.com/elastic/elastic-charts/pull/281 we keep the specs untouched on mount // in MobX version, the stackAccessors was programmatically added to every histogram specs // in ReduX version, we left untouched the specs, so we have to manually check that - const isHistogramEnabled = specs.some(({ seriesType, enableHistogramMode }) => seriesType === SeriesTypes.Bar && enableHistogramMode); - // split each specs by groupId and by stacked or not + const isHistogramEnabled = specs.some( + ({ seriesType, enableHistogramMode }) => + seriesType === SeriesTypes.Bar && enableHistogramMode + ); + // split each specs by groupId and by stacked or not specs.forEach((spec) => { const group = specsByGroupIds.get(spec.groupId) || { - isPercentageStack: false, + stackMode: undefined, stacked: [], nonStacked: [], }; @@ -221,8 +200,12 @@ export function splitSpecsByGroupId(specs: YBasicSeriesSpec[]) { } else { group.nonStacked.push(spec); } - if (spec.stackAsPercentage === true) { - group.isPercentageStack = true; + if (group.stackMode === undefined && spec.stackMode !== undefined) { + group.stackMode = spec.stackMode; + } + if (spec.stackMode !== undefined && group.stackMode !== undefined && group.stackMode !== spec.stackMode) { + Logger.warn(`Is not possible to mix different stackModes, please align all stackMode on the same GroupId + to the same mode. The default behaviour will be to use the first encountered stackMode on the series`); } specsByGroupIds.set(spec.groupId, group); }); diff --git a/src/chart_types/xy_chart/renderer/canvas/areas.ts b/src/chart_types/xy_chart/renderer/canvas/areas.ts index be2efa875b..8710b84161 100644 --- a/src/chart_types/xy_chart/renderer/canvas/areas.ts +++ b/src/chart_types/xy_chart/renderer/canvas/areas.ts @@ -87,10 +87,10 @@ function renderArea( highlightedLegendItem: LegendItem | null, clippings: Rect, ) { - const { area, color, transform, seriesIdentifier, seriesAreaStyle, clippedRanges } = glyph; + const { area, color, transform, seriesIdentifier, seriesAreaStyle, clippedRanges, hideClippedRanges } = glyph; const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, highlightedLegendItem, sharedStyle); const fill = buildAreaStyles(color, seriesAreaStyle, geometryStateStyle); - renderAreaPath(ctx, transform.x, area, fill, clippedRanges, clippings); + renderAreaPath(ctx, transform.x, area, fill, clippedRanges, clippings, hideClippedRanges); } function renderAreaLines( @@ -100,8 +100,8 @@ function renderAreaLines( highlightedLegendItem: LegendItem | null, clippings: Rect, ) { - const { lines, color, seriesIdentifier, transform, seriesAreaLineStyle, clippedRanges } = glyph; + const { lines, color, seriesIdentifier, transform, seriesAreaLineStyle, clippedRanges, hideClippedRanges } = glyph; const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, highlightedLegendItem, sharedStyle); const stroke = buildLineStyles(color, seriesAreaLineStyle, geometryStateStyle); - renderLinePaths(ctx, transform.x, lines, stroke, clippedRanges, clippings); + renderLinePaths(ctx, transform.x, lines, stroke, clippedRanges, clippings, hideClippedRanges); } diff --git a/src/chart_types/xy_chart/renderer/canvas/lines.ts b/src/chart_types/xy_chart/renderer/canvas/lines.ts index 0e5d75f974..4a38acda3f 100644 --- a/src/chart_types/xy_chart/renderer/canvas/lines.ts +++ b/src/chart_types/xy_chart/renderer/canvas/lines.ts @@ -72,8 +72,8 @@ function renderLine( sharedStyle: SharedGeometryStateStyle, clippings: Rect, ) { - const { color, transform, seriesIdentifier, seriesLineStyle, clippedRanges } = line; + const { color, transform, seriesIdentifier, seriesLineStyle, clippedRanges, hideClippedRanges } = line; const geometryStyle = getGeometryStateStyle(seriesIdentifier, highlightedLegendItem, sharedStyle); const stroke = buildLineStyles(color, seriesLineStyle, geometryStyle); - renderLinePaths(ctx, transform.x, [line.line], stroke, clippedRanges, clippings); + renderLinePaths(ctx, transform.x, [line.line], stroke, clippedRanges, clippings, hideClippedRanges); } diff --git a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts index f7c9790050..399ca82e3d 100644 --- a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts +++ b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts @@ -25,21 +25,26 @@ import { MIN_STROKE_WIDTH } from './line'; /** @internal */ export function renderLinePaths( - ctx: CanvasRenderingContext2D, + context: CanvasRenderingContext2D, transformX: number, linePaths: Array, stroke: Stroke, clippedRanges: ClippedRanges, clippings: Rect, + hideClippedRanges = false, ) { - ctx.translate(transformX, 0); if (clippedRanges.length > 0) { - withClipRanges(ctx, clippedRanges, clippings, false, (ctx) => { + withClipRanges(context, clippedRanges, clippings, false, (ctx) => { + ctx.translate(transformX, 0); linePaths.forEach((path) => { renderPathStroke(ctx, path, stroke); }); }); - withClipRanges(ctx, clippedRanges, clippings, true, (ctx) => { + if (hideClippedRanges) { + return; + } + withClipRanges(context, clippedRanges, clippings, true, (ctx) => { + ctx.translate(transformX, 0); linePaths.forEach((path) => { renderPathStroke(ctx, path, { ...stroke, dash: [5, 5] }); }); @@ -47,8 +52,9 @@ export function renderLinePaths( return; } - linePaths.forEach((path) => { - withContext(ctx, (ctx) => { + withContext(context, (ctx) => { + ctx.translate(transformX, 0); + linePaths.forEach((path) => { renderPathStroke(ctx, path, stroke); }); }); @@ -62,12 +68,16 @@ export function renderAreaPath( fill: Fill, clippedRanges: ClippedRanges, clippings: Rect, + hideClippedRanges = false, ) { if (clippedRanges.length > 0) { withClipRanges(ctx, clippedRanges, clippings, false, (ctx) => { ctx.translate(transformX, 0); renderPathFill(ctx, area, fill); }); + if (hideClippedRanges) { + return; + } withClipRanges(ctx, clippedRanges, clippings, true, (ctx) => { ctx.translate(transformX, 0); const { opacity } = fill.color; diff --git a/src/chart_types/xy_chart/rendering/rendering.areas.test.ts b/src/chart_types/xy_chart/rendering/rendering.areas.test.ts index dc64506ff5..e423f86da5 100644 --- a/src/chart_types/xy_chart/rendering/rendering.areas.test.ts +++ b/src/chart_types/xy_chart/rendering/rendering.areas.test.ts @@ -27,7 +27,7 @@ import { LIGHT_THEME } from '../../../utils/themes/light_theme'; import { computeSeriesDomains } from '../state/utils/utils'; import { IndexedGeometryMap } from '../utils/indexed_geometry_map'; import { computeXScale, computeYScales } from '../utils/scales'; -import { AreaSeriesSpec, SeriesTypes } from '../utils/specs'; +import { AreaSeriesSpec, SeriesTypes, StackMode } from '../utils/specs'; import { renderArea } from './rendering'; const SPEC_ID = 'spec_1'; @@ -1136,7 +1136,7 @@ describe('Rendering points - areas', () => { xScaleType: ScaleType.Time, yScaleType: ScaleType.Linear, stackAccessors: [0], - stackAsPercentage: true, + stackMode: StackMode.Percentage, }); const pointSeriesSpec2: AreaSeriesSpec = MockSeriesSpec.area({ id: 'spec_2', @@ -1149,25 +1149,25 @@ describe('Rendering points - areas', () => { xScaleType: ScaleType.Time, yScaleType: ScaleType.Linear, stackAccessors: [0], - stackAsPercentage: true, + stackMode: StackMode.Percentage, }); const pointSeriesDomains = computeSeriesDomains([pointSeriesSpec1, pointSeriesSpec2]); - expect(pointSeriesDomains.formattedDataSeries.stacked[0].dataSeries[0].data).toEqual([ + expect(pointSeriesDomains.formattedDataSeries.stacked[0].dataSeries[0].data).toMatchObject([ { datum: [1546300800000, 0], initialY0: null, initialY1: 0, x: 1546300800000, - y0: null, + y0: 0, y1: 0, mark: null, }, { datum: [1546387200000, 5], initialY0: null, - initialY1: 0.7142857142857143, + initialY1: 5, x: 1546387200000, - y0: null, + y0: 0, y1: 0.7142857142857143, mark: null, }, @@ -1199,14 +1199,14 @@ describe('Rendering points - areas', () => { stackAccessors: [0], }); const pointSeriesDomains = computeSeriesDomains([pointSeriesSpec1, pointSeriesSpec2]); - expect(pointSeriesDomains.formattedDataSeries.stacked[0].dataSeries[0].data).toEqual([ + expect(pointSeriesDomains.formattedDataSeries.stacked[0].dataSeries[0].data).toMatchObject([ { datum: [1546300800000, null], initialY0: null, initialY1: null, x: 1546300800000, - y0: null, - y1: null, + y0: 0, + y1: 0, mark: null, }, { @@ -1214,7 +1214,7 @@ describe('Rendering points - areas', () => { initialY0: null, initialY1: 5, x: 1546387200000, - y0: null, + y0: 0, y1: 5, mark: null, }, @@ -1226,7 +1226,7 @@ describe('Rendering points - areas', () => { initialY0: null, initialY1: 3, x: 1546300800000, - y0: null, + y0: 0, y1: 3, mark: null, }, @@ -1235,8 +1235,8 @@ describe('Rendering points - areas', () => { initialY0: null, initialY1: null, x: 1546387200000, - y0: null, - y1: null, + y0: 5, + y1: 5, mark: null, }, ]); diff --git a/src/chart_types/xy_chart/rendering/rendering.test.ts b/src/chart_types/xy_chart/rendering/rendering.test.ts index 23df759dd7..9fa6efbc14 100644 --- a/src/chart_types/xy_chart/rendering/rendering.test.ts +++ b/src/chart_types/xy_chart/rendering/rendering.test.ts @@ -386,6 +386,7 @@ describe('Rendering utils', () => { describe('getClippedRanges', () => { const dataSeries = MockDataSeries.fitFunction({ shuffle: false }); + const xScale = MockScale.default({ scale: jest.fn().mockImplementation((x) => x), bandwidth: 0, diff --git a/src/chart_types/xy_chart/rendering/rendering.ts b/src/chart_types/xy_chart/rendering/rendering.ts index 75589745c9..f002b692c0 100644 --- a/src/chart_types/xy_chart/rendering/rendering.ts +++ b/src/chart_types/xy_chart/rendering/rendering.ts @@ -23,7 +23,7 @@ import { LegendItem } from '../../../commons/legend'; import { Scale } from '../../../scales'; import { ScaleType } from '../../../scales/constants'; import { isLogarithmicScale } from '../../../scales/types'; -import { MarkBuffer } from '../../../specs'; +import { MarkBuffer, StackMode } from '../../../specs'; import { CanvasTextBBoxCalculator } from '../../../utils/bbox/canvas_text_bbox_calculator'; import { mergePartial, Color, getDistance } from '../../../utils/commons'; import { CurveType, getCurveFactory } from '../../../utils/curves'; @@ -57,6 +57,22 @@ export interface MarkSizeOptions { ratio?: number; } +/** + * Returns value of `y1` or `filled.y1` or null + * @internal + */ +export const getYValue = ({ y1, filled }: DataSeriesDatum): number | null => { + if (y1 !== null) { + return y1; + } + + if (filled && (filled.y1 !== undefined)) { + return filled.y1; + } + + return null; +}; + /** @internal */ export function getPointStyleOverrides( datum: DataSeriesDatum, @@ -156,6 +172,7 @@ function renderPoints( markSizeOptions: MarkSizeOptions, styleAccessor?: PointStyleAccessor, spatial = false, + stackMode?: StackMode, ): { pointGeometries: PointGeometry[]; indexedGeometryMap: IndexedGeometryMap; @@ -167,9 +184,13 @@ function renderPoints( : () => 0; const geometryType = spatial ? GeometryType.spatial : GeometryType.linear; const pointGeometries = dataSeries.data.reduce((acc, datum) => { - const { x: xValue, y0, y1, initialY0, initialY1, filled, mark } = datum; - // don't create the point if not within the xScale domain or it that point was filled - if (!xScale.isValueInDomain(xValue) || (filled && filled.y1 !== undefined)) { + const { x: xValue, y0, y1, mark } = datum; + // don't create the point if not within the xScale domain + if (!xScale.isValueInDomain(xValue)) { + return acc; + } + // don't create the point if it that point was filled + if (isDatumFilled(datum)) { return acc; } const x = xScale.scale(xValue); @@ -199,8 +220,7 @@ function renderPoints( if (y === null) { return acc; } - - const originalY = hasY0Accessors && index === 0 ? initialY0 : initialY1; + const originalY = getDatumYValue(datum, index === 0, hasY0Accessors, stackMode); const seriesIdentifier: XYChartSeriesIdentifier = { key: dataSeries.key, specId: dataSeries.specId, @@ -242,6 +262,35 @@ function renderPoints( }; } +/** + * Get the original/initial Y value from the datum + * @param datum a DataSeriesDatum + * @param lookingForY0 if we are interested in the y0 value, false for y1 + * @param isBandChart if the chart is a band chart + * @param stackMode an optional stack mode + */ +function getDatumYValue( + { y1, y0, initialY1, initialY0 }: DataSeriesDatum, + lookingForY0: boolean, + isBandChart: boolean, + stackMode?: StackMode +) { + if (isBandChart) { + return stackMode === StackMode.Percentage + // on band stacked charts in percentage mode, the values I'm looking for are the percentage value + // that are already computed and available on y0 and y1 + ? (lookingForY0 ? y0 : y1) + // in all other cases for band charts, I want to get back the original/initial value of y0 and y1 + // not the computed value + : (lookingForY0 ? initialY0 : initialY1); + } + // if not a band chart get use the original/initial value in every case except for stack as percentage + // in this case, we should take the difference between the bottom position of the bar and the top position + // of the bar + return stackMode === StackMode.Percentage ? (y1 ?? 0) - (y0 ?? 0) : initialY1; +} + + /** @internal */ export function renderBars( orderIndex: number, @@ -253,6 +302,7 @@ export function renderBars( displayValueSettings?: DisplayValueSpec, styleAccessor?: BarStyleAccessor, minBarHeight?: number, + stackMode?: StackMode, ): { barGeometries: BarGeometry[]; indexedGeometryMap: IndexedGeometryMap; @@ -323,9 +373,9 @@ export function renderBars( const x = xScaled + xScale.bandwidth * orderIndex; const width = xScale.bandwidth; - + const originalY1Value = stackMode === StackMode.Percentage ? (y1 - (y0 ?? 0)) : initialY1; const formattedDisplayValue = displayValueSettings && displayValueSettings.valueFormatter - ? displayValueSettings.valueFormatter(initialY1) + ? displayValueSettings.valueFormatter(originalY1Value) : undefined; // only show displayValue for even bars if showOverlappingValue @@ -370,7 +420,7 @@ export function renderBars( color, value: { x: datum.x, - y: initialY1, + y: originalY1Value, mark: null, accessor: BandedAccessorType.Y1, }, @@ -441,7 +491,7 @@ export function renderLine( pointStyleAccessor, ); - const clippedRanges = hasFit && !hasY0Accessors ? getClippedRanges(dataSeries.data, xScale, xScaleOffset) : []; + const clippedRanges = getClippedRanges(dataSeries.data, xScale, xScaleOffset); let linePath: string; try { @@ -469,6 +519,7 @@ export function renderLine( seriesLineStyle: seriesStyle.line, seriesPointStyle: seriesStyle.point, clippedRanges, + hideClippedRanges: !hasFit, }; return { lineGeometry, @@ -523,21 +574,6 @@ export function renderBubble( }; } -/** - * Returns value of `y1` or `filled.y1` or null - * @internal - */ -export const getYValue = ({ y1, filled }: DataSeriesDatum): number | null => { - if (y1 !== null) { - return y1; - } - - if (filled && filled.y1 !== undefined) { - return filled.y1; - } - - return null; -}; /** @internal */ export function renderArea( @@ -554,6 +590,7 @@ export function renderArea( isStacked = false, pointStyleAccessor?: PointStyleAccessor, hasFit?: boolean, + stackMode?: StackMode ): { areaGeometry: AreaGeometry; indexedGeometryMap: IndexedGeometryMap; @@ -582,7 +619,8 @@ export function renderArea( }) .curve(getCurveFactory(curve)); - const clippedRanges = hasFit && !hasY0Accessors && !isStacked ? getClippedRanges(dataSeries.data, xScale, xScaleOffset) : []; + const clippedRanges = getClippedRanges(dataSeries.data, xScale, xScaleOffset); + let y1Line: string | null; try { @@ -620,6 +658,8 @@ export function renderArea( hasY0Accessors, markSizeOptions, pointStyleAccessor, + false, + stackMode ); let areaPath: string; @@ -652,6 +692,7 @@ export function renderArea( seriesPointStyle: seriesStyle.point, isStacked, clippedRanges, + hideClippedRanges: !hasFit, }; return { areaGeometry, @@ -659,6 +700,15 @@ export function renderArea( }; } +/** + * + * @param param0 + * @internal + */ +export function isDatumFilled({ filled, initialY1 } : DataSeriesDatum) { + return filled?.x !== undefined || filled?.y1 !== undefined || initialY1 === null || initialY1 === undefined; +} + /** * Gets clipped ranges that have been fitted to values * @param dataset @@ -670,14 +720,20 @@ export function getClippedRanges(dataset: DataSeriesDatum[], xScale: Scale, xSca let firstNonNullX: number | null = null; let hasNull = false; - return dataset.reduce((acc, { x, y1 }) => { - const xScaled = xScale.scale(x); + return dataset.reduce((acc, data) => { + const xScaled = xScale.scale(data.x); if (xScaled === null) { return acc; } const xValue = xScaled - xScaleOffset + xScale.bandwidth / 2; - if (y1 !== null) { + if (isDatumFilled(data)) { + const endXValue = xScale.range[1] - xScale.bandwidth * (2 / 3); + if (firstNonNullX !== null && xValue === endXValue) { + acc.push([firstNonNullX, xValue]); + } + hasNull = true; + } else { if (hasNull) { if (firstNonNullX !== null) { acc.push([firstNonNullX, xValue]); @@ -688,12 +744,6 @@ export function getClippedRanges(dataset: DataSeriesDatum[], xScale: Scale, xSca } firstNonNullX = xValue; - } else { - const endXValue = xScale.range[1] - xScale.bandwidth * (2 / 3); - if (firstNonNullX !== null && xValue === endXValue) { - acc.push([firstNonNullX, xValue]); - } - hasNull = true; } return acc; }, []); diff --git a/src/chart_types/xy_chart/specs/bar_series.tsx b/src/chart_types/xy_chart/specs/bar_series.tsx index ab6933e99e..d8d4a1e5bd 100644 --- a/src/chart_types/xy_chart/specs/bar_series.tsx +++ b/src/chart_types/xy_chart/specs/bar_series.tsx @@ -37,7 +37,6 @@ const defaultProps = { yScaleToDataExtent: false, hideInLegend: false, enableHistogramMode: false, - stackAsPercentage: false, }; type SpecRequiredProps = Pick; @@ -55,6 +54,5 @@ export const BarSeries: React.FunctionComponent(defaultProps), ); diff --git a/src/chart_types/xy_chart/state/utils/__snapshots__/utils.test.ts.snap b/src/chart_types/xy_chart/state/utils/__snapshots__/utils.test.ts.snap index f0d329a774..da1db14e80 100644 --- a/src/chart_types/xy_chart/state/utils/__snapshots__/utils.test.ts.snap +++ b/src/chart_types/xy_chart/state/utils/__snapshots__/utils.test.ts.snap @@ -4,9 +4,10 @@ exports[`Chart State utils should compute and format specifications for non stac Array [ Object { "counts": Object { - "areaSeries": 0, - "barSeries": 0, - "lineSeries": 1, + "area": 0, + "bar": 0, + "bubble": 0, + "line": 1, }, "dataSeries": Array [ Object { @@ -20,7 +21,7 @@ Array [ "initialY1": 1, "mark": null, "x": 0, - "y0": 0, + "y0": null, "y1": 1, }, Object { @@ -32,7 +33,7 @@ Array [ "initialY1": 2, "mark": null, "x": 1, - "y0": 0, + "y0": null, "y1": 2, }, Object { @@ -44,7 +45,7 @@ Array [ "initialY1": 10, "mark": null, "x": 2, - "y0": 0, + "y0": null, "y1": 10, }, Object { @@ -56,7 +57,7 @@ Array [ "initialY1": 6, "mark": null, "x": 3, - "y0": 0, + "y0": null, "y1": 6, }, ], @@ -73,9 +74,10 @@ Array [ }, Object { "counts": Object { - "areaSeries": 0, - "barSeries": 0, - "lineSeries": 1, + "area": 0, + "bar": 0, + "bubble": 0, + "line": 1, }, "dataSeries": Array [ Object { @@ -89,7 +91,7 @@ Array [ "initialY1": 1, "mark": null, "x": 0, - "y0": 0, + "y0": null, "y1": 1, }, Object { @@ -101,7 +103,7 @@ Array [ "initialY1": 2, "mark": null, "x": 1, - "y0": 0, + "y0": null, "y1": 2, }, Object { @@ -113,7 +115,7 @@ Array [ "initialY1": 10, "mark": null, "x": 2, - "y0": 0, + "y0": null, "y1": 10, }, Object { @@ -125,7 +127,7 @@ Array [ "initialY1": 6, "mark": null, "x": 3, - "y0": 0, + "y0": null, "y1": 6, }, ], @@ -147,9 +149,10 @@ exports[`Chart State utils should compute and format specifications for stacked Array [ Object { "counts": Object { - "areaSeries": 0, - "barSeries": 0, - "lineSeries": 2, + "area": 0, + "bar": 0, + "bubble": 0, + "line": 2, }, "dataSeries": Array [ Object { @@ -160,11 +163,12 @@ Array [ "x": 0, "y": 1, }, + "filled": undefined, "initialY0": null, "initialY1": 1, "mark": null, "x": 0, - "y0": null, + "y0": 0, "y1": 1, }, Object { @@ -173,11 +177,12 @@ Array [ "x": 1, "y": 2, }, + "filled": undefined, "initialY0": null, "initialY1": 2, "mark": null, "x": 1, - "y0": null, + "y0": 0, "y1": 2, }, Object { @@ -186,11 +191,12 @@ Array [ "x": 2, "y": 3, }, + "filled": undefined, "initialY0": null, "initialY1": 3, "mark": null, "x": 2, - "y0": null, + "y0": 0, "y1": 3, }, Object { @@ -199,11 +205,12 @@ Array [ "x": 3, "y": 4, }, + "filled": undefined, "initialY0": null, "initialY1": 4, "mark": null, "x": 3, - "y0": null, + "y0": 0, "y1": 4, }, ], @@ -226,6 +233,7 @@ Array [ "x": 0, "y": 2, }, + "filled": undefined, "initialY0": null, "initialY1": 2, "mark": null, @@ -239,6 +247,7 @@ Array [ "x": 1, "y": 3, }, + "filled": undefined, "initialY0": null, "initialY1": 3, "mark": null, @@ -252,6 +261,7 @@ Array [ "x": 2, "y": 4, }, + "filled": undefined, "initialY0": null, "initialY1": 4, "mark": null, @@ -265,6 +275,7 @@ Array [ "x": 3, "y": 5, }, + "filled": undefined, "initialY0": null, "initialY1": 5, "mark": null, @@ -286,6 +297,7 @@ Array [ }, ], "groupId": "group2", + "stackMode": undefined, }, ] `; @@ -294,9 +306,10 @@ exports[`Chart State utils should compute and format specifications for stacked Array [ Object { "counts": Object { - "areaSeries": 0, - "barSeries": 0, - "lineSeries": 2, + "area": 0, + "bar": 0, + "bubble": 0, + "line": 2, }, "dataSeries": Array [ Object { @@ -311,7 +324,7 @@ Array [ "initialY1": 1, "mark": null, "x": 0, - "y0": 0, + "y0": null, "y1": 1, }, Object { @@ -324,7 +337,7 @@ Array [ "initialY1": 2, "mark": null, "x": 1, - "y0": 0, + "y0": null, "y1": 2, }, Object { @@ -337,7 +350,7 @@ Array [ "initialY1": 3, "mark": null, "x": 2, - "y0": 0, + "y0": null, "y1": 3, }, Object { @@ -350,7 +363,7 @@ Array [ "initialY1": 4, "mark": null, "x": 3, - "y0": 0, + "y0": null, "y1": 4, }, ], @@ -377,7 +390,7 @@ Array [ "initialY1": 2, "mark": null, "x": 0, - "y0": 0, + "y0": null, "y1": 2, }, Object { @@ -390,7 +403,7 @@ Array [ "initialY1": 3, "mark": null, "x": 1, - "y0": 0, + "y0": null, "y1": 3, }, Object { @@ -403,7 +416,7 @@ Array [ "initialY1": 4, "mark": null, "x": 2, - "y0": 0, + "y0": null, "y1": 4, }, Object { @@ -416,7 +429,7 @@ Array [ "initialY1": 5, "mark": null, "x": 3, - "y0": 0, + "y0": null, "y1": 5, }, ], diff --git a/src/chart_types/xy_chart/state/utils/types.ts b/src/chart_types/xy_chart/state/utils/types.ts index 9dd83e12d2..dd88fcaf9f 100644 --- a/src/chart_types/xy_chart/state/utils/types.ts +++ b/src/chart_types/xy_chart/state/utils/types.ts @@ -22,11 +22,7 @@ import { PointGeometry, BarGeometry, AreaGeometry, LineGeometry, BubbleGeometry import { GroupId } from '../../../../utils/ids'; import { XDomain, YDomain } from '../../domains/types'; import { IndexedGeometryMap } from '../../utils/indexed_geometry_map'; -import { - SeriesCollectionValue, - FormattedDataSeries, - RawDataSeries, -} from '../../utils/series'; +import { SeriesCollectionValue, FormattedDataSeries } from '../../utils/series'; /** @internal */ export interface Transform { @@ -83,7 +79,6 @@ export interface ComputedGeometries { export interface SeriesDomainsAndData { xDomain: XDomain; yDomain: YDomain[]; - splittedDataSeries: RawDataSeries[][]; formattedDataSeries: { stacked: FormattedDataSeries[]; nonStacked: FormattedDataSeries[]; diff --git a/src/chart_types/xy_chart/state/utils/utils.ts b/src/chart_types/xy_chart/state/utils/utils.ts index e63dcac6db..ee51783b2a 100644 --- a/src/chart_types/xy_chart/state/utils/utils.ts +++ b/src/chart_types/xy_chart/state/utils/utils.ts @@ -19,6 +19,7 @@ import { SeriesKey, SeriesIdentifier } from '../../../../commons/series_id'; import { Scale } from '../../../../scales'; +import { ScaleType } from '../../../../scales/constants'; import { identity, mergePartial, Rotation, Color, isUniqueArray } from '../../../../utils/commons'; import { CurveType } from '../../../../utils/curves'; import { Dimensions } from '../../../../utils/dimensions'; @@ -29,7 +30,8 @@ import { ColorConfig, Theme } from '../../../../utils/themes/theme'; import { XDomain, YDomain } from '../../domains/types'; import { mergeXDomain } from '../../domains/x_domain'; import { mergeYDomain } from '../../domains/y_domain'; -import { renderArea, renderBars, renderLine, renderBubble } from '../../rendering/rendering'; +import { renderArea, renderBars, renderLine, renderBubble, isDatumFilled } from '../../rendering/rendering'; +import { fillSeries } from '../../utils/fill_series'; import { IndexedGeometryMap } from '../../utils/indexed_geometry_map'; import { computeXScale, computeYScales, countBarsInCluster } from '../../utils/scales'; import { @@ -38,7 +40,7 @@ import { getSeriesIndex, FormattedDataSeries, getFormattedDataseries, - getSplittedSeries, + getDataSeriesBySpecId, getSeriesKey, XYChartSeriesIdentifier, } from '../../utils/series'; @@ -56,6 +58,8 @@ import { FitConfig, isBubbleSeriesSpec, YDomainRange, + SeriesTypes, + StackMode, } from '../../utils/specs'; import { getSpecsById, getAxesSpecForSpecId } from './spec'; import { SeriesDomainsAndData, ComputedGeometries, GeometriesCounts, Transform, LastValues } from './types'; @@ -132,33 +136,50 @@ function getLastValues(formattedDataSeries: { const lastValues = new Map(); // we need to get the latest - formattedDataSeries.stacked.forEach((ds) => { - ds.dataSeries.forEach((series) => { + formattedDataSeries.stacked.forEach(({ dataSeries, stackMode }) => { + dataSeries.forEach((series) => { + if (series.data.length === 0) { + return; + } + const last = series.data[series.data.length - 1]; + if (!last) { + return; + } + if (isDatumFilled(last)) { + return; + } + + const { y0, y1, initialY0, initialY1 } = last; const seriesKey = getSeriesKey(series as XYChartSeriesIdentifier); - if (series.data.length > 0) { - const last = series.data[series.data.length - 1]; - if (last !== null) { - const { initialY1: y1, initialY0: y0 } = last; - - if (!last.filled && (y1 !== null || y0 !== null)) { - lastValues.set(seriesKey, { y0, y1 }); - } - } + + if (stackMode === StackMode.Percentage) { + const y1InPercentage = y1 === null || y0 === null ? null : y1 - y0; + lastValues.set(seriesKey, { y0, y1: y1InPercentage }); + return; + } + if (initialY0 !== null || initialY1 !== null) { + lastValues.set(seriesKey, { y0: initialY0, y1: initialY1 }); } }); }); - formattedDataSeries.nonStacked.forEach((ds) => { - ds.dataSeries.forEach((series) => { - const seriesKey = getSeriesKey(series as XYChartSeriesIdentifier); - if (series.data.length > 0) { - const last = series.data[series.data.length - 1]; - if (last !== null) { - const { initialY1: y1, initialY0: y0 } = last; - if (y1 !== null || y0 !== null) { - lastValues.set(seriesKey, { y0, y1 }); - } - } + + formattedDataSeries.nonStacked.forEach(({ dataSeries }) => { + dataSeries.forEach((series) => { + if (series.data.length === 0) { + return; + } + const last = series.data[series.data.length - 1]; + if (!last) { + return; } + if (isDatumFilled(last)) { + return; + } + + const { initialY1, initialY0 } = last; + const seriesKey = getSeriesKey(series as XYChartSeriesIdentifier); + + lastValues.set(seriesKey, { y0: initialY0, y1: initialY1 }); }); }); return lastValues; @@ -182,27 +203,34 @@ export function computeSeriesDomains( customXDomain?: DomainRange | Domain, ): SeriesDomainsAndData { const { - splittedSeries, - xValues, seriesCollection, + dataSeriesBySpecId, + xValues, + seriesCollection, fallbackScale, - } = getSplittedSeries(seriesSpecs, deselectedDataSeries); - const splittedDataSeries = [...splittedSeries.values()]; - const specsArray = [...seriesSpecs.values()]; + } = getDataSeriesBySpecId(seriesSpecs, deselectedDataSeries); + // compute the x domain merging any custom domain + const specsArray = [...seriesSpecs.values()]; const xDomain = mergeXDomain(specsArray, xValues, customXDomain, fallbackScale); - const yDomain = mergeYDomain(splittedSeries, specsArray, customYDomainsByGroupId); + + // fill series with missing x values + const filledDataSeriesBySpecId = fillSeries(dataSeriesBySpecId, xValues); + const formattedDataSeries = getFormattedDataseries( specsArray, - splittedSeries, + filledDataSeriesBySpecId, xValues, xDomain.scaleType, seriesSpecs, ); + // let's compute the yDomain after computing all stacked values + const yDomain = mergeYDomain(formattedDataSeries, seriesSpecs, customYDomainsByGroupId); + // we need to get the last values from the formatted dataseries // because we change the format if we are on percentage mode - const lastValues = getLastValues(formattedDataSeries); + const lastValues = xDomain.scaleType !== ScaleType.Ordinal ? getLastValues(formattedDataSeries) : new Map(); const updatedSeriesCollection = new Map(); seriesCollection.forEach((value, key) => { const lastValue = lastValues.get(key); @@ -216,7 +244,6 @@ export function computeSeriesDomains( return { xDomain, yDomain, - splittedDataSeries, formattedDataSeries, seriesCollection: updatedSeriesCollection, }; @@ -280,7 +307,7 @@ export function computeSeriesGeometries( }; formattedDataSeries.stacked.forEach((dataSeriesGroup) => { - const { groupId, dataSeries, counts } = dataSeriesGroup; + const { groupId, dataSeries, counts, stackMode } = dataSeriesGroup; const yScale = yScales.get(groupId); if (!yScale) { return; @@ -299,9 +326,9 @@ export function computeSeriesGeometries( axesSpecs, chartTheme, enableHistogramMode, + stackMode, ); - orderIndex = counts.barSeries > 0 ? orderIndex + 1 : orderIndex; - + orderIndex = counts[SeriesTypes.Bar] > 0 ? orderIndex + 1 : orderIndex; areas.push(...geometries.areas); lines.push(...geometries.lines); bars.push(...geometries.bars); @@ -340,7 +367,7 @@ export function computeSeriesGeometries( chartTheme, enableHistogramMode, ); - orderIndex = counts.barSeries > 0 ? orderIndex + counts.barSeries : orderIndex; + orderIndex = counts[SeriesTypes.Bar] > 0 ? orderIndex + counts[SeriesTypes.Bar] : orderIndex; areas.push(...geometries.areas); lines.push(...geometries.lines); @@ -440,6 +467,7 @@ function renderGeometries( axesSpecs: AxisSpec[], chartTheme: Theme, enableHistogramMode: boolean, + stackMode?: StackMode, ): { points: PointGeometry[]; bars: BarGeometry[]; @@ -501,6 +529,7 @@ function renderGeometries( displayValueSettings, spec.styleAccessor, spec.minBarHeight, + stackMode ); indexedGeometryMap.merge(renderedBars.indexedGeometryMap); bars.push(...renderedBars.barGeometries); @@ -554,7 +583,7 @@ function renderGeometries( ratio: chartTheme.markSizeRatio, }, spec.pointStyleAccessor, - Boolean(spec.fit && ((spec.fit as FitConfig).type || spec.fit) !== Fit.None), + hasFitFnConfigured(spec.fit), ); indexedGeometryMap.merge(renderedLines.indexedGeometryMap); lines.push(renderedLines.lineGeometry); @@ -583,7 +612,8 @@ function renderGeometries( }, isStacked, spec.pointStyleAccessor, - Boolean(spec.fit && ((spec.fit as FitConfig).type || spec.fit) !== Fit.None), + hasFitFnConfigured(spec.fit), + stackMode ); indexedGeometryMap.merge(renderedAreas.indexedGeometryMap); areas.push(renderedAreas.areaGeometry); @@ -632,3 +662,7 @@ export function computeChartTransform(chartDimensions: Dimensions, chartRotation rotate: 0, }; } + +function hasFitFnConfigured(fit?: Fit | FitConfig) { + return Boolean(fit && ((fit as FitConfig).type || fit) !== Fit.None); +} diff --git a/src/chart_types/xy_chart/utils/__snapshots__/series.test.ts.snap b/src/chart_types/xy_chart/utils/__snapshots__/series.test.ts.snap index 56b68e2753..ba2414c70e 100644 --- a/src/chart_types/xy_chart/utils/__snapshots__/series.test.ts.snap +++ b/src/chart_types/xy_chart/utils/__snapshots__/series.test.ts.snap @@ -9,6 +9,8 @@ Array [ "x": 0, "y": 1, }, + "initialY0": null, + "initialY1": null, "mark": null, "x": 0, "y0": null, @@ -33,6 +35,8 @@ Array [ "x": 1, "y": 2, }, + "initialY0": null, + "initialY1": null, "mark": null, "x": 1, "y0": null, @@ -57,6 +61,8 @@ Array [ "x": 2, "y": 10, }, + "initialY0": null, + "initialY1": null, "mark": null, "x": 2, "y0": null, @@ -81,6 +87,8 @@ Array [ "x": 3, "y": 6, }, + "initialY0": null, + "initialY1": null, "mark": null, "x": 3, "y0": null, @@ -111,6 +119,8 @@ Array [ "x": 0, "y": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 0, "y0": null, @@ -122,6 +132,8 @@ Array [ "x": 0, "y": 2, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 0, "y0": null, @@ -133,6 +145,8 @@ Array [ "x": 1, "y": 2, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -144,6 +158,8 @@ Array [ "x": 1, "y": 3, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 1, "y0": null, @@ -155,6 +171,8 @@ Array [ "x": 2, "y": 3, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 2, "y0": null, @@ -166,6 +184,8 @@ Array [ "x": 2, "y": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 2, "y0": null, @@ -177,6 +197,8 @@ Array [ "x": 3, "y": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 3, "y0": null, @@ -188,6 +210,8 @@ Array [ "x": 3, "y": 5, }, + "initialY0": null, + "initialY1": 5, "mark": null, "x": 3, "y0": null, @@ -216,6 +240,8 @@ Array [ "x": 0, "y": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 0, "y0": null, @@ -228,6 +254,8 @@ Array [ "x": 1, "y": 2, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -240,6 +268,8 @@ Array [ "x": 2, "y": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 2, "y0": null, @@ -252,6 +282,8 @@ Array [ "x": 3, "y": 6, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 3, "y0": null, @@ -280,6 +312,8 @@ Array [ "x": 0, "y": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 0, "y0": null, @@ -292,6 +326,8 @@ Array [ "x": 1, "y": 2, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -304,6 +340,8 @@ Array [ "x": 2, "y": 2, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 2, "y0": null, @@ -316,6 +354,8 @@ Array [ "x": 3, "y": 6, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 3, "y0": null, @@ -344,6 +384,8 @@ Array [ "x": 0, "y": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 0, "y0": null, @@ -356,6 +398,8 @@ Array [ "x": 1, "y": 2, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -368,6 +412,8 @@ Array [ "x": 2, "y": 3, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 2, "y0": null, @@ -380,6 +426,8 @@ Array [ "x": 3, "y": 6, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 3, "y0": null, @@ -408,6 +456,8 @@ Array [ "x": 0, "y": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 0, "y0": null, @@ -420,6 +470,8 @@ Array [ "x": 1, "y": 2, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -432,6 +484,8 @@ Array [ "x": 2, "y": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 2, "y0": null, @@ -444,6 +498,8 @@ Array [ "x": 3, "y": 6, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 3, "y0": null, @@ -476,6 +532,8 @@ Array [ "y1": 1, "y2": 3, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 0, "y0": null, @@ -487,6 +545,8 @@ Array [ "y1": 2, "y2": 7, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -498,6 +558,8 @@ Array [ "y1": 1, "y2": 2, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 2, "y0": null, @@ -509,6 +571,8 @@ Array [ "y1": 6, "y2": 10, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 3, "y0": null, @@ -531,6 +595,8 @@ Array [ "y1": 1, "y2": 3, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 0, "y0": null, @@ -542,6 +608,8 @@ Array [ "y1": 2, "y2": 7, }, + "initialY0": null, + "initialY1": 7, "mark": null, "x": 1, "y0": null, @@ -553,6 +621,8 @@ Array [ "y1": 1, "y2": 2, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 2, "y0": null, @@ -564,6 +634,8 @@ Array [ "y1": 6, "y2": 10, }, + "initialY0": null, + "initialY1": 10, "mark": null, "x": 3, "y0": null, @@ -592,6 +664,8 @@ Array [ "y1": 1, "y2": 4, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 0, "y0": null, @@ -604,6 +678,8 @@ Array [ "y1": 2, "y2": 1, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -616,6 +692,8 @@ Array [ "y1": 10, "y2": 5, }, + "initialY0": null, + "initialY1": 10, "mark": null, "x": 2, "y0": null, @@ -628,6 +706,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 7, "mark": null, "x": 3, "y0": null, @@ -654,6 +734,8 @@ Array [ "y1": 1, "y2": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 0, "y0": null, @@ -666,6 +748,8 @@ Array [ "y1": 2, "y2": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 1, "y0": null, @@ -678,6 +762,8 @@ Array [ "y1": 10, "y2": 5, }, + "initialY0": null, + "initialY1": 5, "mark": null, "x": 2, "y0": null, @@ -690,6 +776,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 3, "y0": null, @@ -716,6 +804,8 @@ Array [ "y1": 3, "y2": 6, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 0, "y0": null, @@ -728,6 +818,8 @@ Array [ "y1": 2, "y2": 5, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -740,6 +832,8 @@ Array [ "y1": 3, "y2": 1, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 2, "y0": null, @@ -752,6 +846,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 3, "y0": null, @@ -778,6 +874,8 @@ Array [ "y1": 3, "y2": 6, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 0, "y0": null, @@ -790,6 +888,8 @@ Array [ "y1": 2, "y2": 5, }, + "initialY0": null, + "initialY1": 5, "mark": null, "x": 1, "y0": null, @@ -802,6 +902,8 @@ Array [ "y1": 3, "y2": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 2, "y0": null, @@ -814,6 +916,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 3, "y0": null, @@ -846,6 +950,8 @@ Array [ "y1": 1, "y2": 4, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 0, "y0": null, @@ -859,6 +965,8 @@ Array [ "y1": 2, "y2": 1, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -872,6 +980,8 @@ Array [ "y1": 10, "y2": 5, }, + "initialY0": null, + "initialY1": 10, "mark": null, "x": 2, "y0": null, @@ -885,6 +995,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 7, "mark": null, "x": 3, "y0": null, @@ -898,6 +1010,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 7, "mark": null, "x": 6, "y0": null, @@ -927,6 +1041,8 @@ Array [ "y1": 1, "y2": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 0, "y0": null, @@ -940,6 +1056,8 @@ Array [ "y1": 2, "y2": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 1, "y0": null, @@ -953,6 +1071,8 @@ Array [ "y1": 10, "y2": 5, }, + "initialY0": null, + "initialY1": 5, "mark": null, "x": 2, "y0": null, @@ -966,6 +1086,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 3, "y0": null, @@ -979,6 +1101,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 6, "y0": null, @@ -1008,6 +1132,8 @@ Array [ "y1": 1, "y2": 4, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 0, "y0": null, @@ -1021,6 +1147,8 @@ Array [ "y1": 2, "y2": 1, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -1034,6 +1162,8 @@ Array [ "y1": 10, "y2": 5, }, + "initialY0": null, + "initialY1": 10, "mark": null, "x": 2, "y0": null, @@ -1047,6 +1177,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 7, "mark": null, "x": 3, "y0": null, @@ -1060,6 +1192,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 7, "mark": null, "x": 6, "y0": null, @@ -1089,6 +1223,8 @@ Array [ "y1": 1, "y2": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 0, "y0": null, @@ -1102,6 +1238,8 @@ Array [ "y1": 2, "y2": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 1, "y0": null, @@ -1115,6 +1253,8 @@ Array [ "y1": 10, "y2": 5, }, + "initialY0": null, + "initialY1": 5, "mark": null, "x": 2, "y0": null, @@ -1128,6 +1268,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 3, "y0": null, @@ -1141,6 +1283,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 6, "y0": null, @@ -1170,6 +1314,8 @@ Array [ "y1": 3, "y2": 6, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 0, "y0": null, @@ -1183,6 +1329,8 @@ Array [ "y1": 2, "y2": 5, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -1196,6 +1344,8 @@ Array [ "y1": 3, "y2": 1, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 2, "y0": null, @@ -1209,6 +1359,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 3, "y0": null, @@ -1222,6 +1374,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 6, "y0": null, @@ -1251,6 +1405,8 @@ Array [ "y1": 3, "y2": 6, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 0, "y0": null, @@ -1264,6 +1420,8 @@ Array [ "y1": 2, "y2": 5, }, + "initialY0": null, + "initialY1": 5, "mark": null, "x": 1, "y0": null, @@ -1277,6 +1435,8 @@ Array [ "y1": 3, "y2": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 2, "y0": null, @@ -1290,6 +1450,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 3, "y0": null, @@ -1303,6 +1465,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 6, "y0": null, @@ -1332,6 +1496,8 @@ Array [ "y1": 3, "y2": 6, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 0, "y0": null, @@ -1345,6 +1511,8 @@ Array [ "y1": 2, "y2": 5, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -1358,6 +1526,8 @@ Array [ "y1": 3, "y2": 1, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 2, "y0": null, @@ -1371,6 +1541,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 3, "y0": null, @@ -1384,6 +1556,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 6, "y0": null, @@ -1413,6 +1587,8 @@ Array [ "y1": 3, "y2": 6, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 0, "y0": null, @@ -1426,6 +1602,8 @@ Array [ "y1": 2, "y2": 5, }, + "initialY0": null, + "initialY1": 5, "mark": null, "x": 1, "y0": null, @@ -1439,6 +1617,8 @@ Array [ "y1": 3, "y2": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 2, "y0": null, @@ -1452,6 +1632,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 3, "y0": null, @@ -1465,6 +1647,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 6, "y0": null, @@ -1493,9002 +1677,10002 @@ Array [ "data": Array [ Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 0, "mark": null, "x": 0, - "y0": null, + "y0": 0, "y1": 0, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 1, "mark": null, "x": 1, - "y0": null, + "y0": 0, "y1": 1, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 2, "mark": null, "x": 2, - "y0": null, + "y0": 0, "y1": 2, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 3, "mark": null, "x": 3, - "y0": null, + "y0": 0, "y1": 3, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 4, "mark": null, "x": 4, - "y0": null, + "y0": 0, "y1": 4, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 5, "mark": null, "x": 5, - "y0": null, + "y0": 0, "y1": 5, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 6, "mark": null, "x": 6, - "y0": null, + "y0": 0, "y1": 6, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 7, "mark": null, "x": 7, - "y0": null, + "y0": 0, "y1": 7, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 8, "mark": null, "x": 8, - "y0": null, + "y0": 0, "y1": 8, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 9, "mark": null, "x": 9, - "y0": null, + "y0": 0, "y1": 9, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 10, "mark": null, "x": 10, - "y0": null, + "y0": 0, "y1": 10, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 11, "mark": null, "x": 11, - "y0": null, + "y0": 0, "y1": 11, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 12, "mark": null, "x": 12, - "y0": null, + "y0": 0, "y1": 12, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 13, "mark": null, "x": 13, - "y0": null, + "y0": 0, "y1": 13, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 14, "mark": null, "x": 14, - "y0": null, + "y0": 0, "y1": 14, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 15, "mark": null, "x": 15, - "y0": null, + "y0": 0, "y1": 15, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 16, "mark": null, "x": 16, - "y0": null, + "y0": 0, "y1": 16, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 17, "mark": null, "x": 17, - "y0": null, + "y0": 0, "y1": 17, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 18, "mark": null, "x": 18, - "y0": null, + "y0": 0, "y1": 18, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 19, "mark": null, "x": 19, - "y0": null, + "y0": 0, "y1": 19, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 20, "mark": null, "x": 20, - "y0": null, + "y0": 0, "y1": 20, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 21, "mark": null, "x": 21, - "y0": null, + "y0": 0, "y1": 21, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 22, "mark": null, "x": 22, - "y0": null, + "y0": 0, "y1": 22, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 23, "mark": null, "x": 23, - "y0": null, + "y0": 0, "y1": 23, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 24, "mark": null, "x": 24, - "y0": null, + "y0": 0, "y1": 24, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 25, "mark": null, "x": 25, - "y0": null, + "y0": 0, "y1": 25, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 26, "mark": null, "x": 26, - "y0": null, + "y0": 0, "y1": 26, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 27, "mark": null, "x": 27, - "y0": null, + "y0": 0, "y1": 27, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 28, "mark": null, "x": 28, - "y0": null, + "y0": 0, "y1": 28, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 29, "mark": null, "x": 29, - "y0": null, + "y0": 0, "y1": 29, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 30, "mark": null, "x": 30, - "y0": null, + "y0": 0, "y1": 30, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 31, "mark": null, "x": 31, - "y0": null, + "y0": 0, "y1": 31, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 32, "mark": null, "x": 32, - "y0": null, + "y0": 0, "y1": 32, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 33, "mark": null, "x": 33, - "y0": null, + "y0": 0, "y1": 33, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 34, "mark": null, "x": 34, - "y0": null, + "y0": 0, "y1": 34, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 35, "mark": null, "x": 35, - "y0": null, + "y0": 0, "y1": 35, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 36, "mark": null, "x": 36, - "y0": null, + "y0": 0, "y1": 36, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 37, "mark": null, "x": 37, - "y0": null, + "y0": 0, "y1": 37, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 38, "mark": null, "x": 38, - "y0": null, + "y0": 0, "y1": 38, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 39, "mark": null, "x": 39, - "y0": null, + "y0": 0, "y1": 39, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 40, "mark": null, "x": 40, - "y0": null, + "y0": 0, "y1": 40, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 41, "mark": null, "x": 41, - "y0": null, + "y0": 0, "y1": 41, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 42, "mark": null, "x": 42, - "y0": null, + "y0": 0, "y1": 42, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 43, "mark": null, "x": 43, - "y0": null, + "y0": 0, "y1": 43, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 44, "mark": null, "x": 44, - "y0": null, + "y0": 0, "y1": 44, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 45, "mark": null, "x": 45, - "y0": null, + "y0": 0, "y1": 45, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 46, "mark": null, "x": 46, - "y0": null, + "y0": 0, "y1": 46, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 47, "mark": null, "x": 47, - "y0": null, + "y0": 0, "y1": 47, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 48, "mark": null, "x": 48, - "y0": null, + "y0": 0, "y1": 48, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 49, "mark": null, "x": 49, - "y0": null, + "y0": 0, "y1": 49, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 50, "mark": null, "x": 50, - "y0": null, + "y0": 0, "y1": 50, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 51, "mark": null, "x": 51, - "y0": null, + "y0": 0, "y1": 51, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 52, "mark": null, "x": 52, - "y0": null, + "y0": 0, "y1": 52, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 53, "mark": null, "x": 53, - "y0": null, + "y0": 0, "y1": 53, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 54, "mark": null, "x": 54, - "y0": null, + "y0": 0, "y1": 54, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 55, "mark": null, "x": 55, - "y0": null, + "y0": 0, "y1": 55, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 56, "mark": null, "x": 56, - "y0": null, + "y0": 0, "y1": 56, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 57, "mark": null, "x": 57, - "y0": null, + "y0": 0, "y1": 57, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 58, "mark": null, "x": 58, - "y0": null, + "y0": 0, "y1": 58, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 59, "mark": null, "x": 59, - "y0": null, + "y0": 0, "y1": 59, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 60, "mark": null, "x": 60, - "y0": null, + "y0": 0, "y1": 60, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 61, "mark": null, "x": 61, - "y0": null, + "y0": 0, "y1": 61, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 62, "mark": null, "x": 62, - "y0": null, + "y0": 0, "y1": 62, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 63, "mark": null, "x": 63, - "y0": null, + "y0": 0, "y1": 63, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 64, "mark": null, "x": 64, - "y0": null, + "y0": 0, "y1": 64, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 65, "mark": null, "x": 65, - "y0": null, + "y0": 0, "y1": 65, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 66, "mark": null, "x": 66, - "y0": null, + "y0": 0, "y1": 66, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 67, "mark": null, "x": 67, - "y0": null, + "y0": 0, "y1": 67, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 68, "mark": null, "x": 68, - "y0": null, + "y0": 0, "y1": 68, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 69, "mark": null, "x": 69, - "y0": null, + "y0": 0, "y1": 69, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 70, "mark": null, "x": 70, - "y0": null, + "y0": 0, "y1": 70, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 71, "mark": null, "x": 71, - "y0": null, + "y0": 0, "y1": 71, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 72, "mark": null, "x": 72, - "y0": null, + "y0": 0, "y1": 72, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 73, "mark": null, "x": 73, - "y0": null, + "y0": 0, "y1": 73, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 74, "mark": null, "x": 74, - "y0": null, + "y0": 0, "y1": 74, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 75, "mark": null, "x": 75, - "y0": null, + "y0": 0, "y1": 75, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 76, "mark": null, "x": 76, - "y0": null, + "y0": 0, "y1": 76, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 77, "mark": null, "x": 77, - "y0": null, + "y0": 0, "y1": 77, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 78, "mark": null, "x": 78, - "y0": null, + "y0": 0, "y1": 78, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 79, "mark": null, "x": 79, - "y0": null, + "y0": 0, "y1": 79, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 80, "mark": null, "x": 80, - "y0": null, + "y0": 0, "y1": 80, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 81, "mark": null, "x": 81, - "y0": null, + "y0": 0, "y1": 81, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 82, "mark": null, "x": 82, - "y0": null, + "y0": 0, "y1": 82, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 83, "mark": null, "x": 83, - "y0": null, + "y0": 0, "y1": 83, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 84, "mark": null, "x": 84, - "y0": null, + "y0": 0, "y1": 84, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 85, "mark": null, "x": 85, - "y0": null, + "y0": 0, "y1": 85, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 86, "mark": null, "x": 86, - "y0": null, + "y0": 0, "y1": 86, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 87, "mark": null, "x": 87, - "y0": null, + "y0": 0, "y1": 87, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 88, "mark": null, "x": 88, - "y0": null, + "y0": 0, "y1": 88, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 89, "mark": null, "x": 89, - "y0": null, + "y0": 0, "y1": 89, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 90, "mark": null, "x": 90, - "y0": null, + "y0": 0, "y1": 90, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 91, "mark": null, "x": 91, - "y0": null, + "y0": 0, "y1": 91, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 92, "mark": null, "x": 92, - "y0": null, + "y0": 0, "y1": 92, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 93, "mark": null, "x": 93, - "y0": null, + "y0": 0, "y1": 93, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 94, "mark": null, "x": 94, - "y0": null, + "y0": 0, "y1": 94, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 95, "mark": null, "x": 95, - "y0": null, + "y0": 0, "y1": 95, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 96, "mark": null, "x": 96, - "y0": null, + "y0": 0, "y1": 96, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 97, "mark": null, "x": 97, - "y0": null, + "y0": 0, "y1": 97, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 98, "mark": null, "x": 98, - "y0": null, + "y0": 0, "y1": 98, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 99, "mark": null, "x": 99, - "y0": null, + "y0": 0, "y1": 99, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 100, "mark": null, "x": 100, - "y0": null, + "y0": 0, "y1": 100, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 101, "mark": null, "x": 101, - "y0": null, + "y0": 0, "y1": 101, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 102, "mark": null, "x": 102, - "y0": null, + "y0": 0, "y1": 102, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 103, "mark": null, "x": 103, - "y0": null, + "y0": 0, "y1": 103, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 104, "mark": null, "x": 104, - "y0": null, + "y0": 0, "y1": 104, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 105, "mark": null, "x": 105, - "y0": null, + "y0": 0, "y1": 105, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 106, "mark": null, "x": 106, - "y0": null, + "y0": 0, "y1": 106, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 107, "mark": null, "x": 107, - "y0": null, + "y0": 0, "y1": 107, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 108, "mark": null, "x": 108, - "y0": null, + "y0": 0, "y1": 108, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 109, "mark": null, "x": 109, - "y0": null, + "y0": 0, "y1": 109, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 110, "mark": null, "x": 110, - "y0": null, + "y0": 0, "y1": 110, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 111, "mark": null, "x": 111, - "y0": null, + "y0": 0, "y1": 111, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 112, "mark": null, "x": 112, - "y0": null, + "y0": 0, "y1": 112, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 113, "mark": null, "x": 113, - "y0": null, + "y0": 0, "y1": 113, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 114, "mark": null, "x": 114, - "y0": null, + "y0": 0, "y1": 114, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 115, "mark": null, "x": 115, - "y0": null, + "y0": 0, "y1": 115, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 116, "mark": null, "x": 116, - "y0": null, + "y0": 0, "y1": 116, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 117, "mark": null, "x": 117, - "y0": null, + "y0": 0, "y1": 117, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 118, "mark": null, "x": 118, - "y0": null, + "y0": 0, "y1": 118, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 119, "mark": null, "x": 119, - "y0": null, + "y0": 0, "y1": 119, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 120, "mark": null, "x": 120, - "y0": null, + "y0": 0, "y1": 120, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 121, "mark": null, "x": 121, - "y0": null, + "y0": 0, "y1": 121, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 122, "mark": null, "x": 122, - "y0": null, + "y0": 0, "y1": 122, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 123, "mark": null, "x": 123, - "y0": null, + "y0": 0, "y1": 123, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 124, "mark": null, "x": 124, - "y0": null, + "y0": 0, "y1": 124, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 125, "mark": null, "x": 125, - "y0": null, + "y0": 0, "y1": 125, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 126, "mark": null, "x": 126, - "y0": null, + "y0": 0, "y1": 126, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 127, "mark": null, "x": 127, - "y0": null, + "y0": 0, "y1": 127, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 128, "mark": null, "x": 128, - "y0": null, + "y0": 0, "y1": 128, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 129, "mark": null, "x": 129, - "y0": null, + "y0": 0, "y1": 129, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 130, "mark": null, "x": 130, - "y0": null, + "y0": 0, "y1": 130, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 131, "mark": null, "x": 131, - "y0": null, + "y0": 0, "y1": 131, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 132, "mark": null, "x": 132, - "y0": null, + "y0": 0, "y1": 132, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 133, "mark": null, "x": 133, - "y0": null, + "y0": 0, "y1": 133, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 134, "mark": null, "x": 134, - "y0": null, + "y0": 0, "y1": 134, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 135, "mark": null, "x": 135, - "y0": null, + "y0": 0, "y1": 135, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 136, "mark": null, "x": 136, - "y0": null, + "y0": 0, "y1": 136, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 137, "mark": null, "x": 137, - "y0": null, + "y0": 0, "y1": 137, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 138, "mark": null, "x": 138, - "y0": null, + "y0": 0, "y1": 138, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 139, "mark": null, "x": 139, - "y0": null, + "y0": 0, "y1": 139, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 140, "mark": null, "x": 140, - "y0": null, + "y0": 0, "y1": 140, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 141, "mark": null, "x": 141, - "y0": null, + "y0": 0, "y1": 141, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 142, "mark": null, "x": 142, - "y0": null, + "y0": 0, "y1": 142, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 143, "mark": null, "x": 143, - "y0": null, + "y0": 0, "y1": 143, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 144, "mark": null, "x": 144, - "y0": null, + "y0": 0, "y1": 144, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 145, "mark": null, "x": 145, - "y0": null, + "y0": 0, "y1": 145, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 146, "mark": null, "x": 146, - "y0": null, + "y0": 0, "y1": 146, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 147, "mark": null, "x": 147, - "y0": null, + "y0": 0, "y1": 147, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 148, "mark": null, "x": 148, - "y0": null, + "y0": 0, "y1": 148, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 149, "mark": null, "x": 149, - "y0": null, + "y0": 0, "y1": 149, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 150, "mark": null, "x": 150, - "y0": null, + "y0": 0, "y1": 150, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 151, "mark": null, "x": 151, - "y0": null, + "y0": 0, "y1": 151, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 152, "mark": null, "x": 152, - "y0": null, + "y0": 0, "y1": 152, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 153, "mark": null, "x": 153, - "y0": null, + "y0": 0, "y1": 153, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 154, "mark": null, "x": 154, - "y0": null, + "y0": 0, "y1": 154, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 155, "mark": null, "x": 155, - "y0": null, + "y0": 0, "y1": 155, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 156, "mark": null, "x": 156, - "y0": null, + "y0": 0, "y1": 156, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 157, "mark": null, "x": 157, - "y0": null, + "y0": 0, "y1": 157, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 158, "mark": null, "x": 158, - "y0": null, + "y0": 0, "y1": 158, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 159, "mark": null, "x": 159, - "y0": null, + "y0": 0, "y1": 159, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 160, "mark": null, "x": 160, - "y0": null, + "y0": 0, "y1": 160, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 161, "mark": null, "x": 161, - "y0": null, + "y0": 0, "y1": 161, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 162, "mark": null, "x": 162, - "y0": null, + "y0": 0, "y1": 162, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 163, "mark": null, "x": 163, - "y0": null, + "y0": 0, "y1": 163, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 164, "mark": null, "x": 164, - "y0": null, + "y0": 0, "y1": 164, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 165, "mark": null, "x": 165, - "y0": null, + "y0": 0, "y1": 165, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 166, "mark": null, "x": 166, - "y0": null, + "y0": 0, "y1": 166, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 167, "mark": null, "x": 167, - "y0": null, + "y0": 0, "y1": 167, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 168, "mark": null, "x": 168, - "y0": null, + "y0": 0, "y1": 168, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 169, "mark": null, "x": 169, - "y0": null, + "y0": 0, "y1": 169, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 170, "mark": null, "x": 170, - "y0": null, + "y0": 0, "y1": 170, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 171, "mark": null, "x": 171, - "y0": null, + "y0": 0, "y1": 171, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 172, "mark": null, "x": 172, - "y0": null, + "y0": 0, "y1": 172, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 173, "mark": null, "x": 173, - "y0": null, + "y0": 0, "y1": 173, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 174, "mark": null, "x": 174, - "y0": null, + "y0": 0, "y1": 174, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 175, "mark": null, "x": 175, - "y0": null, + "y0": 0, "y1": 175, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 176, "mark": null, "x": 176, - "y0": null, + "y0": 0, "y1": 176, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 177, "mark": null, "x": 177, - "y0": null, + "y0": 0, "y1": 177, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 178, "mark": null, "x": 178, - "y0": null, + "y0": 0, "y1": 178, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 179, "mark": null, "x": 179, - "y0": null, + "y0": 0, "y1": 179, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 180, "mark": null, "x": 180, - "y0": null, + "y0": 0, "y1": 180, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 181, "mark": null, "x": 181, - "y0": null, + "y0": 0, "y1": 181, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 182, "mark": null, "x": 182, - "y0": null, + "y0": 0, "y1": 182, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 183, "mark": null, "x": 183, - "y0": null, + "y0": 0, "y1": 183, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 184, "mark": null, "x": 184, - "y0": null, + "y0": 0, "y1": 184, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 185, "mark": null, "x": 185, - "y0": null, + "y0": 0, "y1": 185, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 186, "mark": null, "x": 186, - "y0": null, + "y0": 0, "y1": 186, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 187, "mark": null, "x": 187, - "y0": null, + "y0": 0, "y1": 187, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 188, "mark": null, "x": 188, - "y0": null, + "y0": 0, "y1": 188, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 189, "mark": null, "x": 189, - "y0": null, + "y0": 0, "y1": 189, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 190, "mark": null, "x": 190, - "y0": null, + "y0": 0, "y1": 190, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 191, "mark": null, "x": 191, - "y0": null, + "y0": 0, "y1": 191, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 192, "mark": null, "x": 192, - "y0": null, + "y0": 0, "y1": 192, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 193, "mark": null, "x": 193, - "y0": null, + "y0": 0, "y1": 193, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 194, "mark": null, "x": 194, - "y0": null, + "y0": 0, "y1": 194, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 195, "mark": null, "x": 195, - "y0": null, + "y0": 0, "y1": 195, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 196, "mark": null, "x": 196, - "y0": null, + "y0": 0, "y1": 196, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 197, "mark": null, "x": 197, - "y0": null, + "y0": 0, "y1": 197, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 198, "mark": null, "x": 198, - "y0": null, + "y0": 0, "y1": 198, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 199, "mark": null, "x": 199, - "y0": null, + "y0": 0, "y1": 199, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 200, "mark": null, "x": 200, - "y0": null, + "y0": 0, "y1": 200, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 201, "mark": null, "x": 201, - "y0": null, + "y0": 0, "y1": 201, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 202, "mark": null, "x": 202, - "y0": null, + "y0": 0, "y1": 202, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 203, "mark": null, "x": 203, - "y0": null, + "y0": 0, "y1": 203, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 204, "mark": null, "x": 204, - "y0": null, + "y0": 0, "y1": 204, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 205, "mark": null, "x": 205, - "y0": null, + "y0": 0, "y1": 205, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 206, "mark": null, "x": 206, - "y0": null, + "y0": 0, "y1": 206, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 207, "mark": null, "x": 207, - "y0": null, + "y0": 0, "y1": 207, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 208, "mark": null, "x": 208, - "y0": null, + "y0": 0, "y1": 208, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 209, "mark": null, "x": 209, - "y0": null, + "y0": 0, "y1": 209, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 210, "mark": null, "x": 210, - "y0": null, + "y0": 0, "y1": 210, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 211, "mark": null, "x": 211, - "y0": null, + "y0": 0, "y1": 211, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 212, "mark": null, "x": 212, - "y0": null, + "y0": 0, "y1": 212, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 213, "mark": null, "x": 213, - "y0": null, + "y0": 0, "y1": 213, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 214, "mark": null, "x": 214, - "y0": null, + "y0": 0, "y1": 214, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 215, "mark": null, "x": 215, - "y0": null, + "y0": 0, "y1": 215, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 216, "mark": null, "x": 216, - "y0": null, + "y0": 0, "y1": 216, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 217, "mark": null, "x": 217, - "y0": null, + "y0": 0, "y1": 217, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 218, "mark": null, "x": 218, - "y0": null, + "y0": 0, "y1": 218, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 219, "mark": null, "x": 219, - "y0": null, + "y0": 0, "y1": 219, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 220, "mark": null, "x": 220, - "y0": null, + "y0": 0, "y1": 220, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 221, "mark": null, "x": 221, - "y0": null, + "y0": 0, "y1": 221, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 222, "mark": null, "x": 222, - "y0": null, + "y0": 0, "y1": 222, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 223, "mark": null, "x": 223, - "y0": null, + "y0": 0, "y1": 223, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 224, "mark": null, "x": 224, - "y0": null, + "y0": 0, "y1": 224, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 225, "mark": null, "x": 225, - "y0": null, + "y0": 0, "y1": 225, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 226, "mark": null, "x": 226, - "y0": null, + "y0": 0, "y1": 226, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 227, "mark": null, "x": 227, - "y0": null, + "y0": 0, "y1": 227, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 228, "mark": null, "x": 228, - "y0": null, + "y0": 0, "y1": 228, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 229, "mark": null, "x": 229, - "y0": null, + "y0": 0, "y1": 229, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 230, "mark": null, "x": 230, - "y0": null, + "y0": 0, "y1": 230, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 231, "mark": null, "x": 231, - "y0": null, + "y0": 0, "y1": 231, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 232, "mark": null, "x": 232, - "y0": null, + "y0": 0, "y1": 232, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 233, "mark": null, "x": 233, - "y0": null, + "y0": 0, "y1": 233, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 234, "mark": null, "x": 234, - "y0": null, + "y0": 0, "y1": 234, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 235, "mark": null, "x": 235, - "y0": null, + "y0": 0, "y1": 235, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 236, "mark": null, "x": 236, - "y0": null, + "y0": 0, "y1": 236, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 237, "mark": null, "x": 237, - "y0": null, + "y0": 0, "y1": 237, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 238, "mark": null, "x": 238, - "y0": null, + "y0": 0, "y1": 238, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 239, "mark": null, "x": 239, - "y0": null, + "y0": 0, "y1": 239, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 240, "mark": null, "x": 240, - "y0": null, + "y0": 0, "y1": 240, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 241, "mark": null, "x": 241, - "y0": null, + "y0": 0, "y1": 241, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 242, "mark": null, "x": 242, - "y0": null, + "y0": 0, "y1": 242, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 243, "mark": null, "x": 243, - "y0": null, + "y0": 0, "y1": 243, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 244, "mark": null, "x": 244, - "y0": null, + "y0": 0, "y1": 244, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 245, "mark": null, "x": 245, - "y0": null, + "y0": 0, "y1": 245, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 246, "mark": null, "x": 246, - "y0": null, + "y0": 0, "y1": 246, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 247, "mark": null, "x": 247, - "y0": null, + "y0": 0, "y1": 247, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 248, "mark": null, "x": 248, - "y0": null, + "y0": 0, "y1": 248, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 249, "mark": null, "x": 249, - "y0": null, + "y0": 0, "y1": 249, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 250, "mark": null, "x": 250, - "y0": null, + "y0": 0, "y1": 250, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 251, "mark": null, "x": 251, - "y0": null, + "y0": 0, "y1": 251, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 252, "mark": null, "x": 252, - "y0": null, + "y0": 0, "y1": 252, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 253, "mark": null, "x": 253, - "y0": null, + "y0": 0, "y1": 253, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 254, "mark": null, "x": 254, - "y0": null, + "y0": 0, "y1": 254, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 255, "mark": null, "x": 255, - "y0": null, + "y0": 0, "y1": 255, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 256, "mark": null, "x": 256, - "y0": null, + "y0": 0, "y1": 256, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 257, "mark": null, "x": 257, - "y0": null, + "y0": 0, "y1": 257, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 258, "mark": null, "x": 258, - "y0": null, + "y0": 0, "y1": 258, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 259, "mark": null, "x": 259, - "y0": null, + "y0": 0, "y1": 259, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 260, "mark": null, "x": 260, - "y0": null, + "y0": 0, "y1": 260, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 261, "mark": null, "x": 261, - "y0": null, + "y0": 0, "y1": 261, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 262, "mark": null, "x": 262, - "y0": null, + "y0": 0, "y1": 262, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 263, "mark": null, "x": 263, - "y0": null, + "y0": 0, "y1": 263, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 264, "mark": null, "x": 264, - "y0": null, + "y0": 0, "y1": 264, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 265, "mark": null, "x": 265, - "y0": null, + "y0": 0, "y1": 265, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 266, "mark": null, "x": 266, - "y0": null, + "y0": 0, "y1": 266, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 267, "mark": null, "x": 267, - "y0": null, + "y0": 0, "y1": 267, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 268, "mark": null, "x": 268, - "y0": null, + "y0": 0, "y1": 268, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 269, "mark": null, "x": 269, - "y0": null, + "y0": 0, "y1": 269, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 270, "mark": null, "x": 270, - "y0": null, + "y0": 0, "y1": 270, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 271, "mark": null, "x": 271, - "y0": null, + "y0": 0, "y1": 271, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 272, "mark": null, "x": 272, - "y0": null, + "y0": 0, "y1": 272, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 273, "mark": null, "x": 273, - "y0": null, + "y0": 0, "y1": 273, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 274, "mark": null, "x": 274, - "y0": null, + "y0": 0, "y1": 274, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 275, "mark": null, "x": 275, - "y0": null, + "y0": 0, "y1": 275, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 276, "mark": null, "x": 276, - "y0": null, + "y0": 0, "y1": 276, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 277, "mark": null, "x": 277, - "y0": null, + "y0": 0, "y1": 277, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 278, "mark": null, "x": 278, - "y0": null, + "y0": 0, "y1": 278, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 279, "mark": null, "x": 279, - "y0": null, + "y0": 0, "y1": 279, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 280, "mark": null, "x": 280, - "y0": null, + "y0": 0, "y1": 280, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 281, "mark": null, "x": 281, - "y0": null, + "y0": 0, "y1": 281, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 282, "mark": null, "x": 282, - "y0": null, + "y0": 0, "y1": 282, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 283, "mark": null, "x": 283, - "y0": null, + "y0": 0, "y1": 283, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 284, "mark": null, "x": 284, - "y0": null, + "y0": 0, "y1": 284, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 285, "mark": null, "x": 285, - "y0": null, + "y0": 0, "y1": 285, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 286, "mark": null, "x": 286, - "y0": null, + "y0": 0, "y1": 286, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 287, "mark": null, "x": 287, - "y0": null, + "y0": 0, "y1": 287, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 288, "mark": null, "x": 288, - "y0": null, + "y0": 0, "y1": 288, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 289, "mark": null, "x": 289, - "y0": null, + "y0": 0, "y1": 289, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 290, "mark": null, "x": 290, - "y0": null, + "y0": 0, "y1": 290, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 291, "mark": null, "x": 291, - "y0": null, + "y0": 0, "y1": 291, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 292, "mark": null, "x": 292, - "y0": null, + "y0": 0, "y1": 292, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 293, "mark": null, "x": 293, - "y0": null, + "y0": 0, "y1": 293, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 294, "mark": null, "x": 294, - "y0": null, + "y0": 0, "y1": 294, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 295, "mark": null, "x": 295, - "y0": null, + "y0": 0, "y1": 295, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 296, "mark": null, "x": 296, - "y0": null, + "y0": 0, "y1": 296, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 297, "mark": null, "x": 297, - "y0": null, + "y0": 0, "y1": 297, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 298, "mark": null, "x": 298, - "y0": null, + "y0": 0, "y1": 298, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 299, "mark": null, "x": 299, - "y0": null, + "y0": 0, "y1": 299, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 300, "mark": null, "x": 300, - "y0": null, + "y0": 0, "y1": 300, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 301, "mark": null, "x": 301, - "y0": null, + "y0": 0, "y1": 301, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 302, "mark": null, "x": 302, - "y0": null, + "y0": 0, "y1": 302, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 303, "mark": null, "x": 303, - "y0": null, + "y0": 0, "y1": 303, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 304, "mark": null, "x": 304, - "y0": null, + "y0": 0, "y1": 304, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 305, "mark": null, "x": 305, - "y0": null, + "y0": 0, "y1": 305, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 306, "mark": null, "x": 306, - "y0": null, + "y0": 0, "y1": 306, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 307, "mark": null, "x": 307, - "y0": null, + "y0": 0, "y1": 307, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 308, "mark": null, "x": 308, - "y0": null, + "y0": 0, "y1": 308, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 309, "mark": null, "x": 309, - "y0": null, + "y0": 0, "y1": 309, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 310, "mark": null, "x": 310, - "y0": null, + "y0": 0, "y1": 310, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 311, "mark": null, "x": 311, - "y0": null, + "y0": 0, "y1": 311, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 312, "mark": null, "x": 312, - "y0": null, + "y0": 0, "y1": 312, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 313, "mark": null, "x": 313, - "y0": null, + "y0": 0, "y1": 313, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 314, "mark": null, "x": 314, - "y0": null, + "y0": 0, "y1": 314, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 315, "mark": null, "x": 315, - "y0": null, + "y0": 0, "y1": 315, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 316, "mark": null, "x": 316, - "y0": null, + "y0": 0, "y1": 316, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 317, "mark": null, "x": 317, - "y0": null, + "y0": 0, "y1": 317, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 318, "mark": null, "x": 318, - "y0": null, + "y0": 0, "y1": 318, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 319, "mark": null, "x": 319, - "y0": null, + "y0": 0, "y1": 319, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 320, "mark": null, "x": 320, - "y0": null, + "y0": 0, "y1": 320, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 321, "mark": null, "x": 321, - "y0": null, + "y0": 0, "y1": 321, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 322, "mark": null, "x": 322, - "y0": null, + "y0": 0, "y1": 322, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 323, "mark": null, "x": 323, - "y0": null, + "y0": 0, "y1": 323, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 324, "mark": null, "x": 324, - "y0": null, + "y0": 0, "y1": 324, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 325, "mark": null, "x": 325, - "y0": null, + "y0": 0, "y1": 325, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 326, "mark": null, "x": 326, - "y0": null, + "y0": 0, "y1": 326, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 327, "mark": null, "x": 327, - "y0": null, + "y0": 0, "y1": 327, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 328, "mark": null, "x": 328, - "y0": null, + "y0": 0, "y1": 328, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 329, "mark": null, "x": 329, - "y0": null, + "y0": 0, "y1": 329, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 330, "mark": null, "x": 330, - "y0": null, + "y0": 0, "y1": 330, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 331, "mark": null, "x": 331, - "y0": null, + "y0": 0, "y1": 331, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 332, "mark": null, "x": 332, - "y0": null, + "y0": 0, "y1": 332, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 333, "mark": null, "x": 333, - "y0": null, + "y0": 0, "y1": 333, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 334, "mark": null, "x": 334, - "y0": null, + "y0": 0, "y1": 334, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 335, "mark": null, "x": 335, - "y0": null, + "y0": 0, "y1": 335, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 336, "mark": null, "x": 336, - "y0": null, + "y0": 0, "y1": 336, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 337, "mark": null, "x": 337, - "y0": null, + "y0": 0, "y1": 337, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 338, "mark": null, "x": 338, - "y0": null, + "y0": 0, "y1": 338, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 339, "mark": null, "x": 339, - "y0": null, + "y0": 0, "y1": 339, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 340, "mark": null, "x": 340, - "y0": null, + "y0": 0, "y1": 340, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 341, "mark": null, "x": 341, - "y0": null, + "y0": 0, "y1": 341, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 342, "mark": null, "x": 342, - "y0": null, + "y0": 0, "y1": 342, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 343, "mark": null, "x": 343, - "y0": null, + "y0": 0, "y1": 343, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 344, "mark": null, "x": 344, - "y0": null, + "y0": 0, "y1": 344, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 345, "mark": null, "x": 345, - "y0": null, + "y0": 0, "y1": 345, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 346, "mark": null, "x": 346, - "y0": null, + "y0": 0, "y1": 346, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 347, "mark": null, "x": 347, - "y0": null, + "y0": 0, "y1": 347, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 348, "mark": null, "x": 348, - "y0": null, + "y0": 0, "y1": 348, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 349, "mark": null, "x": 349, - "y0": null, + "y0": 0, "y1": 349, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 350, "mark": null, "x": 350, - "y0": null, + "y0": 0, "y1": 350, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 351, "mark": null, "x": 351, - "y0": null, + "y0": 0, "y1": 351, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 352, "mark": null, "x": 352, - "y0": null, + "y0": 0, "y1": 352, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 353, "mark": null, "x": 353, - "y0": null, + "y0": 0, "y1": 353, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 354, "mark": null, "x": 354, - "y0": null, + "y0": 0, "y1": 354, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 355, "mark": null, "x": 355, - "y0": null, + "y0": 0, "y1": 355, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 356, "mark": null, "x": 356, - "y0": null, + "y0": 0, "y1": 356, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 357, "mark": null, "x": 357, - "y0": null, + "y0": 0, "y1": 357, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 358, "mark": null, "x": 358, - "y0": null, + "y0": 0, "y1": 358, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 359, "mark": null, "x": 359, - "y0": null, + "y0": 0, "y1": 359, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 360, "mark": null, "x": 360, - "y0": null, + "y0": 0, "y1": 360, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 361, "mark": null, "x": 361, - "y0": null, + "y0": 0, "y1": 361, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 362, "mark": null, "x": 362, - "y0": null, + "y0": 0, "y1": 362, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 363, "mark": null, "x": 363, - "y0": null, + "y0": 0, "y1": 363, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 364, "mark": null, "x": 364, - "y0": null, + "y0": 0, "y1": 364, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 365, "mark": null, "x": 365, - "y0": null, + "y0": 0, "y1": 365, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 366, "mark": null, "x": 366, - "y0": null, + "y0": 0, "y1": 366, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 367, "mark": null, "x": 367, - "y0": null, + "y0": 0, "y1": 367, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 368, "mark": null, "x": 368, - "y0": null, + "y0": 0, "y1": 368, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 369, "mark": null, "x": 369, - "y0": null, + "y0": 0, "y1": 369, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 370, "mark": null, "x": 370, - "y0": null, + "y0": 0, "y1": 370, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 371, "mark": null, "x": 371, - "y0": null, + "y0": 0, "y1": 371, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 372, "mark": null, "x": 372, - "y0": null, + "y0": 0, "y1": 372, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 373, "mark": null, "x": 373, - "y0": null, + "y0": 0, "y1": 373, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 374, "mark": null, "x": 374, - "y0": null, + "y0": 0, "y1": 374, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 375, "mark": null, "x": 375, - "y0": null, + "y0": 0, "y1": 375, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 376, "mark": null, "x": 376, - "y0": null, + "y0": 0, "y1": 376, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 377, "mark": null, "x": 377, - "y0": null, + "y0": 0, "y1": 377, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 378, "mark": null, "x": 378, - "y0": null, + "y0": 0, "y1": 378, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 379, "mark": null, "x": 379, - "y0": null, + "y0": 0, "y1": 379, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 380, "mark": null, "x": 380, - "y0": null, + "y0": 0, "y1": 380, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 381, "mark": null, "x": 381, - "y0": null, + "y0": 0, "y1": 381, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 382, "mark": null, "x": 382, - "y0": null, + "y0": 0, "y1": 382, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 383, "mark": null, "x": 383, - "y0": null, + "y0": 0, "y1": 383, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 384, "mark": null, "x": 384, - "y0": null, + "y0": 0, "y1": 384, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 385, "mark": null, "x": 385, - "y0": null, + "y0": 0, "y1": 385, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 386, "mark": null, "x": 386, - "y0": null, + "y0": 0, "y1": 386, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 387, "mark": null, "x": 387, - "y0": null, + "y0": 0, "y1": 387, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 388, "mark": null, "x": 388, - "y0": null, + "y0": 0, "y1": 388, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 389, "mark": null, "x": 389, - "y0": null, + "y0": 0, "y1": 389, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 390, "mark": null, "x": 390, - "y0": null, + "y0": 0, "y1": 390, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 391, "mark": null, "x": 391, - "y0": null, + "y0": 0, "y1": 391, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 392, "mark": null, "x": 392, - "y0": null, + "y0": 0, "y1": 392, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 393, "mark": null, "x": 393, - "y0": null, + "y0": 0, "y1": 393, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 394, "mark": null, "x": 394, - "y0": null, + "y0": 0, "y1": 394, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 395, "mark": null, "x": 395, - "y0": null, + "y0": 0, "y1": 395, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 396, "mark": null, "x": 396, - "y0": null, + "y0": 0, "y1": 396, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 397, "mark": null, "x": 397, - "y0": null, + "y0": 0, "y1": 397, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 398, "mark": null, "x": 398, - "y0": null, + "y0": 0, "y1": 398, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 399, "mark": null, "x": 399, - "y0": null, + "y0": 0, "y1": 399, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 400, "mark": null, "x": 400, - "y0": null, + "y0": 0, "y1": 400, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 401, "mark": null, "x": 401, - "y0": null, + "y0": 0, "y1": 401, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 402, "mark": null, "x": 402, - "y0": null, + "y0": 0, "y1": 402, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 403, "mark": null, "x": 403, - "y0": null, + "y0": 0, "y1": 403, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 404, "mark": null, "x": 404, - "y0": null, + "y0": 0, "y1": 404, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 405, "mark": null, "x": 405, - "y0": null, + "y0": 0, "y1": 405, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 406, "mark": null, "x": 406, - "y0": null, + "y0": 0, "y1": 406, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 407, "mark": null, "x": 407, - "y0": null, + "y0": 0, "y1": 407, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 408, "mark": null, "x": 408, - "y0": null, + "y0": 0, "y1": 408, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 409, "mark": null, "x": 409, - "y0": null, + "y0": 0, "y1": 409, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 410, "mark": null, "x": 410, - "y0": null, + "y0": 0, "y1": 410, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 411, "mark": null, "x": 411, - "y0": null, + "y0": 0, "y1": 411, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 412, "mark": null, "x": 412, - "y0": null, + "y0": 0, "y1": 412, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 413, "mark": null, "x": 413, - "y0": null, + "y0": 0, "y1": 413, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 414, "mark": null, "x": 414, - "y0": null, + "y0": 0, "y1": 414, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 415, "mark": null, "x": 415, - "y0": null, + "y0": 0, "y1": 415, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 416, "mark": null, "x": 416, - "y0": null, + "y0": 0, "y1": 416, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 417, "mark": null, "x": 417, - "y0": null, + "y0": 0, "y1": 417, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 418, "mark": null, "x": 418, - "y0": null, + "y0": 0, "y1": 418, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 419, "mark": null, "x": 419, - "y0": null, + "y0": 0, "y1": 419, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 420, "mark": null, "x": 420, - "y0": null, + "y0": 0, "y1": 420, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 421, "mark": null, "x": 421, - "y0": null, + "y0": 0, "y1": 421, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 422, "mark": null, "x": 422, - "y0": null, + "y0": 0, "y1": 422, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 423, "mark": null, "x": 423, - "y0": null, + "y0": 0, "y1": 423, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 424, "mark": null, "x": 424, - "y0": null, + "y0": 0, "y1": 424, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 425, "mark": null, "x": 425, - "y0": null, + "y0": 0, "y1": 425, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 426, "mark": null, "x": 426, - "y0": null, + "y0": 0, "y1": 426, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 427, "mark": null, "x": 427, - "y0": null, + "y0": 0, "y1": 427, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 428, "mark": null, "x": 428, - "y0": null, + "y0": 0, "y1": 428, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 429, "mark": null, "x": 429, - "y0": null, + "y0": 0, "y1": 429, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 430, "mark": null, "x": 430, - "y0": null, + "y0": 0, "y1": 430, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 431, "mark": null, "x": 431, - "y0": null, + "y0": 0, "y1": 431, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 432, "mark": null, "x": 432, - "y0": null, + "y0": 0, "y1": 432, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 433, "mark": null, "x": 433, - "y0": null, + "y0": 0, "y1": 433, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 434, "mark": null, "x": 434, - "y0": null, + "y0": 0, "y1": 434, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 435, "mark": null, "x": 435, - "y0": null, + "y0": 0, "y1": 435, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 436, "mark": null, "x": 436, - "y0": null, + "y0": 0, "y1": 436, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 437, "mark": null, "x": 437, - "y0": null, + "y0": 0, "y1": 437, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 438, "mark": null, "x": 438, - "y0": null, + "y0": 0, "y1": 438, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 439, "mark": null, "x": 439, - "y0": null, + "y0": 0, "y1": 439, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 440, "mark": null, "x": 440, - "y0": null, + "y0": 0, "y1": 440, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 441, "mark": null, "x": 441, - "y0": null, + "y0": 0, "y1": 441, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 442, "mark": null, "x": 442, - "y0": null, + "y0": 0, "y1": 442, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 443, "mark": null, "x": 443, - "y0": null, + "y0": 0, "y1": 443, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 444, "mark": null, "x": 444, - "y0": null, + "y0": 0, "y1": 444, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 445, "mark": null, "x": 445, - "y0": null, + "y0": 0, "y1": 445, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 446, "mark": null, "x": 446, - "y0": null, + "y0": 0, "y1": 446, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 447, "mark": null, "x": 447, - "y0": null, + "y0": 0, "y1": 447, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 448, "mark": null, "x": 448, - "y0": null, + "y0": 0, "y1": 448, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 449, "mark": null, "x": 449, - "y0": null, + "y0": 0, "y1": 449, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 450, "mark": null, "x": 450, - "y0": null, + "y0": 0, "y1": 450, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 451, "mark": null, "x": 451, - "y0": null, + "y0": 0, "y1": 451, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 452, "mark": null, "x": 452, - "y0": null, + "y0": 0, "y1": 452, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 453, "mark": null, "x": 453, - "y0": null, + "y0": 0, "y1": 453, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 454, "mark": null, "x": 454, - "y0": null, + "y0": 0, "y1": 454, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 455, "mark": null, "x": 455, - "y0": null, + "y0": 0, "y1": 455, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 456, "mark": null, "x": 456, - "y0": null, + "y0": 0, "y1": 456, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 457, "mark": null, "x": 457, - "y0": null, + "y0": 0, "y1": 457, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 458, "mark": null, "x": 458, - "y0": null, + "y0": 0, "y1": 458, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 459, "mark": null, "x": 459, - "y0": null, + "y0": 0, "y1": 459, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 460, "mark": null, "x": 460, - "y0": null, + "y0": 0, "y1": 460, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 461, "mark": null, "x": 461, - "y0": null, + "y0": 0, "y1": 461, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 462, "mark": null, "x": 462, - "y0": null, + "y0": 0, "y1": 462, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 463, "mark": null, "x": 463, - "y0": null, + "y0": 0, "y1": 463, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 464, "mark": null, "x": 464, - "y0": null, + "y0": 0, "y1": 464, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 465, "mark": null, "x": 465, - "y0": null, + "y0": 0, "y1": 465, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 466, "mark": null, "x": 466, - "y0": null, + "y0": 0, "y1": 466, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 467, "mark": null, "x": 467, - "y0": null, + "y0": 0, "y1": 467, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 468, "mark": null, "x": 468, - "y0": null, + "y0": 0, "y1": 468, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 469, "mark": null, "x": 469, - "y0": null, + "y0": 0, "y1": 469, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 470, "mark": null, "x": 470, - "y0": null, + "y0": 0, "y1": 470, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 471, "mark": null, "x": 471, - "y0": null, + "y0": 0, "y1": 471, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 472, "mark": null, "x": 472, - "y0": null, + "y0": 0, "y1": 472, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 473, "mark": null, "x": 473, - "y0": null, + "y0": 0, "y1": 473, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 474, "mark": null, "x": 474, - "y0": null, + "y0": 0, "y1": 474, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 475, "mark": null, "x": 475, - "y0": null, + "y0": 0, "y1": 475, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 476, "mark": null, "x": 476, - "y0": null, + "y0": 0, "y1": 476, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 477, "mark": null, "x": 477, - "y0": null, + "y0": 0, "y1": 477, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 478, "mark": null, "x": 478, - "y0": null, + "y0": 0, "y1": 478, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 479, "mark": null, "x": 479, - "y0": null, + "y0": 0, "y1": 479, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 480, "mark": null, "x": 480, - "y0": null, + "y0": 0, "y1": 480, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 481, "mark": null, "x": 481, - "y0": null, + "y0": 0, "y1": 481, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 482, "mark": null, "x": 482, - "y0": null, + "y0": 0, "y1": 482, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 483, "mark": null, "x": 483, - "y0": null, + "y0": 0, "y1": 483, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 484, "mark": null, "x": 484, - "y0": null, + "y0": 0, "y1": 484, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 485, "mark": null, "x": 485, - "y0": null, + "y0": 0, "y1": 485, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 486, "mark": null, "x": 486, - "y0": null, + "y0": 0, "y1": 486, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 487, "mark": null, "x": 487, - "y0": null, + "y0": 0, "y1": 487, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 488, "mark": null, "x": 488, - "y0": null, + "y0": 0, "y1": 488, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 489, "mark": null, "x": 489, - "y0": null, + "y0": 0, "y1": 489, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 490, "mark": null, "x": 490, - "y0": null, + "y0": 0, "y1": 490, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 491, "mark": null, "x": 491, - "y0": null, + "y0": 0, "y1": 491, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 492, "mark": null, "x": 492, - "y0": null, + "y0": 0, "y1": 492, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 493, "mark": null, "x": 493, - "y0": null, + "y0": 0, "y1": 493, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 494, "mark": null, "x": 494, - "y0": null, + "y0": 0, "y1": 494, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 495, "mark": null, "x": 495, - "y0": null, + "y0": 0, "y1": 495, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 496, "mark": null, "x": 496, - "y0": null, + "y0": 0, "y1": 496, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 497, "mark": null, "x": 497, - "y0": null, + "y0": 0, "y1": 497, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 498, "mark": null, "x": 498, - "y0": null, + "y0": 0, "y1": 498, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 499, "mark": null, "x": 499, - "y0": null, + "y0": 0, "y1": 499, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 500, "mark": null, "x": 500, - "y0": null, + "y0": 0, "y1": 500, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 501, "mark": null, "x": 501, - "y0": null, + "y0": 0, "y1": 501, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 502, "mark": null, "x": 502, - "y0": null, + "y0": 0, "y1": 502, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 503, "mark": null, "x": 503, - "y0": null, + "y0": 0, "y1": 503, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 504, "mark": null, "x": 504, - "y0": null, + "y0": 0, "y1": 504, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 505, "mark": null, "x": 505, - "y0": null, + "y0": 0, "y1": 505, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 506, "mark": null, "x": 506, - "y0": null, + "y0": 0, "y1": 506, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 507, "mark": null, "x": 507, - "y0": null, + "y0": 0, "y1": 507, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 508, "mark": null, "x": 508, - "y0": null, + "y0": 0, "y1": 508, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 509, "mark": null, "x": 509, - "y0": null, + "y0": 0, "y1": 509, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 510, "mark": null, "x": 510, - "y0": null, + "y0": 0, "y1": 510, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 511, "mark": null, "x": 511, - "y0": null, + "y0": 0, "y1": 511, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 512, "mark": null, "x": 512, - "y0": null, + "y0": 0, "y1": 512, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 513, "mark": null, "x": 513, - "y0": null, + "y0": 0, "y1": 513, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 514, "mark": null, "x": 514, - "y0": null, + "y0": 0, "y1": 514, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 515, "mark": null, "x": 515, - "y0": null, + "y0": 0, "y1": 515, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 516, "mark": null, "x": 516, - "y0": null, + "y0": 0, "y1": 516, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 517, "mark": null, "x": 517, - "y0": null, + "y0": 0, "y1": 517, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 518, "mark": null, "x": 518, - "y0": null, + "y0": 0, "y1": 518, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 519, "mark": null, "x": 519, - "y0": null, + "y0": 0, "y1": 519, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 520, "mark": null, "x": 520, - "y0": null, + "y0": 0, "y1": 520, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 521, "mark": null, "x": 521, - "y0": null, + "y0": 0, "y1": 521, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 522, "mark": null, "x": 522, - "y0": null, + "y0": 0, "y1": 522, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 523, "mark": null, "x": 523, - "y0": null, + "y0": 0, "y1": 523, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 524, "mark": null, "x": 524, - "y0": null, + "y0": 0, "y1": 524, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 525, "mark": null, "x": 525, - "y0": null, + "y0": 0, "y1": 525, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 526, "mark": null, "x": 526, - "y0": null, + "y0": 0, "y1": 526, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 527, "mark": null, "x": 527, - "y0": null, + "y0": 0, "y1": 527, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 528, "mark": null, "x": 528, - "y0": null, + "y0": 0, "y1": 528, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 529, "mark": null, "x": 529, - "y0": null, + "y0": 0, "y1": 529, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 530, "mark": null, "x": 530, - "y0": null, + "y0": 0, "y1": 530, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 531, "mark": null, "x": 531, - "y0": null, + "y0": 0, "y1": 531, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 532, "mark": null, "x": 532, - "y0": null, + "y0": 0, "y1": 532, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 533, "mark": null, "x": 533, - "y0": null, + "y0": 0, "y1": 533, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 534, "mark": null, "x": 534, - "y0": null, + "y0": 0, "y1": 534, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 535, "mark": null, "x": 535, - "y0": null, + "y0": 0, "y1": 535, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 536, "mark": null, "x": 536, - "y0": null, + "y0": 0, "y1": 536, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 537, "mark": null, "x": 537, - "y0": null, + "y0": 0, "y1": 537, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 538, "mark": null, "x": 538, - "y0": null, + "y0": 0, "y1": 538, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 539, "mark": null, "x": 539, - "y0": null, + "y0": 0, "y1": 539, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 540, "mark": null, "x": 540, - "y0": null, + "y0": 0, "y1": 540, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 541, "mark": null, "x": 541, - "y0": null, + "y0": 0, "y1": 541, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 542, "mark": null, "x": 542, - "y0": null, + "y0": 0, "y1": 542, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 543, "mark": null, "x": 543, - "y0": null, + "y0": 0, "y1": 543, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 544, "mark": null, "x": 544, - "y0": null, + "y0": 0, "y1": 544, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 545, "mark": null, "x": 545, - "y0": null, + "y0": 0, "y1": 545, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 546, "mark": null, "x": 546, - "y0": null, + "y0": 0, "y1": 546, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 547, "mark": null, "x": 547, - "y0": null, + "y0": 0, "y1": 547, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 548, "mark": null, "x": 548, - "y0": null, + "y0": 0, "y1": 548, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 549, "mark": null, "x": 549, - "y0": null, + "y0": 0, "y1": 549, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 550, "mark": null, "x": 550, - "y0": null, + "y0": 0, "y1": 550, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 551, "mark": null, "x": 551, - "y0": null, + "y0": 0, "y1": 551, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 552, "mark": null, "x": 552, - "y0": null, + "y0": 0, "y1": 552, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 553, "mark": null, "x": 553, - "y0": null, + "y0": 0, "y1": 553, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 554, "mark": null, "x": 554, - "y0": null, + "y0": 0, "y1": 554, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 555, "mark": null, "x": 555, - "y0": null, + "y0": 0, "y1": 555, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 556, "mark": null, "x": 556, - "y0": null, + "y0": 0, "y1": 556, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 557, "mark": null, "x": 557, - "y0": null, + "y0": 0, "y1": 557, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 558, "mark": null, "x": 558, - "y0": null, + "y0": 0, "y1": 558, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 559, "mark": null, "x": 559, - "y0": null, + "y0": 0, "y1": 559, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 560, "mark": null, "x": 560, - "y0": null, + "y0": 0, "y1": 560, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 561, "mark": null, "x": 561, - "y0": null, + "y0": 0, "y1": 561, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 562, "mark": null, "x": 562, - "y0": null, + "y0": 0, "y1": 562, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 563, "mark": null, "x": 563, - "y0": null, + "y0": 0, "y1": 563, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 564, "mark": null, "x": 564, - "y0": null, + "y0": 0, "y1": 564, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 565, "mark": null, "x": 565, - "y0": null, + "y0": 0, "y1": 565, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 566, "mark": null, "x": 566, - "y0": null, + "y0": 0, "y1": 566, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 567, "mark": null, "x": 567, - "y0": null, + "y0": 0, "y1": 567, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 568, "mark": null, "x": 568, - "y0": null, + "y0": 0, "y1": 568, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 569, "mark": null, "x": 569, - "y0": null, + "y0": 0, "y1": 569, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 570, "mark": null, "x": 570, - "y0": null, + "y0": 0, "y1": 570, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 571, "mark": null, "x": 571, - "y0": null, + "y0": 0, "y1": 571, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 572, "mark": null, "x": 572, - "y0": null, + "y0": 0, "y1": 572, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 573, "mark": null, "x": 573, - "y0": null, + "y0": 0, "y1": 573, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 574, "mark": null, "x": 574, - "y0": null, + "y0": 0, "y1": 574, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 575, "mark": null, "x": 575, - "y0": null, + "y0": 0, "y1": 575, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 576, "mark": null, "x": 576, - "y0": null, + "y0": 0, "y1": 576, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 577, "mark": null, "x": 577, - "y0": null, + "y0": 0, "y1": 577, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 578, "mark": null, "x": 578, - "y0": null, + "y0": 0, "y1": 578, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 579, "mark": null, "x": 579, - "y0": null, + "y0": 0, "y1": 579, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 580, "mark": null, "x": 580, - "y0": null, + "y0": 0, "y1": 580, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 581, "mark": null, "x": 581, - "y0": null, + "y0": 0, "y1": 581, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 582, "mark": null, "x": 582, - "y0": null, + "y0": 0, "y1": 582, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 583, "mark": null, "x": 583, - "y0": null, + "y0": 0, "y1": 583, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 584, "mark": null, "x": 584, - "y0": null, + "y0": 0, "y1": 584, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 585, "mark": null, "x": 585, - "y0": null, + "y0": 0, "y1": 585, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 586, "mark": null, "x": 586, - "y0": null, + "y0": 0, "y1": 586, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 587, "mark": null, "x": 587, - "y0": null, + "y0": 0, "y1": 587, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 588, "mark": null, "x": 588, - "y0": null, + "y0": 0, "y1": 588, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 589, "mark": null, "x": 589, - "y0": null, + "y0": 0, "y1": 589, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 590, "mark": null, "x": 590, - "y0": null, + "y0": 0, "y1": 590, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 591, "mark": null, "x": 591, - "y0": null, + "y0": 0, "y1": 591, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 592, "mark": null, "x": 592, - "y0": null, + "y0": 0, "y1": 592, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 593, "mark": null, "x": 593, - "y0": null, + "y0": 0, "y1": 593, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 594, "mark": null, "x": 594, - "y0": null, + "y0": 0, "y1": 594, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 595, "mark": null, "x": 595, - "y0": null, + "y0": 0, "y1": 595, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 596, "mark": null, "x": 596, - "y0": null, + "y0": 0, "y1": 596, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 597, "mark": null, "x": 597, - "y0": null, + "y0": 0, "y1": 597, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 598, "mark": null, "x": 598, - "y0": null, + "y0": 0, "y1": 598, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 599, "mark": null, "x": 599, - "y0": null, + "y0": 0, "y1": 599, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 600, "mark": null, "x": 600, - "y0": null, + "y0": 0, "y1": 600, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 601, "mark": null, "x": 601, - "y0": null, + "y0": 0, "y1": 601, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 602, "mark": null, "x": 602, - "y0": null, + "y0": 0, "y1": 602, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 603, "mark": null, "x": 603, - "y0": null, + "y0": 0, "y1": 603, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 604, "mark": null, "x": 604, - "y0": null, + "y0": 0, "y1": 604, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 605, "mark": null, "x": 605, - "y0": null, + "y0": 0, "y1": 605, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 606, "mark": null, "x": 606, - "y0": null, + "y0": 0, "y1": 606, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 607, "mark": null, "x": 607, - "y0": null, + "y0": 0, "y1": 607, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 608, "mark": null, "x": 608, - "y0": null, + "y0": 0, "y1": 608, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 609, "mark": null, "x": 609, - "y0": null, + "y0": 0, "y1": 609, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 610, "mark": null, "x": 610, - "y0": null, + "y0": 0, "y1": 610, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 611, "mark": null, "x": 611, - "y0": null, + "y0": 0, "y1": 611, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 612, "mark": null, "x": 612, - "y0": null, + "y0": 0, "y1": 612, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 613, "mark": null, "x": 613, - "y0": null, + "y0": 0, "y1": 613, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 614, "mark": null, "x": 614, - "y0": null, + "y0": 0, "y1": 614, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 615, "mark": null, "x": 615, - "y0": null, + "y0": 0, "y1": 615, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 616, "mark": null, "x": 616, - "y0": null, + "y0": 0, "y1": 616, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 617, "mark": null, "x": 617, - "y0": null, + "y0": 0, "y1": 617, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 618, "mark": null, "x": 618, - "y0": null, + "y0": 0, "y1": 618, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 619, "mark": null, "x": 619, - "y0": null, + "y0": 0, "y1": 619, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 620, "mark": null, "x": 620, - "y0": null, + "y0": 0, "y1": 620, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 621, "mark": null, "x": 621, - "y0": null, + "y0": 0, "y1": 621, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 622, "mark": null, "x": 622, - "y0": null, + "y0": 0, "y1": 622, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 623, "mark": null, "x": 623, - "y0": null, + "y0": 0, "y1": 623, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 624, "mark": null, "x": 624, - "y0": null, + "y0": 0, "y1": 624, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 625, "mark": null, "x": 625, - "y0": null, + "y0": 0, "y1": 625, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 626, "mark": null, "x": 626, - "y0": null, + "y0": 0, "y1": 626, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 627, "mark": null, "x": 627, - "y0": null, + "y0": 0, "y1": 627, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 628, "mark": null, "x": 628, - "y0": null, + "y0": 0, "y1": 628, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 629, "mark": null, "x": 629, - "y0": null, + "y0": 0, "y1": 629, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 630, "mark": null, "x": 630, - "y0": null, + "y0": 0, "y1": 630, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 631, "mark": null, "x": 631, - "y0": null, + "y0": 0, "y1": 631, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 632, "mark": null, "x": 632, - "y0": null, + "y0": 0, "y1": 632, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 633, "mark": null, "x": 633, - "y0": null, + "y0": 0, "y1": 633, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 634, "mark": null, "x": 634, - "y0": null, + "y0": 0, "y1": 634, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 635, "mark": null, "x": 635, - "y0": null, + "y0": 0, "y1": 635, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 636, "mark": null, "x": 636, - "y0": null, + "y0": 0, "y1": 636, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 637, "mark": null, "x": 637, - "y0": null, + "y0": 0, "y1": 637, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 638, "mark": null, "x": 638, - "y0": null, + "y0": 0, "y1": 638, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 639, "mark": null, "x": 639, - "y0": null, + "y0": 0, "y1": 639, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 640, "mark": null, "x": 640, - "y0": null, + "y0": 0, "y1": 640, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 641, "mark": null, "x": 641, - "y0": null, + "y0": 0, "y1": 641, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 642, "mark": null, "x": 642, - "y0": null, + "y0": 0, "y1": 642, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 643, "mark": null, "x": 643, - "y0": null, + "y0": 0, "y1": 643, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 644, "mark": null, "x": 644, - "y0": null, + "y0": 0, "y1": 644, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 645, "mark": null, "x": 645, - "y0": null, + "y0": 0, "y1": 645, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 646, "mark": null, "x": 646, - "y0": null, + "y0": 0, "y1": 646, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 647, "mark": null, "x": 647, - "y0": null, + "y0": 0, "y1": 647, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 648, "mark": null, "x": 648, - "y0": null, + "y0": 0, "y1": 648, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 649, "mark": null, "x": 649, - "y0": null, + "y0": 0, "y1": 649, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 650, "mark": null, "x": 650, - "y0": null, + "y0": 0, "y1": 650, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 651, "mark": null, "x": 651, - "y0": null, + "y0": 0, "y1": 651, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 652, "mark": null, "x": 652, - "y0": null, + "y0": 0, "y1": 652, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 653, "mark": null, "x": 653, - "y0": null, + "y0": 0, "y1": 653, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 654, "mark": null, "x": 654, - "y0": null, + "y0": 0, "y1": 654, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 655, "mark": null, "x": 655, - "y0": null, + "y0": 0, "y1": 655, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 656, "mark": null, "x": 656, - "y0": null, + "y0": 0, "y1": 656, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 657, "mark": null, "x": 657, - "y0": null, + "y0": 0, "y1": 657, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 658, "mark": null, "x": 658, - "y0": null, + "y0": 0, "y1": 658, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 659, "mark": null, "x": 659, - "y0": null, + "y0": 0, "y1": 659, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 660, "mark": null, "x": 660, - "y0": null, + "y0": 0, "y1": 660, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 661, "mark": null, "x": 661, - "y0": null, + "y0": 0, "y1": 661, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 662, "mark": null, "x": 662, - "y0": null, + "y0": 0, "y1": 662, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 663, "mark": null, "x": 663, - "y0": null, + "y0": 0, "y1": 663, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 664, "mark": null, "x": 664, - "y0": null, + "y0": 0, "y1": 664, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 665, "mark": null, "x": 665, - "y0": null, + "y0": 0, "y1": 665, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 666, "mark": null, "x": 666, - "y0": null, + "y0": 0, "y1": 666, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 667, "mark": null, "x": 667, - "y0": null, + "y0": 0, "y1": 667, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 668, "mark": null, "x": 668, - "y0": null, + "y0": 0, "y1": 668, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 669, "mark": null, "x": 669, - "y0": null, + "y0": 0, "y1": 669, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 670, "mark": null, "x": 670, - "y0": null, + "y0": 0, "y1": 670, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 671, "mark": null, "x": 671, - "y0": null, + "y0": 0, "y1": 671, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 672, "mark": null, "x": 672, - "y0": null, + "y0": 0, "y1": 672, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 673, "mark": null, "x": 673, - "y0": null, + "y0": 0, "y1": 673, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 674, "mark": null, "x": 674, - "y0": null, + "y0": 0, "y1": 674, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 675, "mark": null, "x": 675, - "y0": null, + "y0": 0, "y1": 675, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 676, "mark": null, "x": 676, - "y0": null, + "y0": 0, "y1": 676, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 677, "mark": null, "x": 677, - "y0": null, + "y0": 0, "y1": 677, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 678, "mark": null, "x": 678, - "y0": null, + "y0": 0, "y1": 678, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 679, "mark": null, "x": 679, - "y0": null, + "y0": 0, "y1": 679, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 680, "mark": null, "x": 680, - "y0": null, + "y0": 0, "y1": 680, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 681, "mark": null, "x": 681, - "y0": null, + "y0": 0, "y1": 681, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 682, "mark": null, "x": 682, - "y0": null, + "y0": 0, "y1": 682, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 683, "mark": null, "x": 683, - "y0": null, + "y0": 0, "y1": 683, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 684, "mark": null, "x": 684, - "y0": null, + "y0": 0, "y1": 684, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 685, "mark": null, "x": 685, - "y0": null, + "y0": 0, "y1": 685, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 686, "mark": null, "x": 686, - "y0": null, + "y0": 0, "y1": 686, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 687, "mark": null, "x": 687, - "y0": null, + "y0": 0, "y1": 687, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 688, "mark": null, "x": 688, - "y0": null, + "y0": 0, "y1": 688, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 689, "mark": null, "x": 689, - "y0": null, + "y0": 0, "y1": 689, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 690, "mark": null, "x": 690, - "y0": null, + "y0": 0, "y1": 690, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 691, "mark": null, "x": 691, - "y0": null, + "y0": 0, "y1": 691, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 692, "mark": null, "x": 692, - "y0": null, + "y0": 0, "y1": 692, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 693, "mark": null, "x": 693, - "y0": null, + "y0": 0, "y1": 693, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 694, "mark": null, "x": 694, - "y0": null, + "y0": 0, "y1": 694, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 695, "mark": null, "x": 695, - "y0": null, + "y0": 0, "y1": 695, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 696, "mark": null, "x": 696, - "y0": null, + "y0": 0, "y1": 696, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 697, "mark": null, "x": 697, - "y0": null, + "y0": 0, "y1": 697, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 698, "mark": null, "x": 698, - "y0": null, + "y0": 0, "y1": 698, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 699, "mark": null, "x": 699, - "y0": null, + "y0": 0, "y1": 699, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 700, "mark": null, "x": 700, - "y0": null, + "y0": 0, "y1": 700, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 701, "mark": null, "x": 701, - "y0": null, + "y0": 0, "y1": 701, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 702, "mark": null, "x": 702, - "y0": null, + "y0": 0, "y1": 702, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 703, "mark": null, "x": 703, - "y0": null, + "y0": 0, "y1": 703, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 704, "mark": null, "x": 704, - "y0": null, + "y0": 0, "y1": 704, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 705, "mark": null, "x": 705, - "y0": null, + "y0": 0, "y1": 705, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 706, "mark": null, "x": 706, - "y0": null, + "y0": 0, "y1": 706, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 707, "mark": null, "x": 707, - "y0": null, + "y0": 0, "y1": 707, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 708, "mark": null, "x": 708, - "y0": null, + "y0": 0, "y1": 708, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 709, "mark": null, "x": 709, - "y0": null, + "y0": 0, "y1": 709, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 710, "mark": null, "x": 710, - "y0": null, + "y0": 0, "y1": 710, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 711, "mark": null, "x": 711, - "y0": null, + "y0": 0, "y1": 711, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 712, "mark": null, "x": 712, - "y0": null, + "y0": 0, "y1": 712, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 713, "mark": null, "x": 713, - "y0": null, + "y0": 0, "y1": 713, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 714, "mark": null, "x": 714, - "y0": null, + "y0": 0, "y1": 714, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 715, "mark": null, "x": 715, - "y0": null, + "y0": 0, "y1": 715, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 716, "mark": null, "x": 716, - "y0": null, + "y0": 0, "y1": 716, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 717, "mark": null, "x": 717, - "y0": null, + "y0": 0, "y1": 717, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 718, "mark": null, "x": 718, - "y0": null, + "y0": 0, "y1": 718, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 719, "mark": null, "x": 719, - "y0": null, + "y0": 0, "y1": 719, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 720, "mark": null, "x": 720, - "y0": null, + "y0": 0, "y1": 720, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 721, "mark": null, "x": 721, - "y0": null, + "y0": 0, "y1": 721, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 722, "mark": null, "x": 722, - "y0": null, + "y0": 0, "y1": 722, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 723, "mark": null, "x": 723, - "y0": null, + "y0": 0, "y1": 723, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 724, "mark": null, "x": 724, - "y0": null, + "y0": 0, "y1": 724, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 725, "mark": null, "x": 725, - "y0": null, + "y0": 0, "y1": 725, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 726, "mark": null, "x": 726, - "y0": null, + "y0": 0, "y1": 726, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 727, "mark": null, "x": 727, - "y0": null, + "y0": 0, "y1": 727, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 728, "mark": null, "x": 728, - "y0": null, + "y0": 0, "y1": 728, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 729, "mark": null, "x": 729, - "y0": null, + "y0": 0, "y1": 729, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 730, "mark": null, "x": 730, - "y0": null, + "y0": 0, "y1": 730, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 731, "mark": null, "x": 731, - "y0": null, + "y0": 0, "y1": 731, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 732, "mark": null, "x": 732, - "y0": null, + "y0": 0, "y1": 732, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 733, "mark": null, "x": 733, - "y0": null, + "y0": 0, "y1": 733, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 734, "mark": null, "x": 734, - "y0": null, + "y0": 0, "y1": 734, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 735, "mark": null, "x": 735, - "y0": null, + "y0": 0, "y1": 735, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 736, "mark": null, "x": 736, - "y0": null, + "y0": 0, "y1": 736, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 737, "mark": null, "x": 737, - "y0": null, + "y0": 0, "y1": 737, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 738, "mark": null, "x": 738, - "y0": null, + "y0": 0, "y1": 738, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 739, "mark": null, "x": 739, - "y0": null, + "y0": 0, "y1": 739, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 740, "mark": null, "x": 740, - "y0": null, + "y0": 0, "y1": 740, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 741, "mark": null, "x": 741, - "y0": null, + "y0": 0, "y1": 741, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 742, "mark": null, "x": 742, - "y0": null, + "y0": 0, "y1": 742, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 743, "mark": null, "x": 743, - "y0": null, + "y0": 0, "y1": 743, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 744, "mark": null, "x": 744, - "y0": null, + "y0": 0, "y1": 744, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 745, "mark": null, "x": 745, - "y0": null, + "y0": 0, "y1": 745, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 746, "mark": null, "x": 746, - "y0": null, + "y0": 0, "y1": 746, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 747, "mark": null, "x": 747, - "y0": null, + "y0": 0, "y1": 747, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 748, "mark": null, "x": 748, - "y0": null, + "y0": 0, "y1": 748, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 749, "mark": null, "x": 749, - "y0": null, + "y0": 0, "y1": 749, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 750, "mark": null, "x": 750, - "y0": null, + "y0": 0, "y1": 750, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 751, "mark": null, "x": 751, - "y0": null, + "y0": 0, "y1": 751, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 752, "mark": null, "x": 752, - "y0": null, + "y0": 0, "y1": 752, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 753, "mark": null, "x": 753, - "y0": null, + "y0": 0, "y1": 753, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 754, "mark": null, "x": 754, - "y0": null, + "y0": 0, "y1": 754, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 755, "mark": null, "x": 755, - "y0": null, + "y0": 0, "y1": 755, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 756, "mark": null, "x": 756, - "y0": null, + "y0": 0, "y1": 756, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 757, "mark": null, "x": 757, - "y0": null, + "y0": 0, "y1": 757, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 758, "mark": null, "x": 758, - "y0": null, + "y0": 0, "y1": 758, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 759, "mark": null, "x": 759, - "y0": null, + "y0": 0, "y1": 759, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 760, "mark": null, "x": 760, - "y0": null, + "y0": 0, "y1": 760, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 761, "mark": null, "x": 761, - "y0": null, + "y0": 0, "y1": 761, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 762, "mark": null, "x": 762, - "y0": null, + "y0": 0, "y1": 762, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 763, "mark": null, "x": 763, - "y0": null, + "y0": 0, "y1": 763, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 764, "mark": null, "x": 764, - "y0": null, + "y0": 0, "y1": 764, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 765, "mark": null, "x": 765, - "y0": null, + "y0": 0, "y1": 765, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 766, "mark": null, "x": 766, - "y0": null, + "y0": 0, "y1": 766, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 767, "mark": null, "x": 767, - "y0": null, + "y0": 0, "y1": 767, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 768, "mark": null, "x": 768, - "y0": null, + "y0": 0, "y1": 768, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 769, "mark": null, "x": 769, - "y0": null, + "y0": 0, "y1": 769, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 770, "mark": null, "x": 770, - "y0": null, + "y0": 0, "y1": 770, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 771, "mark": null, "x": 771, - "y0": null, + "y0": 0, "y1": 771, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 772, "mark": null, "x": 772, - "y0": null, + "y0": 0, "y1": 772, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 773, "mark": null, "x": 773, - "y0": null, + "y0": 0, "y1": 773, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 774, "mark": null, "x": 774, - "y0": null, + "y0": 0, "y1": 774, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 775, "mark": null, "x": 775, - "y0": null, + "y0": 0, "y1": 775, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 776, "mark": null, "x": 776, - "y0": null, + "y0": 0, "y1": 776, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 777, "mark": null, "x": 777, - "y0": null, + "y0": 0, "y1": 777, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 778, "mark": null, "x": 778, - "y0": null, + "y0": 0, "y1": 778, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 779, "mark": null, "x": 779, - "y0": null, + "y0": 0, "y1": 779, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 780, "mark": null, "x": 780, - "y0": null, + "y0": 0, "y1": 780, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 781, "mark": null, "x": 781, - "y0": null, + "y0": 0, "y1": 781, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 782, "mark": null, "x": 782, - "y0": null, + "y0": 0, "y1": 782, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 783, "mark": null, "x": 783, - "y0": null, + "y0": 0, "y1": 783, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 784, "mark": null, "x": 784, - "y0": null, + "y0": 0, "y1": 784, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 785, "mark": null, "x": 785, - "y0": null, + "y0": 0, "y1": 785, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 786, "mark": null, "x": 786, - "y0": null, + "y0": 0, "y1": 786, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 787, "mark": null, "x": 787, - "y0": null, + "y0": 0, "y1": 787, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 788, "mark": null, "x": 788, - "y0": null, + "y0": 0, "y1": 788, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 789, "mark": null, "x": 789, - "y0": null, + "y0": 0, "y1": 789, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 790, "mark": null, "x": 790, - "y0": null, + "y0": 0, "y1": 790, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 791, "mark": null, "x": 791, - "y0": null, + "y0": 0, "y1": 791, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 792, "mark": null, "x": 792, - "y0": null, + "y0": 0, "y1": 792, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 793, "mark": null, "x": 793, - "y0": null, + "y0": 0, "y1": 793, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 794, "mark": null, "x": 794, - "y0": null, + "y0": 0, "y1": 794, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 795, "mark": null, "x": 795, - "y0": null, + "y0": 0, "y1": 795, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 796, "mark": null, "x": 796, - "y0": null, + "y0": 0, "y1": 796, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 797, "mark": null, "x": 797, - "y0": null, + "y0": 0, "y1": 797, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 798, "mark": null, "x": 798, - "y0": null, + "y0": 0, "y1": 798, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 799, "mark": null, "x": 799, - "y0": null, + "y0": 0, "y1": 799, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 800, "mark": null, "x": 800, - "y0": null, + "y0": 0, "y1": 800, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 801, "mark": null, "x": 801, - "y0": null, + "y0": 0, "y1": 801, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 802, "mark": null, "x": 802, - "y0": null, + "y0": 0, "y1": 802, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 803, "mark": null, "x": 803, - "y0": null, + "y0": 0, "y1": 803, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 804, "mark": null, "x": 804, - "y0": null, + "y0": 0, "y1": 804, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 805, "mark": null, "x": 805, - "y0": null, + "y0": 0, "y1": 805, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 806, "mark": null, "x": 806, - "y0": null, + "y0": 0, "y1": 806, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 807, "mark": null, "x": 807, - "y0": null, + "y0": 0, "y1": 807, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 808, "mark": null, "x": 808, - "y0": null, + "y0": 0, "y1": 808, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 809, "mark": null, "x": 809, - "y0": null, + "y0": 0, "y1": 809, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 810, "mark": null, "x": 810, - "y0": null, + "y0": 0, "y1": 810, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 811, "mark": null, "x": 811, - "y0": null, + "y0": 0, "y1": 811, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 812, "mark": null, "x": 812, - "y0": null, + "y0": 0, "y1": 812, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 813, "mark": null, "x": 813, - "y0": null, + "y0": 0, "y1": 813, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 814, "mark": null, "x": 814, - "y0": null, + "y0": 0, "y1": 814, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 815, "mark": null, "x": 815, - "y0": null, + "y0": 0, "y1": 815, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 816, "mark": null, "x": 816, - "y0": null, + "y0": 0, "y1": 816, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 817, "mark": null, "x": 817, - "y0": null, + "y0": 0, "y1": 817, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 818, "mark": null, "x": 818, - "y0": null, + "y0": 0, "y1": 818, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 819, "mark": null, "x": 819, - "y0": null, + "y0": 0, "y1": 819, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 820, "mark": null, "x": 820, - "y0": null, + "y0": 0, "y1": 820, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 821, "mark": null, "x": 821, - "y0": null, + "y0": 0, "y1": 821, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 822, "mark": null, "x": 822, - "y0": null, + "y0": 0, "y1": 822, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 823, "mark": null, "x": 823, - "y0": null, + "y0": 0, "y1": 823, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 824, "mark": null, "x": 824, - "y0": null, + "y0": 0, "y1": 824, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 825, "mark": null, "x": 825, - "y0": null, + "y0": 0, "y1": 825, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 826, "mark": null, "x": 826, - "y0": null, + "y0": 0, "y1": 826, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 827, "mark": null, "x": 827, - "y0": null, + "y0": 0, "y1": 827, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 828, "mark": null, "x": 828, - "y0": null, + "y0": 0, "y1": 828, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 829, "mark": null, "x": 829, - "y0": null, + "y0": 0, "y1": 829, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 830, "mark": null, "x": 830, - "y0": null, + "y0": 0, "y1": 830, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 831, "mark": null, "x": 831, - "y0": null, + "y0": 0, "y1": 831, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 832, "mark": null, "x": 832, - "y0": null, + "y0": 0, "y1": 832, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 833, "mark": null, "x": 833, - "y0": null, + "y0": 0, "y1": 833, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 834, "mark": null, "x": 834, - "y0": null, + "y0": 0, "y1": 834, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 835, "mark": null, "x": 835, - "y0": null, + "y0": 0, "y1": 835, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 836, "mark": null, "x": 836, - "y0": null, + "y0": 0, "y1": 836, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 837, "mark": null, "x": 837, - "y0": null, + "y0": 0, "y1": 837, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 838, "mark": null, "x": 838, - "y0": null, + "y0": 0, "y1": 838, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 839, "mark": null, "x": 839, - "y0": null, + "y0": 0, "y1": 839, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 840, "mark": null, "x": 840, - "y0": null, + "y0": 0, "y1": 840, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 841, "mark": null, "x": 841, - "y0": null, + "y0": 0, "y1": 841, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 842, "mark": null, "x": 842, - "y0": null, + "y0": 0, "y1": 842, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 843, "mark": null, "x": 843, - "y0": null, + "y0": 0, "y1": 843, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 844, "mark": null, "x": 844, - "y0": null, + "y0": 0, "y1": 844, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 845, "mark": null, "x": 845, - "y0": null, + "y0": 0, "y1": 845, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 846, "mark": null, "x": 846, - "y0": null, + "y0": 0, "y1": 846, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 847, "mark": null, "x": 847, - "y0": null, + "y0": 0, "y1": 847, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 848, "mark": null, "x": 848, - "y0": null, + "y0": 0, "y1": 848, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 849, "mark": null, "x": 849, - "y0": null, + "y0": 0, "y1": 849, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 850, "mark": null, "x": 850, - "y0": null, + "y0": 0, "y1": 850, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 851, "mark": null, "x": 851, - "y0": null, + "y0": 0, "y1": 851, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 852, "mark": null, "x": 852, - "y0": null, + "y0": 0, "y1": 852, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 853, "mark": null, "x": 853, - "y0": null, + "y0": 0, "y1": 853, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 854, "mark": null, "x": 854, - "y0": null, + "y0": 0, "y1": 854, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 855, "mark": null, "x": 855, - "y0": null, + "y0": 0, "y1": 855, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 856, "mark": null, "x": 856, - "y0": null, + "y0": 0, "y1": 856, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 857, "mark": null, "x": 857, - "y0": null, + "y0": 0, "y1": 857, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 858, "mark": null, "x": 858, - "y0": null, + "y0": 0, "y1": 858, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 859, "mark": null, "x": 859, - "y0": null, + "y0": 0, "y1": 859, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 860, "mark": null, "x": 860, - "y0": null, + "y0": 0, "y1": 860, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 861, "mark": null, "x": 861, - "y0": null, + "y0": 0, "y1": 861, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 862, "mark": null, "x": 862, - "y0": null, + "y0": 0, "y1": 862, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 863, "mark": null, "x": 863, - "y0": null, + "y0": 0, "y1": 863, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 864, "mark": null, "x": 864, - "y0": null, + "y0": 0, "y1": 864, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 865, "mark": null, "x": 865, - "y0": null, + "y0": 0, "y1": 865, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 866, "mark": null, "x": 866, - "y0": null, + "y0": 0, "y1": 866, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 867, "mark": null, "x": 867, - "y0": null, + "y0": 0, "y1": 867, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 868, "mark": null, "x": 868, - "y0": null, + "y0": 0, "y1": 868, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 869, "mark": null, "x": 869, - "y0": null, + "y0": 0, "y1": 869, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 870, "mark": null, "x": 870, - "y0": null, + "y0": 0, "y1": 870, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 871, "mark": null, "x": 871, - "y0": null, + "y0": 0, "y1": 871, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 872, "mark": null, "x": 872, - "y0": null, + "y0": 0, "y1": 872, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 873, "mark": null, "x": 873, - "y0": null, + "y0": 0, "y1": 873, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 874, "mark": null, "x": 874, - "y0": null, + "y0": 0, "y1": 874, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 875, "mark": null, "x": 875, - "y0": null, + "y0": 0, "y1": 875, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 876, "mark": null, "x": 876, - "y0": null, + "y0": 0, "y1": 876, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 877, "mark": null, "x": 877, - "y0": null, + "y0": 0, "y1": 877, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 878, "mark": null, "x": 878, - "y0": null, + "y0": 0, "y1": 878, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 879, "mark": null, "x": 879, - "y0": null, + "y0": 0, "y1": 879, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 880, "mark": null, "x": 880, - "y0": null, + "y0": 0, "y1": 880, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 881, "mark": null, "x": 881, - "y0": null, + "y0": 0, "y1": 881, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 882, "mark": null, "x": 882, - "y0": null, + "y0": 0, "y1": 882, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 883, "mark": null, "x": 883, - "y0": null, + "y0": 0, "y1": 883, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 884, "mark": null, "x": 884, - "y0": null, + "y0": 0, "y1": 884, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 885, "mark": null, "x": 885, - "y0": null, + "y0": 0, "y1": 885, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 886, "mark": null, "x": 886, - "y0": null, + "y0": 0, "y1": 886, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 887, "mark": null, "x": 887, - "y0": null, + "y0": 0, "y1": 887, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 888, "mark": null, "x": 888, - "y0": null, + "y0": 0, "y1": 888, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 889, "mark": null, "x": 889, - "y0": null, + "y0": 0, "y1": 889, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 890, "mark": null, "x": 890, - "y0": null, + "y0": 0, "y1": 890, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 891, "mark": null, "x": 891, - "y0": null, + "y0": 0, "y1": 891, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 892, "mark": null, "x": 892, - "y0": null, + "y0": 0, "y1": 892, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 893, "mark": null, "x": 893, - "y0": null, + "y0": 0, "y1": 893, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 894, "mark": null, "x": 894, - "y0": null, + "y0": 0, "y1": 894, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 895, "mark": null, "x": 895, - "y0": null, + "y0": 0, "y1": 895, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 896, "mark": null, "x": 896, - "y0": null, + "y0": 0, "y1": 896, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 897, "mark": null, "x": 897, - "y0": null, + "y0": 0, "y1": 897, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 898, "mark": null, "x": 898, - "y0": null, + "y0": 0, "y1": 898, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 899, "mark": null, "x": 899, - "y0": null, + "y0": 0, "y1": 899, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 900, "mark": null, "x": 900, - "y0": null, + "y0": 0, "y1": 900, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 901, "mark": null, "x": 901, - "y0": null, + "y0": 0, "y1": 901, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 902, "mark": null, "x": 902, - "y0": null, + "y0": 0, "y1": 902, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 903, "mark": null, "x": 903, - "y0": null, + "y0": 0, "y1": 903, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 904, "mark": null, "x": 904, - "y0": null, + "y0": 0, "y1": 904, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 905, "mark": null, "x": 905, - "y0": null, + "y0": 0, "y1": 905, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 906, "mark": null, "x": 906, - "y0": null, + "y0": 0, "y1": 906, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 907, "mark": null, "x": 907, - "y0": null, + "y0": 0, "y1": 907, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 908, "mark": null, "x": 908, - "y0": null, + "y0": 0, "y1": 908, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 909, "mark": null, "x": 909, - "y0": null, + "y0": 0, "y1": 909, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 910, "mark": null, "x": 910, - "y0": null, + "y0": 0, "y1": 910, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 911, "mark": null, "x": 911, - "y0": null, + "y0": 0, "y1": 911, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 912, "mark": null, "x": 912, - "y0": null, + "y0": 0, "y1": 912, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 913, "mark": null, "x": 913, - "y0": null, + "y0": 0, "y1": 913, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 914, "mark": null, "x": 914, - "y0": null, + "y0": 0, "y1": 914, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 915, "mark": null, "x": 915, - "y0": null, + "y0": 0, "y1": 915, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 916, "mark": null, "x": 916, - "y0": null, + "y0": 0, "y1": 916, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 917, "mark": null, "x": 917, - "y0": null, + "y0": 0, "y1": 917, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 918, "mark": null, "x": 918, - "y0": null, + "y0": 0, "y1": 918, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 919, "mark": null, "x": 919, - "y0": null, + "y0": 0, "y1": 919, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 920, "mark": null, "x": 920, - "y0": null, + "y0": 0, "y1": 920, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 921, "mark": null, "x": 921, - "y0": null, + "y0": 0, "y1": 921, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 922, "mark": null, "x": 922, - "y0": null, + "y0": 0, "y1": 922, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 923, "mark": null, "x": 923, - "y0": null, + "y0": 0, "y1": 923, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 924, "mark": null, "x": 924, - "y0": null, + "y0": 0, "y1": 924, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 925, "mark": null, "x": 925, - "y0": null, + "y0": 0, "y1": 925, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 926, "mark": null, "x": 926, - "y0": null, + "y0": 0, "y1": 926, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 927, "mark": null, "x": 927, - "y0": null, + "y0": 0, "y1": 927, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 928, "mark": null, "x": 928, - "y0": null, + "y0": 0, "y1": 928, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 929, "mark": null, "x": 929, - "y0": null, + "y0": 0, "y1": 929, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 930, "mark": null, "x": 930, - "y0": null, + "y0": 0, "y1": 930, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 931, "mark": null, "x": 931, - "y0": null, + "y0": 0, "y1": 931, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 932, "mark": null, "x": 932, - "y0": null, + "y0": 0, "y1": 932, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 933, "mark": null, "x": 933, - "y0": null, + "y0": 0, "y1": 933, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 934, "mark": null, "x": 934, - "y0": null, + "y0": 0, "y1": 934, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 935, "mark": null, "x": 935, - "y0": null, + "y0": 0, "y1": 935, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 936, "mark": null, "x": 936, - "y0": null, + "y0": 0, "y1": 936, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 937, "mark": null, "x": 937, - "y0": null, + "y0": 0, "y1": 937, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 938, "mark": null, "x": 938, - "y0": null, + "y0": 0, "y1": 938, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 939, "mark": null, "x": 939, - "y0": null, + "y0": 0, "y1": 939, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 940, "mark": null, "x": 940, - "y0": null, + "y0": 0, "y1": 940, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 941, "mark": null, "x": 941, - "y0": null, + "y0": 0, "y1": 941, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 942, "mark": null, "x": 942, - "y0": null, + "y0": 0, "y1": 942, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 943, "mark": null, "x": 943, - "y0": null, + "y0": 0, "y1": 943, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 944, "mark": null, "x": 944, - "y0": null, + "y0": 0, "y1": 944, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 945, "mark": null, "x": 945, - "y0": null, + "y0": 0, "y1": 945, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 946, "mark": null, "x": 946, - "y0": null, + "y0": 0, "y1": 946, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 947, "mark": null, "x": 947, - "y0": null, + "y0": 0, "y1": 947, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 948, "mark": null, "x": 948, - "y0": null, + "y0": 0, "y1": 948, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 949, "mark": null, "x": 949, - "y0": null, + "y0": 0, "y1": 949, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 950, "mark": null, "x": 950, - "y0": null, + "y0": 0, "y1": 950, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 951, "mark": null, "x": 951, - "y0": null, + "y0": 0, "y1": 951, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 952, "mark": null, "x": 952, - "y0": null, + "y0": 0, "y1": 952, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 953, "mark": null, "x": 953, - "y0": null, + "y0": 0, "y1": 953, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 954, "mark": null, "x": 954, - "y0": null, + "y0": 0, "y1": 954, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 955, "mark": null, "x": 955, - "y0": null, + "y0": 0, "y1": 955, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 956, "mark": null, "x": 956, - "y0": null, + "y0": 0, "y1": 956, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 957, "mark": null, "x": 957, - "y0": null, + "y0": 0, "y1": 957, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 958, "mark": null, "x": 958, - "y0": null, + "y0": 0, "y1": 958, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 959, "mark": null, "x": 959, - "y0": null, + "y0": 0, "y1": 959, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 960, "mark": null, "x": 960, - "y0": null, + "y0": 0, "y1": 960, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 961, "mark": null, "x": 961, - "y0": null, + "y0": 0, "y1": 961, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 962, "mark": null, "x": 962, - "y0": null, + "y0": 0, "y1": 962, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 963, "mark": null, "x": 963, - "y0": null, + "y0": 0, "y1": 963, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 964, "mark": null, "x": 964, - "y0": null, + "y0": 0, "y1": 964, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 965, "mark": null, "x": 965, - "y0": null, + "y0": 0, "y1": 965, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 966, "mark": null, "x": 966, - "y0": null, + "y0": 0, "y1": 966, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 967, "mark": null, "x": 967, - "y0": null, + "y0": 0, "y1": 967, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 968, "mark": null, "x": 968, - "y0": null, + "y0": 0, "y1": 968, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 969, "mark": null, "x": 969, - "y0": null, + "y0": 0, "y1": 969, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 970, "mark": null, "x": 970, - "y0": null, + "y0": 0, "y1": 970, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 971, "mark": null, "x": 971, - "y0": null, + "y0": 0, "y1": 971, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 972, "mark": null, "x": 972, - "y0": null, + "y0": 0, "y1": 972, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 973, "mark": null, "x": 973, - "y0": null, + "y0": 0, "y1": 973, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 974, "mark": null, "x": 974, - "y0": null, + "y0": 0, "y1": 974, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 975, "mark": null, "x": 975, - "y0": null, + "y0": 0, "y1": 975, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 976, "mark": null, "x": 976, - "y0": null, + "y0": 0, "y1": 976, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 977, "mark": null, "x": 977, - "y0": null, + "y0": 0, "y1": 977, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 978, "mark": null, "x": 978, - "y0": null, + "y0": 0, "y1": 978, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 979, "mark": null, "x": 979, - "y0": null, + "y0": 0, "y1": 979, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 980, "mark": null, "x": 980, - "y0": null, + "y0": 0, "y1": 980, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 981, "mark": null, "x": 981, - "y0": null, + "y0": 0, "y1": 981, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 982, "mark": null, "x": 982, - "y0": null, + "y0": 0, "y1": 982, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 983, "mark": null, "x": 983, - "y0": null, + "y0": 0, "y1": 983, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 984, "mark": null, "x": 984, - "y0": null, + "y0": 0, "y1": 984, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 985, "mark": null, "x": 985, - "y0": null, + "y0": 0, "y1": 985, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 986, "mark": null, "x": 986, - "y0": null, + "y0": 0, "y1": 986, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 987, "mark": null, "x": 987, - "y0": null, + "y0": 0, "y1": 987, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 988, "mark": null, "x": 988, - "y0": null, + "y0": 0, "y1": 988, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 989, "mark": null, "x": 989, - "y0": null, + "y0": 0, "y1": 989, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 990, "mark": null, "x": 990, - "y0": null, + "y0": 0, "y1": 990, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 991, "mark": null, "x": 991, - "y0": null, + "y0": 0, "y1": 991, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 992, "mark": null, "x": 992, - "y0": null, + "y0": 0, "y1": 992, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 993, "mark": null, "x": 993, - "y0": null, + "y0": 0, "y1": 993, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 994, "mark": null, "x": 994, - "y0": null, + "y0": 0, "y1": 994, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 995, "mark": null, "x": 995, - "y0": null, + "y0": 0, "y1": 995, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 996, "mark": null, "x": 996, - "y0": null, + "y0": 0, "y1": 996, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 997, "mark": null, "x": 997, - "y0": null, + "y0": 0, "y1": 997, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 998, "mark": null, "x": 998, - "y0": null, + "y0": 0, "y1": 998, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 999, "mark": null, "x": 999, - "y0": null, + "y0": 0, "y1": 999, }, ], @@ -10504,6 +11688,7 @@ Array [ "data": Array [ Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 0, "mark": null, @@ -10513,6 +11698,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 1, "mark": null, @@ -10522,6 +11708,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 2, "mark": null, @@ -10531,6 +11718,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 3, "mark": null, @@ -10540,6 +11728,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 4, "mark": null, @@ -10549,6 +11738,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 5, "mark": null, @@ -10558,6 +11748,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 6, "mark": null, @@ -10567,6 +11758,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 7, "mark": null, @@ -10576,6 +11768,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 8, "mark": null, @@ -10585,6 +11778,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 9, "mark": null, @@ -10594,6 +11788,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 10, "mark": null, @@ -10603,6 +11798,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 11, "mark": null, @@ -10612,6 +11808,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 12, "mark": null, @@ -10621,6 +11818,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 13, "mark": null, @@ -10630,6 +11828,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 14, "mark": null, @@ -10639,6 +11838,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 15, "mark": null, @@ -10648,6 +11848,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 16, "mark": null, @@ -10657,6 +11858,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 17, "mark": null, @@ -10666,6 +11868,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 18, "mark": null, @@ -10675,6 +11878,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 19, "mark": null, @@ -10684,6 +11888,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 20, "mark": null, @@ -10693,6 +11898,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 21, "mark": null, @@ -10702,6 +11908,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 22, "mark": null, @@ -10711,6 +11918,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 23, "mark": null, @@ -10720,6 +11928,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 24, "mark": null, @@ -10729,6 +11938,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 25, "mark": null, @@ -10738,6 +11948,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 26, "mark": null, @@ -10747,6 +11958,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 27, "mark": null, @@ -10756,6 +11968,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 28, "mark": null, @@ -10765,6 +11978,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 29, "mark": null, @@ -10774,6 +11988,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 30, "mark": null, @@ -10783,6 +11998,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 31, "mark": null, @@ -10792,6 +12008,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 32, "mark": null, @@ -10801,6 +12018,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 33, "mark": null, @@ -10810,6 +12028,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 34, "mark": null, @@ -10819,6 +12038,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 35, "mark": null, @@ -10828,6 +12048,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 36, "mark": null, @@ -10837,6 +12058,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 37, "mark": null, @@ -10846,6 +12068,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 38, "mark": null, @@ -10855,6 +12078,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 39, "mark": null, @@ -10864,6 +12088,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 40, "mark": null, @@ -10873,6 +12098,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 41, "mark": null, @@ -10882,6 +12108,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 42, "mark": null, @@ -10891,6 +12118,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 43, "mark": null, @@ -10900,6 +12128,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 44, "mark": null, @@ -10909,6 +12138,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 45, "mark": null, @@ -10918,6 +12148,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 46, "mark": null, @@ -10927,6 +12158,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 47, "mark": null, @@ -10936,6 +12168,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 48, "mark": null, @@ -10945,6 +12178,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 49, "mark": null, @@ -10954,6 +12188,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 50, "mark": null, @@ -10963,6 +12198,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 51, "mark": null, @@ -10972,6 +12208,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 52, "mark": null, @@ -10981,6 +12218,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 53, "mark": null, @@ -10990,6 +12228,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 54, "mark": null, @@ -10999,6 +12238,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 55, "mark": null, @@ -11008,6 +12248,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 56, "mark": null, @@ -11017,6 +12258,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 57, "mark": null, @@ -11026,6 +12268,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 58, "mark": null, @@ -11035,6 +12278,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 59, "mark": null, @@ -11044,6 +12288,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 60, "mark": null, @@ -11053,6 +12298,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 61, "mark": null, @@ -11062,6 +12308,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 62, "mark": null, @@ -11071,6 +12318,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 63, "mark": null, @@ -11080,6 +12328,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 64, "mark": null, @@ -11089,6 +12338,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 65, "mark": null, @@ -11098,6 +12348,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 66, "mark": null, @@ -11107,6 +12358,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 67, "mark": null, @@ -11116,6 +12368,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 68, "mark": null, @@ -11125,6 +12378,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 69, "mark": null, @@ -11134,6 +12388,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 70, "mark": null, @@ -11143,6 +12398,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 71, "mark": null, @@ -11152,6 +12408,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 72, "mark": null, @@ -11161,6 +12418,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 73, "mark": null, @@ -11170,6 +12428,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 74, "mark": null, @@ -11179,6 +12438,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 75, "mark": null, @@ -11188,6 +12448,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 76, "mark": null, @@ -11197,6 +12458,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 77, "mark": null, @@ -11206,6 +12468,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 78, "mark": null, @@ -11215,6 +12478,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 79, "mark": null, @@ -11224,6 +12488,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 80, "mark": null, @@ -11233,6 +12498,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 81, "mark": null, @@ -11242,6 +12508,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 82, "mark": null, @@ -11251,6 +12518,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 83, "mark": null, @@ -11260,6 +12528,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 84, "mark": null, @@ -11269,6 +12538,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 85, "mark": null, @@ -11278,6 +12548,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 86, "mark": null, @@ -11287,6 +12558,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 87, "mark": null, @@ -11296,6 +12568,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 88, "mark": null, @@ -11305,6 +12578,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 89, "mark": null, @@ -11314,6 +12588,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 90, "mark": null, @@ -11323,6 +12598,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 91, "mark": null, @@ -11332,6 +12608,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 92, "mark": null, @@ -11341,6 +12618,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 93, "mark": null, @@ -11350,6 +12628,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 94, "mark": null, @@ -11359,6 +12638,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 95, "mark": null, @@ -11368,6 +12648,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 96, "mark": null, @@ -11377,6 +12658,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 97, "mark": null, @@ -11386,6 +12668,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 98, "mark": null, @@ -11395,6 +12678,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 99, "mark": null, @@ -11404,6 +12688,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 100, "mark": null, @@ -11413,6 +12698,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 101, "mark": null, @@ -11422,6 +12708,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 102, "mark": null, @@ -11431,6 +12718,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 103, "mark": null, @@ -11440,6 +12728,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 104, "mark": null, @@ -11449,6 +12738,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 105, "mark": null, @@ -11458,6 +12748,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 106, "mark": null, @@ -11467,6 +12758,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 107, "mark": null, @@ -11476,6 +12768,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 108, "mark": null, @@ -11485,6 +12778,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 109, "mark": null, @@ -11494,6 +12788,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 110, "mark": null, @@ -11503,6 +12798,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 111, "mark": null, @@ -11512,6 +12808,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 112, "mark": null, @@ -11521,6 +12818,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 113, "mark": null, @@ -11530,6 +12828,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 114, "mark": null, @@ -11539,6 +12838,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 115, "mark": null, @@ -11548,6 +12848,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 116, "mark": null, @@ -11557,6 +12858,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 117, "mark": null, @@ -11566,6 +12868,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 118, "mark": null, @@ -11575,6 +12878,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 119, "mark": null, @@ -11584,6 +12888,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 120, "mark": null, @@ -11593,6 +12898,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 121, "mark": null, @@ -11602,6 +12908,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 122, "mark": null, @@ -11611,6 +12918,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 123, "mark": null, @@ -11620,6 +12928,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 124, "mark": null, @@ -11629,6 +12938,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 125, "mark": null, @@ -11638,6 +12948,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 126, "mark": null, @@ -11647,6 +12958,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 127, "mark": null, @@ -11656,6 +12968,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 128, "mark": null, @@ -11665,6 +12978,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 129, "mark": null, @@ -11674,6 +12988,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 130, "mark": null, @@ -11683,6 +12998,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 131, "mark": null, @@ -11692,6 +13008,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 132, "mark": null, @@ -11701,6 +13018,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 133, "mark": null, @@ -11710,6 +13028,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 134, "mark": null, @@ -11719,6 +13038,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 135, "mark": null, @@ -11728,6 +13048,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 136, "mark": null, @@ -11737,6 +13058,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 137, "mark": null, @@ -11746,6 +13068,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 138, "mark": null, @@ -11755,6 +13078,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 139, "mark": null, @@ -11764,6 +13088,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 140, "mark": null, @@ -11773,6 +13098,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 141, "mark": null, @@ -11782,6 +13108,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 142, "mark": null, @@ -11791,6 +13118,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 143, "mark": null, @@ -11800,6 +13128,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 144, "mark": null, @@ -11809,6 +13138,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 145, "mark": null, @@ -11818,6 +13148,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 146, "mark": null, @@ -11827,6 +13158,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 147, "mark": null, @@ -11836,6 +13168,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 148, "mark": null, @@ -11845,6 +13178,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 149, "mark": null, @@ -11854,6 +13188,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 150, "mark": null, @@ -11863,6 +13198,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 151, "mark": null, @@ -11872,6 +13208,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 152, "mark": null, @@ -11881,6 +13218,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 153, "mark": null, @@ -11890,6 +13228,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 154, "mark": null, @@ -11899,6 +13238,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 155, "mark": null, @@ -11908,6 +13248,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 156, "mark": null, @@ -11917,6 +13258,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 157, "mark": null, @@ -11926,6 +13268,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 158, "mark": null, @@ -11935,6 +13278,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 159, "mark": null, @@ -11944,6 +13288,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 160, "mark": null, @@ -11953,6 +13298,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 161, "mark": null, @@ -11962,6 +13308,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 162, "mark": null, @@ -11971,6 +13318,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 163, "mark": null, @@ -11980,6 +13328,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 164, "mark": null, @@ -11989,6 +13338,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 165, "mark": null, @@ -11998,6 +13348,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 166, "mark": null, @@ -12007,6 +13358,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 167, "mark": null, @@ -12016,6 +13368,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 168, "mark": null, @@ -12025,6 +13378,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 169, "mark": null, @@ -12034,6 +13388,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 170, "mark": null, @@ -12043,6 +13398,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 171, "mark": null, @@ -12052,6 +13408,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 172, "mark": null, @@ -12061,6 +13418,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 173, "mark": null, @@ -12070,6 +13428,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 174, "mark": null, @@ -12079,6 +13438,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 175, "mark": null, @@ -12088,6 +13448,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 176, "mark": null, @@ -12097,6 +13458,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 177, "mark": null, @@ -12106,6 +13468,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 178, "mark": null, @@ -12115,6 +13478,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 179, "mark": null, @@ -12124,6 +13488,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 180, "mark": null, @@ -12133,6 +13498,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 181, "mark": null, @@ -12142,6 +13508,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 182, "mark": null, @@ -12151,6 +13518,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 183, "mark": null, @@ -12160,6 +13528,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 184, "mark": null, @@ -12169,6 +13538,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 185, "mark": null, @@ -12178,6 +13548,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 186, "mark": null, @@ -12187,6 +13558,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 187, "mark": null, @@ -12196,6 +13568,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 188, "mark": null, @@ -12205,6 +13578,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 189, "mark": null, @@ -12214,6 +13588,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 190, "mark": null, @@ -12223,6 +13598,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 191, "mark": null, @@ -12232,6 +13608,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 192, "mark": null, @@ -12241,6 +13618,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 193, "mark": null, @@ -12250,6 +13628,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 194, "mark": null, @@ -12259,6 +13638,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 195, "mark": null, @@ -12268,6 +13648,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 196, "mark": null, @@ -12277,6 +13658,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 197, "mark": null, @@ -12286,6 +13668,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 198, "mark": null, @@ -12295,6 +13678,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 199, "mark": null, @@ -12304,6 +13688,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 200, "mark": null, @@ -12313,6 +13698,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 201, "mark": null, @@ -12322,6 +13708,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 202, "mark": null, @@ -12331,6 +13718,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 203, "mark": null, @@ -12340,6 +13728,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 204, "mark": null, @@ -12349,6 +13738,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 205, "mark": null, @@ -12358,6 +13748,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 206, "mark": null, @@ -12367,6 +13758,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 207, "mark": null, @@ -12376,6 +13768,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 208, "mark": null, @@ -12385,6 +13778,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 209, "mark": null, @@ -12394,6 +13788,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 210, "mark": null, @@ -12403,6 +13798,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 211, "mark": null, @@ -12412,6 +13808,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 212, "mark": null, @@ -12421,6 +13818,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 213, "mark": null, @@ -12430,6 +13828,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 214, "mark": null, @@ -12439,6 +13838,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 215, "mark": null, @@ -12448,6 +13848,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 216, "mark": null, @@ -12457,6 +13858,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 217, "mark": null, @@ -12466,6 +13868,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 218, "mark": null, @@ -12475,6 +13878,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 219, "mark": null, @@ -12484,6 +13888,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 220, "mark": null, @@ -12493,6 +13898,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 221, "mark": null, @@ -12502,6 +13908,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 222, "mark": null, @@ -12511,6 +13918,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 223, "mark": null, @@ -12520,6 +13928,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 224, "mark": null, @@ -12529,6 +13938,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 225, "mark": null, @@ -12538,6 +13948,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 226, "mark": null, @@ -12547,6 +13958,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 227, "mark": null, @@ -12556,6 +13968,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 228, "mark": null, @@ -12565,6 +13978,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 229, "mark": null, @@ -12574,6 +13988,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 230, "mark": null, @@ -12583,6 +13998,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 231, "mark": null, @@ -12592,6 +14008,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 232, "mark": null, @@ -12601,6 +14018,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 233, "mark": null, @@ -12610,6 +14028,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 234, "mark": null, @@ -12619,6 +14038,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 235, "mark": null, @@ -12628,6 +14048,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 236, "mark": null, @@ -12637,6 +14058,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 237, "mark": null, @@ -12646,6 +14068,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 238, "mark": null, @@ -12655,6 +14078,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 239, "mark": null, @@ -12664,6 +14088,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 240, "mark": null, @@ -12673,6 +14098,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 241, "mark": null, @@ -12682,6 +14108,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 242, "mark": null, @@ -12691,6 +14118,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 243, "mark": null, @@ -12700,6 +14128,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 244, "mark": null, @@ -12709,6 +14138,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 245, "mark": null, @@ -12718,6 +14148,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 246, "mark": null, @@ -12727,6 +14158,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 247, "mark": null, @@ -12736,6 +14168,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 248, "mark": null, @@ -12745,6 +14178,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 249, "mark": null, @@ -12754,6 +14188,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 250, "mark": null, @@ -12763,6 +14198,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 251, "mark": null, @@ -12772,6 +14208,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 252, "mark": null, @@ -12781,6 +14218,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 253, "mark": null, @@ -12790,6 +14228,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 254, "mark": null, @@ -12799,6 +14238,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 255, "mark": null, @@ -12808,6 +14248,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 256, "mark": null, @@ -12817,6 +14258,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 257, "mark": null, @@ -12826,6 +14268,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 258, "mark": null, @@ -12835,6 +14278,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 259, "mark": null, @@ -12844,6 +14288,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 260, "mark": null, @@ -12853,6 +14298,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 261, "mark": null, @@ -12862,6 +14308,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 262, "mark": null, @@ -12871,6 +14318,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 263, "mark": null, @@ -12880,6 +14328,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 264, "mark": null, @@ -12889,6 +14338,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 265, "mark": null, @@ -12898,6 +14348,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 266, "mark": null, @@ -12907,6 +14358,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 267, "mark": null, @@ -12916,6 +14368,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 268, "mark": null, @@ -12925,6 +14378,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 269, "mark": null, @@ -12934,6 +14388,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 270, "mark": null, @@ -12943,6 +14398,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 271, "mark": null, @@ -12952,6 +14408,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 272, "mark": null, @@ -12961,6 +14418,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 273, "mark": null, @@ -12970,6 +14428,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 274, "mark": null, @@ -12979,6 +14438,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 275, "mark": null, @@ -12988,6 +14448,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 276, "mark": null, @@ -12997,6 +14458,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 277, "mark": null, @@ -13006,6 +14468,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 278, "mark": null, @@ -13015,6 +14478,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 279, "mark": null, @@ -13024,6 +14488,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 280, "mark": null, @@ -13033,6 +14498,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 281, "mark": null, @@ -13042,6 +14508,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 282, "mark": null, @@ -13051,6 +14518,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 283, "mark": null, @@ -13060,6 +14528,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 284, "mark": null, @@ -13069,6 +14538,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 285, "mark": null, @@ -13078,6 +14548,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 286, "mark": null, @@ -13087,6 +14558,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 287, "mark": null, @@ -13096,6 +14568,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 288, "mark": null, @@ -13105,6 +14578,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 289, "mark": null, @@ -13114,6 +14588,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 290, "mark": null, @@ -13123,6 +14598,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 291, "mark": null, @@ -13132,6 +14608,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 292, "mark": null, @@ -13141,6 +14618,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 293, "mark": null, @@ -13150,6 +14628,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 294, "mark": null, @@ -13159,6 +14638,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 295, "mark": null, @@ -13168,6 +14648,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 296, "mark": null, @@ -13177,6 +14658,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 297, "mark": null, @@ -13186,6 +14668,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 298, "mark": null, @@ -13195,6 +14678,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 299, "mark": null, @@ -13204,6 +14688,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 300, "mark": null, @@ -13213,6 +14698,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 301, "mark": null, @@ -13222,6 +14708,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 302, "mark": null, @@ -13231,6 +14718,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 303, "mark": null, @@ -13240,6 +14728,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 304, "mark": null, @@ -13249,6 +14738,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 305, "mark": null, @@ -13258,6 +14748,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 306, "mark": null, @@ -13267,6 +14758,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 307, "mark": null, @@ -13276,6 +14768,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 308, "mark": null, @@ -13285,6 +14778,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 309, "mark": null, @@ -13294,6 +14788,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 310, "mark": null, @@ -13303,6 +14798,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 311, "mark": null, @@ -13312,6 +14808,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 312, "mark": null, @@ -13321,6 +14818,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 313, "mark": null, @@ -13330,6 +14828,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 314, "mark": null, @@ -13339,6 +14838,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 315, "mark": null, @@ -13348,6 +14848,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 316, "mark": null, @@ -13357,6 +14858,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 317, "mark": null, @@ -13366,6 +14868,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 318, "mark": null, @@ -13375,6 +14878,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 319, "mark": null, @@ -13384,6 +14888,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 320, "mark": null, @@ -13393,6 +14898,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 321, "mark": null, @@ -13402,6 +14908,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 322, "mark": null, @@ -13411,6 +14918,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 323, "mark": null, @@ -13420,6 +14928,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 324, "mark": null, @@ -13429,6 +14938,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 325, "mark": null, @@ -13438,6 +14948,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 326, "mark": null, @@ -13447,6 +14958,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 327, "mark": null, @@ -13456,6 +14968,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 328, "mark": null, @@ -13465,6 +14978,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 329, "mark": null, @@ -13474,6 +14988,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 330, "mark": null, @@ -13483,6 +14998,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 331, "mark": null, @@ -13492,6 +15008,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 332, "mark": null, @@ -13501,6 +15018,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 333, "mark": null, @@ -13510,6 +15028,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 334, "mark": null, @@ -13519,6 +15038,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 335, "mark": null, @@ -13528,6 +15048,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 336, "mark": null, @@ -13537,6 +15058,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 337, "mark": null, @@ -13546,6 +15068,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 338, "mark": null, @@ -13555,6 +15078,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 339, "mark": null, @@ -13564,6 +15088,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 340, "mark": null, @@ -13573,6 +15098,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 341, "mark": null, @@ -13582,6 +15108,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 342, "mark": null, @@ -13591,6 +15118,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 343, "mark": null, @@ -13600,6 +15128,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 344, "mark": null, @@ -13609,6 +15138,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 345, "mark": null, @@ -13618,6 +15148,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 346, "mark": null, @@ -13627,6 +15158,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 347, "mark": null, @@ -13636,6 +15168,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 348, "mark": null, @@ -13645,6 +15178,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 349, "mark": null, @@ -13654,6 +15188,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 350, "mark": null, @@ -13663,6 +15198,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 351, "mark": null, @@ -13672,6 +15208,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 352, "mark": null, @@ -13681,6 +15218,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 353, "mark": null, @@ -13690,6 +15228,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 354, "mark": null, @@ -13699,6 +15238,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 355, "mark": null, @@ -13708,6 +15248,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 356, "mark": null, @@ -13717,6 +15258,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 357, "mark": null, @@ -13726,6 +15268,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 358, "mark": null, @@ -13735,6 +15278,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 359, "mark": null, @@ -13744,6 +15288,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 360, "mark": null, @@ -13753,6 +15298,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 361, "mark": null, @@ -13762,6 +15308,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 362, "mark": null, @@ -13771,6 +15318,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 363, "mark": null, @@ -13780,6 +15328,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 364, "mark": null, @@ -13789,6 +15338,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 365, "mark": null, @@ -13798,6 +15348,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 366, "mark": null, @@ -13807,6 +15358,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 367, "mark": null, @@ -13816,6 +15368,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 368, "mark": null, @@ -13825,6 +15378,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 369, "mark": null, @@ -13834,6 +15388,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 370, "mark": null, @@ -13843,6 +15398,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 371, "mark": null, @@ -13852,6 +15408,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 372, "mark": null, @@ -13861,6 +15418,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 373, "mark": null, @@ -13870,6 +15428,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 374, "mark": null, @@ -13879,6 +15438,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 375, "mark": null, @@ -13888,6 +15448,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 376, "mark": null, @@ -13897,6 +15458,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 377, "mark": null, @@ -13906,6 +15468,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 378, "mark": null, @@ -13915,6 +15478,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 379, "mark": null, @@ -13924,6 +15488,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 380, "mark": null, @@ -13933,6 +15498,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 381, "mark": null, @@ -13942,6 +15508,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 382, "mark": null, @@ -13951,6 +15518,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 383, "mark": null, @@ -13960,6 +15528,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 384, "mark": null, @@ -13969,6 +15538,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 385, "mark": null, @@ -13978,6 +15548,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 386, "mark": null, @@ -13987,6 +15558,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 387, "mark": null, @@ -13996,6 +15568,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 388, "mark": null, @@ -14005,6 +15578,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 389, "mark": null, @@ -14014,6 +15588,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 390, "mark": null, @@ -14023,6 +15598,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 391, "mark": null, @@ -14032,6 +15608,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 392, "mark": null, @@ -14041,6 +15618,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 393, "mark": null, @@ -14050,6 +15628,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 394, "mark": null, @@ -14059,6 +15638,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 395, "mark": null, @@ -14068,6 +15648,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 396, "mark": null, @@ -14077,6 +15658,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 397, "mark": null, @@ -14086,6 +15668,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 398, "mark": null, @@ -14095,6 +15678,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 399, "mark": null, @@ -14104,6 +15688,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 400, "mark": null, @@ -14113,6 +15698,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 401, "mark": null, @@ -14122,6 +15708,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 402, "mark": null, @@ -14131,6 +15718,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 403, "mark": null, @@ -14140,6 +15728,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 404, "mark": null, @@ -14149,6 +15738,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 405, "mark": null, @@ -14158,6 +15748,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 406, "mark": null, @@ -14167,6 +15758,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 407, "mark": null, @@ -14176,6 +15768,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 408, "mark": null, @@ -14185,6 +15778,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 409, "mark": null, @@ -14194,6 +15788,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 410, "mark": null, @@ -14203,6 +15798,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 411, "mark": null, @@ -14212,6 +15808,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 412, "mark": null, @@ -14221,6 +15818,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 413, "mark": null, @@ -14230,6 +15828,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 414, "mark": null, @@ -14239,6 +15838,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 415, "mark": null, @@ -14248,6 +15848,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 416, "mark": null, @@ -14257,6 +15858,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 417, "mark": null, @@ -14266,6 +15868,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 418, "mark": null, @@ -14275,6 +15878,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 419, "mark": null, @@ -14284,6 +15888,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 420, "mark": null, @@ -14293,6 +15898,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 421, "mark": null, @@ -14302,6 +15908,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 422, "mark": null, @@ -14311,6 +15918,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 423, "mark": null, @@ -14320,6 +15928,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 424, "mark": null, @@ -14329,6 +15938,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 425, "mark": null, @@ -14338,6 +15948,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 426, "mark": null, @@ -14347,6 +15958,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 427, "mark": null, @@ -14356,6 +15968,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 428, "mark": null, @@ -14365,6 +15978,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 429, "mark": null, @@ -14374,6 +15988,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 430, "mark": null, @@ -14383,6 +15998,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 431, "mark": null, @@ -14392,6 +16008,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 432, "mark": null, @@ -14401,6 +16018,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 433, "mark": null, @@ -14410,6 +16028,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 434, "mark": null, @@ -14419,6 +16038,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 435, "mark": null, @@ -14428,6 +16048,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 436, "mark": null, @@ -14437,6 +16058,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 437, "mark": null, @@ -14446,6 +16068,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 438, "mark": null, @@ -14455,6 +16078,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 439, "mark": null, @@ -14464,6 +16088,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 440, "mark": null, @@ -14473,6 +16098,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 441, "mark": null, @@ -14482,6 +16108,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 442, "mark": null, @@ -14491,6 +16118,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 443, "mark": null, @@ -14500,6 +16128,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 444, "mark": null, @@ -14509,6 +16138,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 445, "mark": null, @@ -14518,6 +16148,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 446, "mark": null, @@ -14527,6 +16158,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 447, "mark": null, @@ -14536,6 +16168,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 448, "mark": null, @@ -14545,6 +16178,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 449, "mark": null, @@ -14554,6 +16188,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 450, "mark": null, @@ -14563,6 +16198,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 451, "mark": null, @@ -14572,6 +16208,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 452, "mark": null, @@ -14581,6 +16218,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 453, "mark": null, @@ -14590,6 +16228,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 454, "mark": null, @@ -14599,6 +16238,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 455, "mark": null, @@ -14608,6 +16248,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 456, "mark": null, @@ -14617,6 +16258,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 457, "mark": null, @@ -14626,6 +16268,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 458, "mark": null, @@ -14635,6 +16278,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 459, "mark": null, @@ -14644,6 +16288,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 460, "mark": null, @@ -14653,6 +16298,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 461, "mark": null, @@ -14662,6 +16308,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 462, "mark": null, @@ -14671,6 +16318,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 463, "mark": null, @@ -14680,6 +16328,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 464, "mark": null, @@ -14689,6 +16338,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 465, "mark": null, @@ -14698,6 +16348,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 466, "mark": null, @@ -14707,6 +16358,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 467, "mark": null, @@ -14716,6 +16368,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 468, "mark": null, @@ -14725,6 +16378,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 469, "mark": null, @@ -14734,6 +16388,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 470, "mark": null, @@ -14743,6 +16398,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 471, "mark": null, @@ -14752,6 +16408,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 472, "mark": null, @@ -14761,6 +16418,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 473, "mark": null, @@ -14770,6 +16428,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 474, "mark": null, @@ -14779,6 +16438,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 475, "mark": null, @@ -14788,6 +16448,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 476, "mark": null, @@ -14797,6 +16458,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 477, "mark": null, @@ -14806,6 +16468,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 478, "mark": null, @@ -14815,6 +16478,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 479, "mark": null, @@ -14824,6 +16488,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 480, "mark": null, @@ -14833,6 +16498,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 481, "mark": null, @@ -14842,6 +16508,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 482, "mark": null, @@ -14851,6 +16518,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 483, "mark": null, @@ -14860,6 +16528,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 484, "mark": null, @@ -14869,6 +16538,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 485, "mark": null, @@ -14878,6 +16548,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 486, "mark": null, @@ -14887,6 +16558,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 487, "mark": null, @@ -14896,6 +16568,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 488, "mark": null, @@ -14905,6 +16578,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 489, "mark": null, @@ -14914,6 +16588,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 490, "mark": null, @@ -14923,6 +16598,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 491, "mark": null, @@ -14932,6 +16608,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 492, "mark": null, @@ -14941,6 +16618,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 493, "mark": null, @@ -14950,6 +16628,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 494, "mark": null, @@ -14959,6 +16638,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 495, "mark": null, @@ -14968,6 +16648,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 496, "mark": null, @@ -14977,6 +16658,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 497, "mark": null, @@ -14986,6 +16668,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 498, "mark": null, @@ -14995,6 +16678,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 499, "mark": null, @@ -15004,6 +16688,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 500, "mark": null, @@ -15013,6 +16698,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 501, "mark": null, @@ -15022,6 +16708,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 502, "mark": null, @@ -15031,6 +16718,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 503, "mark": null, @@ -15040,6 +16728,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 504, "mark": null, @@ -15049,6 +16738,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 505, "mark": null, @@ -15058,6 +16748,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 506, "mark": null, @@ -15067,6 +16758,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 507, "mark": null, @@ -15076,6 +16768,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 508, "mark": null, @@ -15085,6 +16778,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 509, "mark": null, @@ -15094,6 +16788,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 510, "mark": null, @@ -15103,6 +16798,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 511, "mark": null, @@ -15112,6 +16808,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 512, "mark": null, @@ -15121,6 +16818,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 513, "mark": null, @@ -15130,6 +16828,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 514, "mark": null, @@ -15139,6 +16838,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 515, "mark": null, @@ -15148,6 +16848,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 516, "mark": null, @@ -15157,6 +16858,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 517, "mark": null, @@ -15166,6 +16868,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 518, "mark": null, @@ -15175,6 +16878,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 519, "mark": null, @@ -15184,6 +16888,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 520, "mark": null, @@ -15193,6 +16898,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 521, "mark": null, @@ -15202,6 +16908,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 522, "mark": null, @@ -15211,6 +16918,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 523, "mark": null, @@ -15220,6 +16928,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 524, "mark": null, @@ -15229,6 +16938,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 525, "mark": null, @@ -15238,6 +16948,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 526, "mark": null, @@ -15247,6 +16958,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 527, "mark": null, @@ -15256,6 +16968,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 528, "mark": null, @@ -15265,6 +16978,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 529, "mark": null, @@ -15274,6 +16988,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 530, "mark": null, @@ -15283,6 +16998,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 531, "mark": null, @@ -15292,6 +17008,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 532, "mark": null, @@ -15301,6 +17018,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 533, "mark": null, @@ -15310,6 +17028,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 534, "mark": null, @@ -15319,6 +17038,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 535, "mark": null, @@ -15328,6 +17048,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 536, "mark": null, @@ -15337,6 +17058,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 537, "mark": null, @@ -15346,6 +17068,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 538, "mark": null, @@ -15355,6 +17078,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 539, "mark": null, @@ -15364,6 +17088,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 540, "mark": null, @@ -15373,6 +17098,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 541, "mark": null, @@ -15382,6 +17108,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 542, "mark": null, @@ -15391,6 +17118,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 543, "mark": null, @@ -15400,6 +17128,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 544, "mark": null, @@ -15409,6 +17138,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 545, "mark": null, @@ -15418,6 +17148,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 546, "mark": null, @@ -15427,6 +17158,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 547, "mark": null, @@ -15436,6 +17168,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 548, "mark": null, @@ -15445,6 +17178,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 549, "mark": null, @@ -15454,6 +17188,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 550, "mark": null, @@ -15463,6 +17198,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 551, "mark": null, @@ -15472,6 +17208,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 552, "mark": null, @@ -15481,6 +17218,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 553, "mark": null, @@ -15490,6 +17228,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 554, "mark": null, @@ -15499,6 +17238,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 555, "mark": null, @@ -15508,6 +17248,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 556, "mark": null, @@ -15517,6 +17258,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 557, "mark": null, @@ -15526,6 +17268,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 558, "mark": null, @@ -15535,6 +17278,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 559, "mark": null, @@ -15544,6 +17288,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 560, "mark": null, @@ -15553,6 +17298,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 561, "mark": null, @@ -15562,6 +17308,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 562, "mark": null, @@ -15571,6 +17318,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 563, "mark": null, @@ -15580,6 +17328,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 564, "mark": null, @@ -15589,6 +17338,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 565, "mark": null, @@ -15598,6 +17348,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 566, "mark": null, @@ -15607,6 +17358,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 567, "mark": null, @@ -15616,6 +17368,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 568, "mark": null, @@ -15625,6 +17378,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 569, "mark": null, @@ -15634,6 +17388,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 570, "mark": null, @@ -15643,6 +17398,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 571, "mark": null, @@ -15652,6 +17408,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 572, "mark": null, @@ -15661,6 +17418,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 573, "mark": null, @@ -15670,6 +17428,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 574, "mark": null, @@ -15679,6 +17438,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 575, "mark": null, @@ -15688,6 +17448,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 576, "mark": null, @@ -15697,6 +17458,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 577, "mark": null, @@ -15706,6 +17468,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 578, "mark": null, @@ -15715,6 +17478,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 579, "mark": null, @@ -15724,6 +17488,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 580, "mark": null, @@ -15733,6 +17498,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 581, "mark": null, @@ -15742,6 +17508,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 582, "mark": null, @@ -15751,6 +17518,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 583, "mark": null, @@ -15760,6 +17528,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 584, "mark": null, @@ -15769,6 +17538,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 585, "mark": null, @@ -15778,6 +17548,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 586, "mark": null, @@ -15787,6 +17558,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 587, "mark": null, @@ -15796,6 +17568,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 588, "mark": null, @@ -15805,6 +17578,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 589, "mark": null, @@ -15814,6 +17588,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 590, "mark": null, @@ -15823,6 +17598,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 591, "mark": null, @@ -15832,6 +17608,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 592, "mark": null, @@ -15841,6 +17618,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 593, "mark": null, @@ -15850,6 +17628,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 594, "mark": null, @@ -15859,6 +17638,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 595, "mark": null, @@ -15868,6 +17648,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 596, "mark": null, @@ -15877,6 +17658,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 597, "mark": null, @@ -15886,6 +17668,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 598, "mark": null, @@ -15895,6 +17678,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 599, "mark": null, @@ -15904,6 +17688,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 600, "mark": null, @@ -15913,6 +17698,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 601, "mark": null, @@ -15922,6 +17708,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 602, "mark": null, @@ -15931,6 +17718,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 603, "mark": null, @@ -15940,6 +17728,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 604, "mark": null, @@ -15949,6 +17738,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 605, "mark": null, @@ -15958,6 +17748,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 606, "mark": null, @@ -15967,6 +17758,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 607, "mark": null, @@ -15976,6 +17768,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 608, "mark": null, @@ -15985,6 +17778,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 609, "mark": null, @@ -15994,6 +17788,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 610, "mark": null, @@ -16003,6 +17798,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 611, "mark": null, @@ -16012,6 +17808,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 612, "mark": null, @@ -16021,6 +17818,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 613, "mark": null, @@ -16030,6 +17828,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 614, "mark": null, @@ -16039,6 +17838,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 615, "mark": null, @@ -16048,6 +17848,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 616, "mark": null, @@ -16057,6 +17858,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 617, "mark": null, @@ -16066,6 +17868,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 618, "mark": null, @@ -16075,6 +17878,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 619, "mark": null, @@ -16084,6 +17888,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 620, "mark": null, @@ -16093,6 +17898,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 621, "mark": null, @@ -16102,6 +17908,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 622, "mark": null, @@ -16111,6 +17918,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 623, "mark": null, @@ -16120,6 +17928,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 624, "mark": null, @@ -16129,6 +17938,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 625, "mark": null, @@ -16138,6 +17948,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 626, "mark": null, @@ -16147,6 +17958,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 627, "mark": null, @@ -16156,6 +17968,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 628, "mark": null, @@ -16165,6 +17978,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 629, "mark": null, @@ -16174,6 +17988,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 630, "mark": null, @@ -16183,6 +17998,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 631, "mark": null, @@ -16192,6 +18008,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 632, "mark": null, @@ -16201,6 +18018,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 633, "mark": null, @@ -16210,6 +18028,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 634, "mark": null, @@ -16219,6 +18038,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 635, "mark": null, @@ -16228,6 +18048,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 636, "mark": null, @@ -16237,6 +18058,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 637, "mark": null, @@ -16246,6 +18068,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 638, "mark": null, @@ -16255,6 +18078,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 639, "mark": null, @@ -16264,6 +18088,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 640, "mark": null, @@ -16273,6 +18098,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 641, "mark": null, @@ -16282,6 +18108,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 642, "mark": null, @@ -16291,6 +18118,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 643, "mark": null, @@ -16300,6 +18128,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 644, "mark": null, @@ -16309,6 +18138,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 645, "mark": null, @@ -16318,6 +18148,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 646, "mark": null, @@ -16327,6 +18158,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 647, "mark": null, @@ -16336,6 +18168,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 648, "mark": null, @@ -16345,6 +18178,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 649, "mark": null, @@ -16354,6 +18188,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 650, "mark": null, @@ -16363,6 +18198,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 651, "mark": null, @@ -16372,6 +18208,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 652, "mark": null, @@ -16381,6 +18218,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 653, "mark": null, @@ -16390,6 +18228,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 654, "mark": null, @@ -16399,6 +18238,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 655, "mark": null, @@ -16408,6 +18248,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 656, "mark": null, @@ -16417,6 +18258,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 657, "mark": null, @@ -16426,6 +18268,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 658, "mark": null, @@ -16435,6 +18278,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 659, "mark": null, @@ -16444,6 +18288,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 660, "mark": null, @@ -16453,6 +18298,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 661, "mark": null, @@ -16462,6 +18308,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 662, "mark": null, @@ -16471,6 +18318,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 663, "mark": null, @@ -16480,6 +18328,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 664, "mark": null, @@ -16489,6 +18338,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 665, "mark": null, @@ -16498,6 +18348,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 666, "mark": null, @@ -16507,6 +18358,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 667, "mark": null, @@ -16516,6 +18368,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 668, "mark": null, @@ -16525,6 +18378,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 669, "mark": null, @@ -16534,6 +18388,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 670, "mark": null, @@ -16543,6 +18398,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 671, "mark": null, @@ -16552,6 +18408,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 672, "mark": null, @@ -16561,6 +18418,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 673, "mark": null, @@ -16570,6 +18428,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 674, "mark": null, @@ -16579,6 +18438,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 675, "mark": null, @@ -16588,6 +18448,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 676, "mark": null, @@ -16597,6 +18458,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 677, "mark": null, @@ -16606,6 +18468,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 678, "mark": null, @@ -16615,6 +18478,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 679, "mark": null, @@ -16624,6 +18488,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 680, "mark": null, @@ -16633,6 +18498,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 681, "mark": null, @@ -16642,6 +18508,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 682, "mark": null, @@ -16651,6 +18518,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 683, "mark": null, @@ -16660,6 +18528,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 684, "mark": null, @@ -16669,6 +18538,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 685, "mark": null, @@ -16678,6 +18548,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 686, "mark": null, @@ -16687,6 +18558,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 687, "mark": null, @@ -16696,6 +18568,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 688, "mark": null, @@ -16705,6 +18578,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 689, "mark": null, @@ -16714,6 +18588,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 690, "mark": null, @@ -16723,6 +18598,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 691, "mark": null, @@ -16732,6 +18608,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 692, "mark": null, @@ -16741,6 +18618,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 693, "mark": null, @@ -16750,6 +18628,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 694, "mark": null, @@ -16759,6 +18638,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 695, "mark": null, @@ -16768,6 +18648,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 696, "mark": null, @@ -16777,6 +18658,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 697, "mark": null, @@ -16786,6 +18668,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 698, "mark": null, @@ -16795,6 +18678,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 699, "mark": null, @@ -16804,6 +18688,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 700, "mark": null, @@ -16813,6 +18698,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 701, "mark": null, @@ -16822,6 +18708,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 702, "mark": null, @@ -16831,6 +18718,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 703, "mark": null, @@ -16840,6 +18728,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 704, "mark": null, @@ -16849,6 +18738,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 705, "mark": null, @@ -16858,6 +18748,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 706, "mark": null, @@ -16867,6 +18758,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 707, "mark": null, @@ -16876,6 +18768,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 708, "mark": null, @@ -16885,6 +18778,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 709, "mark": null, @@ -16894,6 +18788,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 710, "mark": null, @@ -16903,6 +18798,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 711, "mark": null, @@ -16912,6 +18808,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 712, "mark": null, @@ -16921,6 +18818,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 713, "mark": null, @@ -16930,6 +18828,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 714, "mark": null, @@ -16939,6 +18838,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 715, "mark": null, @@ -16948,6 +18848,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 716, "mark": null, @@ -16957,6 +18858,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 717, "mark": null, @@ -16966,6 +18868,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 718, "mark": null, @@ -16975,6 +18878,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 719, "mark": null, @@ -16984,6 +18888,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 720, "mark": null, @@ -16993,6 +18898,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 721, "mark": null, @@ -17002,6 +18908,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 722, "mark": null, @@ -17011,6 +18918,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 723, "mark": null, @@ -17020,6 +18928,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 724, "mark": null, @@ -17029,6 +18938,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 725, "mark": null, @@ -17038,6 +18948,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 726, "mark": null, @@ -17047,6 +18958,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 727, "mark": null, @@ -17056,6 +18968,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 728, "mark": null, @@ -17065,6 +18978,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 729, "mark": null, @@ -17074,6 +18988,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 730, "mark": null, @@ -17083,6 +18998,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 731, "mark": null, @@ -17092,6 +19008,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 732, "mark": null, @@ -17101,6 +19018,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 733, "mark": null, @@ -17110,6 +19028,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 734, "mark": null, @@ -17119,6 +19038,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 735, "mark": null, @@ -17128,6 +19048,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 736, "mark": null, @@ -17137,6 +19058,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 737, "mark": null, @@ -17146,6 +19068,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 738, "mark": null, @@ -17155,6 +19078,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 739, "mark": null, @@ -17164,6 +19088,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 740, "mark": null, @@ -17173,6 +19098,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 741, "mark": null, @@ -17182,6 +19108,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 742, "mark": null, @@ -17191,6 +19118,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 743, "mark": null, @@ -17200,6 +19128,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 744, "mark": null, @@ -17209,6 +19138,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 745, "mark": null, @@ -17218,6 +19148,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 746, "mark": null, @@ -17227,6 +19158,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 747, "mark": null, @@ -17236,6 +19168,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 748, "mark": null, @@ -17245,6 +19178,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 749, "mark": null, @@ -17254,6 +19188,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 750, "mark": null, @@ -17263,6 +19198,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 751, "mark": null, @@ -17272,6 +19208,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 752, "mark": null, @@ -17281,6 +19218,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 753, "mark": null, @@ -17290,6 +19228,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 754, "mark": null, @@ -17299,6 +19238,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 755, "mark": null, @@ -17308,6 +19248,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 756, "mark": null, @@ -17317,6 +19258,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 757, "mark": null, @@ -17326,6 +19268,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 758, "mark": null, @@ -17335,6 +19278,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 759, "mark": null, @@ -17344,6 +19288,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 760, "mark": null, @@ -17353,6 +19298,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 761, "mark": null, @@ -17362,6 +19308,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 762, "mark": null, @@ -17371,6 +19318,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 763, "mark": null, @@ -17380,6 +19328,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 764, "mark": null, @@ -17389,6 +19338,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 765, "mark": null, @@ -17398,6 +19348,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 766, "mark": null, @@ -17407,6 +19358,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 767, "mark": null, @@ -17416,6 +19368,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 768, "mark": null, @@ -17425,6 +19378,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 769, "mark": null, @@ -17434,6 +19388,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 770, "mark": null, @@ -17443,6 +19398,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 771, "mark": null, @@ -17452,6 +19408,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 772, "mark": null, @@ -17461,6 +19418,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 773, "mark": null, @@ -17470,6 +19428,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 774, "mark": null, @@ -17479,6 +19438,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 775, "mark": null, @@ -17488,6 +19448,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 776, "mark": null, @@ -17497,6 +19458,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 777, "mark": null, @@ -17506,6 +19468,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 778, "mark": null, @@ -17515,6 +19478,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 779, "mark": null, @@ -17524,6 +19488,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 780, "mark": null, @@ -17533,6 +19498,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 781, "mark": null, @@ -17542,6 +19508,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 782, "mark": null, @@ -17551,6 +19518,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 783, "mark": null, @@ -17560,6 +19528,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 784, "mark": null, @@ -17569,6 +19538,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 785, "mark": null, @@ -17578,6 +19548,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 786, "mark": null, @@ -17587,6 +19558,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 787, "mark": null, @@ -17596,6 +19568,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 788, "mark": null, @@ -17605,6 +19578,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 789, "mark": null, @@ -17614,6 +19588,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 790, "mark": null, @@ -17623,6 +19598,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 791, "mark": null, @@ -17632,6 +19608,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 792, "mark": null, @@ -17641,6 +19618,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 793, "mark": null, @@ -17650,6 +19628,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 794, "mark": null, @@ -17659,6 +19638,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 795, "mark": null, @@ -17668,6 +19648,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 796, "mark": null, @@ -17677,6 +19658,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 797, "mark": null, @@ -17686,6 +19668,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 798, "mark": null, @@ -17695,6 +19678,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 799, "mark": null, @@ -17704,6 +19688,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 800, "mark": null, @@ -17713,6 +19698,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 801, "mark": null, @@ -17722,6 +19708,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 802, "mark": null, @@ -17731,6 +19718,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 803, "mark": null, @@ -17740,6 +19728,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 804, "mark": null, @@ -17749,6 +19738,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 805, "mark": null, @@ -17758,6 +19748,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 806, "mark": null, @@ -17767,6 +19758,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 807, "mark": null, @@ -17776,6 +19768,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 808, "mark": null, @@ -17785,6 +19778,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 809, "mark": null, @@ -17794,6 +19788,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 810, "mark": null, @@ -17803,6 +19798,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 811, "mark": null, @@ -17812,6 +19808,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 812, "mark": null, @@ -17821,6 +19818,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 813, "mark": null, @@ -17830,6 +19828,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 814, "mark": null, @@ -17839,6 +19838,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 815, "mark": null, @@ -17848,6 +19848,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 816, "mark": null, @@ -17857,6 +19858,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 817, "mark": null, @@ -17866,6 +19868,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 818, "mark": null, @@ -17875,6 +19878,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 819, "mark": null, @@ -17884,6 +19888,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 820, "mark": null, @@ -17893,6 +19898,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 821, "mark": null, @@ -17902,6 +19908,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 822, "mark": null, @@ -17911,6 +19918,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 823, "mark": null, @@ -17920,6 +19928,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 824, "mark": null, @@ -17929,6 +19938,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 825, "mark": null, @@ -17938,6 +19948,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 826, "mark": null, @@ -17947,6 +19958,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 827, "mark": null, @@ -17956,6 +19968,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 828, "mark": null, @@ -17965,6 +19978,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 829, "mark": null, @@ -17974,6 +19988,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 830, "mark": null, @@ -17983,6 +19998,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 831, "mark": null, @@ -17992,6 +20008,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 832, "mark": null, @@ -18001,6 +20018,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 833, "mark": null, @@ -18010,6 +20028,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 834, "mark": null, @@ -18019,6 +20038,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 835, "mark": null, @@ -18028,6 +20048,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 836, "mark": null, @@ -18037,6 +20058,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 837, "mark": null, @@ -18046,6 +20068,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 838, "mark": null, @@ -18055,6 +20078,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 839, "mark": null, @@ -18064,6 +20088,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 840, "mark": null, @@ -18073,6 +20098,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 841, "mark": null, @@ -18082,6 +20108,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 842, "mark": null, @@ -18091,6 +20118,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 843, "mark": null, @@ -18100,6 +20128,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 844, "mark": null, @@ -18109,6 +20138,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 845, "mark": null, @@ -18118,6 +20148,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 846, "mark": null, @@ -18127,6 +20158,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 847, "mark": null, @@ -18136,6 +20168,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 848, "mark": null, @@ -18145,6 +20178,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 849, "mark": null, @@ -18154,6 +20188,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 850, "mark": null, @@ -18163,6 +20198,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 851, "mark": null, @@ -18172,6 +20208,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 852, "mark": null, @@ -18181,6 +20218,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 853, "mark": null, @@ -18190,6 +20228,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 854, "mark": null, @@ -18199,6 +20238,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 855, "mark": null, @@ -18208,6 +20248,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 856, "mark": null, @@ -18217,6 +20258,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 857, "mark": null, @@ -18226,6 +20268,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 858, "mark": null, @@ -18235,6 +20278,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 859, "mark": null, @@ -18244,6 +20288,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 860, "mark": null, @@ -18253,6 +20298,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 861, "mark": null, @@ -18262,6 +20308,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 862, "mark": null, @@ -18271,6 +20318,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 863, "mark": null, @@ -18280,6 +20328,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 864, "mark": null, @@ -18289,6 +20338,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 865, "mark": null, @@ -18298,6 +20348,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 866, "mark": null, @@ -18307,6 +20358,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 867, "mark": null, @@ -18316,6 +20368,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 868, "mark": null, @@ -18325,6 +20378,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 869, "mark": null, @@ -18334,6 +20388,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 870, "mark": null, @@ -18343,6 +20398,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 871, "mark": null, @@ -18352,6 +20408,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 872, "mark": null, @@ -18361,6 +20418,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 873, "mark": null, @@ -18370,6 +20428,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 874, "mark": null, @@ -18379,6 +20438,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 875, "mark": null, @@ -18388,6 +20448,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 876, "mark": null, @@ -18397,6 +20458,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 877, "mark": null, @@ -18406,6 +20468,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 878, "mark": null, @@ -18415,6 +20478,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 879, "mark": null, @@ -18424,6 +20488,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 880, "mark": null, @@ -18433,6 +20498,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 881, "mark": null, @@ -18442,6 +20508,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 882, "mark": null, @@ -18451,6 +20518,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 883, "mark": null, @@ -18460,6 +20528,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 884, "mark": null, @@ -18469,6 +20538,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 885, "mark": null, @@ -18478,6 +20548,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 886, "mark": null, @@ -18487,6 +20558,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 887, "mark": null, @@ -18496,6 +20568,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 888, "mark": null, @@ -18505,6 +20578,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 889, "mark": null, @@ -18514,6 +20588,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 890, "mark": null, @@ -18523,6 +20598,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 891, "mark": null, @@ -18532,6 +20608,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 892, "mark": null, @@ -18541,6 +20618,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 893, "mark": null, @@ -18550,6 +20628,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 894, "mark": null, @@ -18559,6 +20638,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 895, "mark": null, @@ -18568,6 +20648,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 896, "mark": null, @@ -18577,6 +20658,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 897, "mark": null, @@ -18586,6 +20668,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 898, "mark": null, @@ -18595,6 +20678,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 899, "mark": null, @@ -18604,6 +20688,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 900, "mark": null, @@ -18613,6 +20698,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 901, "mark": null, @@ -18622,6 +20708,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 902, "mark": null, @@ -18631,6 +20718,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 903, "mark": null, @@ -18640,6 +20728,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 904, "mark": null, @@ -18649,6 +20738,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 905, "mark": null, @@ -18658,6 +20748,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 906, "mark": null, @@ -18667,6 +20758,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 907, "mark": null, @@ -18676,6 +20768,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 908, "mark": null, @@ -18685,6 +20778,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 909, "mark": null, @@ -18694,6 +20788,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 910, "mark": null, @@ -18703,6 +20798,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 911, "mark": null, @@ -18712,6 +20808,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 912, "mark": null, @@ -18721,6 +20818,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 913, "mark": null, @@ -18730,6 +20828,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 914, "mark": null, @@ -18739,6 +20838,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 915, "mark": null, @@ -18748,6 +20848,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 916, "mark": null, @@ -18757,6 +20858,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 917, "mark": null, @@ -18766,6 +20868,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 918, "mark": null, @@ -18775,6 +20878,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 919, "mark": null, @@ -18784,6 +20888,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 920, "mark": null, @@ -18793,6 +20898,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 921, "mark": null, @@ -18802,6 +20908,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 922, "mark": null, @@ -18811,6 +20918,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 923, "mark": null, @@ -18820,6 +20928,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 924, "mark": null, @@ -18829,6 +20938,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 925, "mark": null, @@ -18838,6 +20948,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 926, "mark": null, @@ -18847,6 +20958,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 927, "mark": null, @@ -18856,6 +20968,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 928, "mark": null, @@ -18865,6 +20978,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 929, "mark": null, @@ -18874,6 +20988,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 930, "mark": null, @@ -18883,6 +20998,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 931, "mark": null, @@ -18892,6 +21008,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 932, "mark": null, @@ -18901,6 +21018,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 933, "mark": null, @@ -18910,6 +21028,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 934, "mark": null, @@ -18919,6 +21038,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 935, "mark": null, @@ -18928,6 +21048,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 936, "mark": null, @@ -18937,6 +21058,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 937, "mark": null, @@ -18946,6 +21068,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 938, "mark": null, @@ -18955,6 +21078,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 939, "mark": null, @@ -18964,6 +21088,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 940, "mark": null, @@ -18973,6 +21098,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 941, "mark": null, @@ -18982,6 +21108,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 942, "mark": null, @@ -18991,6 +21118,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 943, "mark": null, @@ -19000,6 +21128,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 944, "mark": null, @@ -19009,6 +21138,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 945, "mark": null, @@ -19018,6 +21148,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 946, "mark": null, @@ -19027,6 +21158,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 947, "mark": null, @@ -19036,6 +21168,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 948, "mark": null, @@ -19045,6 +21178,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 949, "mark": null, @@ -19054,6 +21188,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 950, "mark": null, @@ -19063,6 +21198,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 951, "mark": null, @@ -19072,6 +21208,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 952, "mark": null, @@ -19081,6 +21218,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 953, "mark": null, @@ -19090,6 +21228,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 954, "mark": null, @@ -19099,6 +21238,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 955, "mark": null, @@ -19108,6 +21248,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 956, "mark": null, @@ -19117,6 +21258,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 957, "mark": null, @@ -19126,6 +21268,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 958, "mark": null, @@ -19135,6 +21278,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 959, "mark": null, @@ -19144,6 +21288,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 960, "mark": null, @@ -19153,6 +21298,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 961, "mark": null, @@ -19162,6 +21308,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 962, "mark": null, @@ -19171,6 +21318,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 963, "mark": null, @@ -19180,6 +21328,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 964, "mark": null, @@ -19189,6 +21338,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 965, "mark": null, @@ -19198,6 +21348,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 966, "mark": null, @@ -19207,6 +21358,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 967, "mark": null, @@ -19216,6 +21368,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 968, "mark": null, @@ -19225,6 +21378,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 969, "mark": null, @@ -19234,6 +21388,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 970, "mark": null, @@ -19243,6 +21398,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 971, "mark": null, @@ -19252,6 +21408,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 972, "mark": null, @@ -19261,6 +21418,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 973, "mark": null, @@ -19270,6 +21428,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 974, "mark": null, @@ -19279,6 +21438,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 975, "mark": null, @@ -19288,6 +21448,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 976, "mark": null, @@ -19297,6 +21458,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 977, "mark": null, @@ -19306,6 +21468,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 978, "mark": null, @@ -19315,6 +21478,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 979, "mark": null, @@ -19324,6 +21488,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 980, "mark": null, @@ -19333,6 +21498,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 981, "mark": null, @@ -19342,6 +21508,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 982, "mark": null, @@ -19351,6 +21518,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 983, "mark": null, @@ -19360,6 +21528,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 984, "mark": null, @@ -19369,6 +21538,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 985, "mark": null, @@ -19378,6 +21548,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 986, "mark": null, @@ -19387,6 +21558,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 987, "mark": null, @@ -19396,6 +21568,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 988, "mark": null, @@ -19405,6 +21578,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 989, "mark": null, @@ -19414,6 +21588,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 990, "mark": null, @@ -19423,6 +21598,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 991, "mark": null, @@ -19432,6 +21608,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 992, "mark": null, @@ -19441,6 +21618,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 993, "mark": null, @@ -19450,6 +21628,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 994, "mark": null, @@ -19459,6 +21638,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 995, "mark": null, @@ -19468,6 +21648,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 996, "mark": null, @@ -19477,6 +21658,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 997, "mark": null, @@ -19486,6 +21668,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 998, "mark": null, @@ -19495,6 +21678,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 999, "mark": null, @@ -19520,38 +21704,42 @@ Array [ "data": Array [ Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 1, "mark": null, "x": 1, - "y0": null, + "y0": 0, "y1": 1, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 2, "mark": null, "x": 2, - "y0": null, + "y0": 0, "y1": 2, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 3, "mark": null, "x": 3, - "y0": null, + "y0": 0, "y1": 3, }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 4, "mark": null, "x": 4, - "y0": null, + "y0": 0, "y1": 4, }, ], @@ -19567,6 +21755,7 @@ Array [ "data": Array [ Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 1, "mark": null, @@ -19576,6 +21765,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 2, "mark": null, @@ -19585,6 +21775,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 3, "mark": null, @@ -19594,6 +21785,7 @@ Array [ }, Object { "datum": undefined, + "filled": undefined, "initialY0": null, "initialY1": 4, "mark": null, @@ -19610,212 +21802,174 @@ Array [ "splitAccessors": Map {}, "yAccessor": "y1", }, +] +`; + +exports[`Series Can stack multiple dataseries with scale to extent 1`] = ` +Array [ Object { "data": Array [ Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 1, + "y1": 1, + }, + "filled": undefined, "initialY0": null, "initialY1": 1, "mark": null, "x": 1, - "y0": 2, - "y1": 3, + "y0": 0, + "y1": 1, }, Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 2, + "y1": 2, + }, + "filled": undefined, "initialY0": null, "initialY1": 2, "mark": null, "x": 2, - "y0": 4, - "y1": 6, + "y0": 0, + "y1": 2, }, Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 3, + "y1": 3, + }, + "filled": undefined, "initialY0": null, "initialY1": 3, "mark": null, "x": 3, - "y0": 6, - "y1": 9, + "y0": 0, + "y1": 3, }, Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 4, + "y1": 4, + }, + "filled": undefined, "initialY0": null, "initialY1": 4, "mark": null, "x": 4, - "y0": 8, - "y1": 12, + "y0": 0, + "y1": 4, }, ], - "key": "b", + "key": "spec{spec1}yAccessor{y1}splitAccessors{g-a}", "seriesKeys": Array [ - "b", + "a", + "y1", ], "specId": "spec1", - "splitAccessors": Map {}, + "splitAccessors": Map { + "g" => "a", + }, "yAccessor": "y1", }, Object { "data": Array [ Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 1, + "y1": 1, + }, + "filled": undefined, "initialY0": null, "initialY1": 1, "mark": null, "x": 1, - "y0": 3, - "y1": 4, + "y0": 1, + "y1": 2, }, Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 2, + "y1": 2, + }, + "filled": undefined, "initialY0": null, "initialY1": 2, "mark": null, "x": 2, - "y0": 6, - "y1": 8, + "y0": 2, + "y1": 4, }, Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 3, + "y1": 3, + }, + "filled": undefined, "initialY0": null, "initialY1": 3, "mark": null, "x": 3, - "y0": 9, - "y1": 12, + "y0": 3, + "y1": 6, }, Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 4, + "y1": 4, + }, + "filled": undefined, "initialY0": null, "initialY1": 4, "mark": null, "x": 4, - "y0": 12, - "y1": 16, + "y0": 4, + "y1": 8, }, ], - "key": "b", + "key": "spec{spec1}yAccessor{y1}splitAccessors{g-b}", "seriesKeys": Array [ "b", + "y1", ], "specId": "spec1", - "splitAccessors": Map {}, + "splitAccessors": Map { + "g" => "b", + }, "yAccessor": "y1", }, -] -`; - -exports[`Series Can stack multiple dataseries with scale to extent 1`] = ` -Array [ Object { "data": Array [ Object { - "datum": undefined, + "datum": Object { + "g": "c", + "x": 1, + "y1": 1, + }, + "filled": undefined, "initialY0": null, "initialY1": 1, "mark": null, "x": 1, - "y0": 1, - "y1": 1, + "y0": 2, + "y1": 3, }, Object { - "datum": undefined, - "initialY0": null, - "initialY1": 2, - "mark": null, - "x": 2, - "y0": 2, - "y1": 2, - }, - Object { - "datum": undefined, - "initialY0": null, - "initialY1": 3, - "mark": null, - "x": 3, - "y0": 3, - "y1": 3, - }, - Object { - "datum": undefined, - "initialY0": null, - "initialY1": 4, - "mark": null, - "x": 4, - "y0": 4, - "y1": 4, - }, - ], - "key": "a", - "seriesKeys": Array [ - "a", - ], - "specId": "spec1", - "splitAccessors": Map {}, - "yAccessor": "y1", - }, - Object { - "data": Array [ - Object { - "datum": undefined, - "initialY0": null, - "initialY1": 1, - "mark": null, - "x": 1, - "y0": 1, - "y1": 2, - }, - Object { - "datum": undefined, - "initialY0": null, - "initialY1": 2, - "mark": null, - "x": 2, - "y0": 2, - "y1": 4, - }, - Object { - "datum": undefined, - "initialY0": null, - "initialY1": 3, - "mark": null, - "x": 3, - "y0": 3, - "y1": 6, - }, - Object { - "datum": undefined, - "initialY0": null, - "initialY1": 4, - "mark": null, - "x": 4, - "y0": 4, - "y1": 8, - }, - ], - "key": "b", - "seriesKeys": Array [ - "b", - ], - "specId": "spec1", - "splitAccessors": Map {}, - "yAccessor": "y1", - }, - Object { - "data": Array [ - Object { - "datum": undefined, - "initialY0": null, - "initialY1": 1, - "mark": null, - "x": 1, - "y0": 2, - "y1": 3, - }, - Object { - "datum": undefined, + "datum": Object { + "g": "c", + "x": 2, + "y1": 2, + }, + "filled": undefined, "initialY0": null, "initialY1": 2, "mark": null, @@ -19824,7 +21978,12 @@ Array [ "y1": 6, }, Object { - "datum": undefined, + "datum": Object { + "g": "c", + "x": 3, + "y1": 3, + }, + "filled": undefined, "initialY0": null, "initialY1": 3, "mark": null, @@ -19833,7 +21992,12 @@ Array [ "y1": 9, }, Object { - "datum": undefined, + "datum": Object { + "g": "c", + "x": 4, + "y1": 4, + }, + "filled": undefined, "initialY0": null, "initialY1": 4, "mark": null, @@ -19842,18 +22006,26 @@ Array [ "y1": 12, }, ], - "key": "b", + "key": "spec{spec1}yAccessor{y1}splitAccessors{g-c}", "seriesKeys": Array [ - "b", + "c", + "y1", ], "specId": "spec1", - "splitAccessors": Map {}, + "splitAccessors": Map { + "g" => "c", + }, "yAccessor": "y1", }, Object { "data": Array [ Object { - "datum": undefined, + "datum": Object { + "g": "d", + "x": 1, + "y1": 1, + }, + "filled": undefined, "initialY0": null, "initialY1": 1, "mark": null, @@ -19862,7 +22034,12 @@ Array [ "y1": 4, }, Object { - "datum": undefined, + "datum": Object { + "g": "d", + "x": 2, + "y1": 2, + }, + "filled": undefined, "initialY0": null, "initialY1": 2, "mark": null, @@ -19871,7 +22048,12 @@ Array [ "y1": 8, }, Object { - "datum": undefined, + "datum": Object { + "g": "d", + "x": 3, + "y1": 3, + }, + "filled": undefined, "initialY0": null, "initialY1": 3, "mark": null, @@ -19880,7 +22062,12 @@ Array [ "y1": 12, }, Object { - "datum": undefined, + "datum": Object { + "g": "d", + "x": 4, + "y1": 4, + }, + "filled": undefined, "initialY0": null, "initialY1": 4, "mark": null, @@ -19889,12 +22076,15 @@ Array [ "y1": 16, }, ], - "key": "b", + "key": "spec{spec1}yAccessor{y1}splitAccessors{g-d}", "seriesKeys": Array [ - "b", + "d", + "y1", ], "specId": "spec1", - "splitAccessors": Map {}, + "splitAccessors": Map { + "g" => "d", + }, "yAccessor": "y1", }, ] @@ -19905,58 +22095,80 @@ Array [ Object { "data": Array [ Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 1, + "y1": 1, + }, + "filled": undefined, "initialY0": null, "initialY1": 1, "mark": null, "x": 1, - "y0": null, + "y0": 0, "y1": 1, }, Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 2, + "y1": 2, + }, + "filled": undefined, "initialY0": null, "initialY1": 2, "mark": null, "x": 2, - "y0": null, + "y0": 0, "y1": 2, }, Object { - "datum": null, + "datum": undefined, "filled": Object { "x": 3, - "y1": 0, }, "initialY0": null, - "initialY1": 0, + "initialY1": null, "mark": null, "x": 3, - "y0": null, + "y0": 0, "y1": 0, }, Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 4, + "y1": 4, + }, + "filled": undefined, "initialY0": null, "initialY1": 4, "mark": null, "x": 4, - "y0": null, + "y0": 0, "y1": 4, }, ], - "key": "a", + "key": "spec{spec1}yAccessor{y1}splitAccessors{g-a}", "seriesKeys": Array [ "a", + "y1", ], "specId": "spec1", - "splitAccessors": Map {}, + "splitAccessors": Map { + "g" => "a", + }, "yAccessor": "y1", }, Object { "data": Array [ Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 1, + "y1": 21, + }, + "filled": undefined, "initialY0": null, "initialY1": 21, "mark": null, @@ -19965,20 +22177,24 @@ Array [ "y1": 22, }, Object { - "datum": null, + "datum": undefined, "filled": Object { "x": 2, - "y1": 0, }, "initialY0": null, - "initialY1": 0, + "initialY1": null, "mark": null, "x": 2, "y0": 2, "y1": 2, }, Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 3, + "y1": 23, + }, + "filled": undefined, "initialY0": null, "initialY1": 23, "mark": null, @@ -19987,25 +22203,27 @@ Array [ "y1": 23, }, Object { - "datum": null, + "datum": undefined, "filled": Object { "x": 4, - "y1": 0, }, "initialY0": null, - "initialY1": 0, + "initialY1": null, "mark": null, "x": 4, "y0": 4, "y1": 4, }, ], - "key": "b", + "key": "spec{spec1}yAccessor{y1}splitAccessors{g-b}", "seriesKeys": Array [ "b", + "y1", ], "specId": "spec1", - "splitAccessors": Map {}, + "splitAccessors": Map { + "g" => "b", + }, "yAccessor": "y1", }, ] @@ -20016,58 +22234,80 @@ Array [ Object { "data": Array [ Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 1, + "y1": 1, + }, + "filled": undefined, "initialY0": null, "initialY1": 1, "mark": null, "x": 1, - "y0": 1, + "y0": 0, "y1": 1, }, Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 2, + "y1": 2, + }, + "filled": undefined, "initialY0": null, "initialY1": 2, "mark": null, "x": 2, - "y0": 2, + "y0": 0, "y1": 2, }, Object { - "datum": null, + "datum": undefined, "filled": Object { "x": 3, - "y1": 0, }, "initialY0": null, - "initialY1": 0, + "initialY1": null, "mark": null, "x": 3, "y0": 0, "y1": 0, }, Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 4, + "y1": 4, + }, + "filled": undefined, "initialY0": null, "initialY1": 4, "mark": null, "x": 4, - "y0": 4, + "y0": 0, "y1": 4, }, ], - "key": "a", + "key": "spec{spec1}yAccessor{y1}splitAccessors{g-a}", "seriesKeys": Array [ "a", + "y1", ], "specId": "spec1", - "splitAccessors": Map {}, + "splitAccessors": Map { + "g" => "a", + }, "yAccessor": "y1", }, Object { "data": Array [ Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 1, + "y1": 21, + }, + "filled": undefined, "initialY0": null, "initialY1": 21, "mark": null, @@ -20076,20 +22316,24 @@ Array [ "y1": 22, }, Object { - "datum": null, + "datum": undefined, "filled": Object { "x": 2, - "y1": 0, }, "initialY0": null, - "initialY1": 0, + "initialY1": null, "mark": null, "x": 2, "y0": 2, "y1": 2, }, Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 3, + "y1": 23, + }, + "filled": undefined, "initialY0": null, "initialY1": 23, "mark": null, @@ -20098,25 +22342,27 @@ Array [ "y1": 23, }, Object { - "datum": null, + "datum": undefined, "filled": Object { "x": 4, - "y1": 0, }, "initialY0": null, - "initialY1": 0, + "initialY1": null, "mark": null, "x": 4, "y0": 4, "y1": 4, }, ], - "key": "b", + "key": "spec{spec1}yAccessor{y1}splitAccessors{g-b}", "seriesKeys": Array [ "b", + "y1", ], "specId": "spec1", - "splitAccessors": Map {}, + "splitAccessors": Map { + "g" => "b", + }, "yAccessor": "y1", }, ] @@ -20127,7 +22373,13 @@ Array [ Object { "data": Array [ Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 1, + "y0": 1, + "y1": 3, + }, + "filled": undefined, "initialY0": 1, "initialY1": 3, "mark": null, @@ -20136,7 +22388,13 @@ Array [ "y1": 3, }, Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 2, + "y0": 2, + "y1": 3, + }, + "filled": undefined, "initialY0": 2, "initialY1": 3, "mark": null, @@ -20145,20 +22403,25 @@ Array [ "y1": 3, }, Object { - "datum": null, + "datum": undefined, "filled": Object { "x": 3, - "y1": 0, }, "initialY0": null, - "initialY1": 0, + "initialY1": null, "mark": null, "x": 3, "y0": 0, "y1": 0, }, Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 4, + "y0": 3, + "y1": 4, + }, + "filled": undefined, "initialY0": 3, "initialY1": 4, "mark": null, @@ -20167,18 +22430,27 @@ Array [ "y1": 4, }, ], - "key": "a", + "key": "spec{spec1}yAccessor{y1}splitAccessors{g-a}", "seriesKeys": Array [ "a", + "y1", ], "specId": "spec1", - "splitAccessors": Map {}, + "splitAccessors": Map { + "g" => "a", + }, "yAccessor": "y1", }, Object { "data": Array [ Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 1, + "y0": 1, + "y1": 2, + }, + "filled": undefined, "initialY0": 1, "initialY1": 2, "mark": null, @@ -20187,7 +22459,13 @@ Array [ "y1": 5, }, Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 2, + "y0": 1, + "y1": 3, + }, + "filled": undefined, "initialY0": 1, "initialY1": 3, "mark": null, @@ -20196,7 +22474,13 @@ Array [ "y1": 6, }, Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 3, + "y0": 4, + "y1": 23, + }, + "filled": undefined, "initialY0": 4, "initialY1": 23, "mark": null, @@ -20205,7 +22489,13 @@ Array [ "y1": 23, }, Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 4, + "y0": 1, + "y1": 4, + }, + "filled": undefined, "initialY0": 1, "initialY1": 4, "mark": null, @@ -20214,12 +22504,15 @@ Array [ "y1": 8, }, ], - "key": "b", + "key": "spec{spec1}yAccessor{y1}splitAccessors{g-b}", "seriesKeys": Array [ "b", + "y1", ], "specId": "spec1", - "splitAccessors": Map {}, + "splitAccessors": Map { + "g" => "b", + }, "yAccessor": "y1", }, ] @@ -20230,7 +22523,13 @@ Array [ Object { "data": Array [ Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 1, + "y0": 1, + "y1": 3, + }, + "filled": undefined, "initialY0": 1, "initialY1": 3, "mark": null, @@ -20239,7 +22538,13 @@ Array [ "y1": 3, }, Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 2, + "y0": 2, + "y1": 3, + }, + "filled": undefined, "initialY0": 2, "initialY1": 3, "mark": null, @@ -20248,20 +22553,25 @@ Array [ "y1": 3, }, Object { - "datum": null, + "datum": undefined, "filled": Object { "x": 3, - "y1": 0, }, "initialY0": null, - "initialY1": 0, + "initialY1": null, "mark": null, "x": 3, "y0": 0, "y1": 0, }, Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 4, + "y0": 3, + "y1": 4, + }, + "filled": undefined, "initialY0": 3, "initialY1": 4, "mark": null, @@ -20270,18 +22580,27 @@ Array [ "y1": 4, }, ], - "key": "a", + "key": "spec{spec1}yAccessor{y1}splitAccessors{g-a}", "seriesKeys": Array [ "a", + "y1", ], "specId": "spec1", - "splitAccessors": Map {}, + "splitAccessors": Map { + "g" => "a", + }, "yAccessor": "y1", }, Object { "data": Array [ Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 1, + "y0": 1, + "y1": 2, + }, + "filled": undefined, "initialY0": 1, "initialY1": 2, "mark": null, @@ -20290,7 +22609,13 @@ Array [ "y1": 5, }, Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 2, + "y0": 1, + "y1": 3, + }, + "filled": undefined, "initialY0": 1, "initialY1": 3, "mark": null, @@ -20299,7 +22624,13 @@ Array [ "y1": 6, }, Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 3, + "y0": 4, + "y1": 23, + }, + "filled": undefined, "initialY0": 4, "initialY1": 23, "mark": null, @@ -20308,7 +22639,13 @@ Array [ "y1": 23, }, Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 4, + "y0": 1, + "y1": 4, + }, + "filled": undefined, "initialY0": 1, "initialY1": 4, "mark": null, @@ -20317,12 +22654,15 @@ Array [ "y1": 8, }, ], - "key": "b", + "key": "spec{spec1}yAccessor{y1}splitAccessors{g-b}", "seriesKeys": Array [ "b", + "y1", ], "specId": "spec1", - "splitAccessors": Map {}, + "splitAccessors": Map { + "g" => "b", + }, "yAccessor": "y1", }, ] @@ -20333,58 +22673,80 @@ Array [ Object { "data": Array [ Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 1, + "y1": 1, + }, + "filled": undefined, "initialY0": null, "initialY1": 1, "mark": null, "x": 1, - "y0": null, + "y0": 0, "y1": 1, }, Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 2, + "y1": 2, + }, + "filled": undefined, "initialY0": null, "initialY1": 2, "mark": null, "x": 2, - "y0": null, + "y0": 0, "y1": 2, }, Object { - "datum": null, + "datum": undefined, "filled": Object { "x": 3, - "y1": 0, }, "initialY0": null, - "initialY1": 0, + "initialY1": null, "mark": null, "x": 3, - "y0": null, + "y0": 0, "y1": 0, }, Object { - "datum": undefined, + "datum": Object { + "g": "a", + "x": 4, + "y1": 4, + }, + "filled": undefined, "initialY0": null, "initialY1": 4, "mark": null, "x": 4, - "y0": null, + "y0": 0, "y1": 4, }, ], - "key": "a", + "key": "spec{spec1}yAccessor{y1}splitAccessors{g-a}", "seriesKeys": Array [ "a", + "y1", ], "specId": "spec1", - "splitAccessors": Map {}, + "splitAccessors": Map { + "g" => "a", + }, "yAccessor": "y1", }, Object { "data": Array [ Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 1, + "y1": 21, + }, + "filled": undefined, "initialY0": null, "initialY1": 21, "mark": null, @@ -20393,20 +22755,24 @@ Array [ "y1": 22, }, Object { - "datum": null, + "datum": undefined, "filled": Object { "x": 2, - "y1": 0, }, "initialY0": null, - "initialY1": 0, + "initialY1": null, "mark": null, "x": 2, "y0": 2, "y1": 2, }, Object { - "datum": undefined, + "datum": Object { + "g": "b", + "x": 3, + "y1": 23, + }, + "filled": undefined, "initialY0": null, "initialY1": 23, "mark": null, @@ -20415,25 +22781,27 @@ Array [ "y1": 23, }, Object { - "datum": null, + "datum": undefined, "filled": Object { "x": 4, - "y1": 0, }, "initialY0": null, - "initialY1": 0, + "initialY1": null, "mark": null, "x": 4, "y0": 4, "y1": 4, }, ], - "key": "b", + "key": "spec{spec1}yAccessor{y1}splitAccessors{g-b}", "seriesKeys": Array [ "b", + "y1", ], "specId": "spec1", - "splitAccessors": Map {}, + "splitAccessors": Map { + "g" => "b", + }, "yAccessor": "y1", }, ] @@ -20451,6 +22819,8 @@ Array [ "y1": 1, "y2": 4, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 0, "y0": null, @@ -20464,6 +22834,8 @@ Array [ "y1": 2, "y2": 1, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -20477,6 +22849,8 @@ Array [ "y1": 10, "y2": 5, }, + "initialY0": null, + "initialY1": 10, "mark": null, "x": 2, "y0": null, @@ -20490,6 +22864,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 7, "mark": null, "x": 3, "y0": null, @@ -20503,6 +22879,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 7, "mark": null, "x": 6, "y0": null, @@ -20532,6 +22910,8 @@ Array [ "y1": 1, "y2": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 0, "y0": null, @@ -20545,6 +22925,8 @@ Array [ "y1": 2, "y2": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 1, "y0": null, @@ -20558,6 +22940,8 @@ Array [ "y1": 10, "y2": 5, }, + "initialY0": null, + "initialY1": 5, "mark": null, "x": 2, "y0": null, @@ -20571,6 +22955,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 3, "y0": null, @@ -20584,6 +22970,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 6, "y0": null, @@ -20613,6 +23001,8 @@ Array [ "y1": 1, "y2": 4, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 0, "y0": null, @@ -20626,6 +23016,8 @@ Array [ "y1": 2, "y2": 1, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -20639,6 +23031,8 @@ Array [ "y1": 10, "y2": 5, }, + "initialY0": null, + "initialY1": 10, "mark": null, "x": 2, "y0": null, @@ -20652,6 +23046,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 7, "mark": null, "x": 3, "y0": null, @@ -20665,6 +23061,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 7, "mark": null, "x": 6, "y0": null, @@ -20694,6 +23092,8 @@ Array [ "y1": 1, "y2": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 0, "y0": null, @@ -20707,6 +23107,8 @@ Array [ "y1": 2, "y2": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 1, "y0": null, @@ -20720,6 +23122,8 @@ Array [ "y1": 10, "y2": 5, }, + "initialY0": null, + "initialY1": 5, "mark": null, "x": 2, "y0": null, @@ -20733,6 +23137,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 3, "y0": null, @@ -20746,6 +23152,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 6, "y0": null, @@ -20775,6 +23183,8 @@ Array [ "y1": 3, "y2": 6, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 0, "y0": null, @@ -20788,6 +23198,8 @@ Array [ "y1": 2, "y2": 5, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -20801,6 +23213,8 @@ Array [ "y1": 3, "y2": 1, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 2, "y0": null, @@ -20814,6 +23228,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 3, "y0": null, @@ -20827,6 +23243,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 6, "y0": null, @@ -20856,6 +23274,8 @@ Array [ "y1": 3, "y2": 6, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 0, "y0": null, @@ -20869,6 +23289,8 @@ Array [ "y1": 2, "y2": 5, }, + "initialY0": null, + "initialY1": 5, "mark": null, "x": 1, "y0": null, @@ -20882,6 +23304,8 @@ Array [ "y1": 3, "y2": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 2, "y0": null, @@ -20895,6 +23319,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 3, "y0": null, @@ -20908,6 +23334,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 6, "y0": null, @@ -20937,6 +23365,8 @@ Array [ "y1": 3, "y2": 6, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 0, "y0": null, @@ -20950,6 +23380,8 @@ Array [ "y1": 2, "y2": 5, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -20963,6 +23395,8 @@ Array [ "y1": 3, "y2": 1, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 2, "y0": null, @@ -20976,6 +23410,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 3, "y0": null, @@ -20989,6 +23425,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 6, "y0": null, @@ -21018,6 +23456,8 @@ Array [ "y1": 3, "y2": 6, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 0, "y0": null, @@ -21031,6 +23471,8 @@ Array [ "y1": 2, "y2": 5, }, + "initialY0": null, + "initialY1": 5, "mark": null, "x": 1, "y0": null, @@ -21044,6 +23486,8 @@ Array [ "y1": 3, "y2": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 2, "y0": null, @@ -21057,6 +23501,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 3, "y0": null, @@ -21070,6 +23516,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 4, "mark": null, "x": 6, "y0": null, @@ -21104,6 +23552,8 @@ Array [ "y1": 1, "y2": 4, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": "_all", "y0": null, @@ -21117,6 +23567,8 @@ Array [ "y1": 1, "y2": 4, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": "_all", "y0": null, @@ -21130,6 +23582,8 @@ Array [ "y1": 3, "y2": 6, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": "_all", "y0": null, @@ -21143,6 +23597,8 @@ Array [ "y1": 3, "y2": 6, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": "_all", "y0": null, @@ -21156,6 +23612,8 @@ Array [ "y1": 2, "y2": 1, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": "_all", "y0": null, @@ -21169,6 +23627,8 @@ Array [ "y1": 2, "y2": 1, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": "_all", "y0": null, @@ -21182,6 +23642,8 @@ Array [ "y1": 2, "y2": 5, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": "_all", "y0": null, @@ -21195,6 +23657,8 @@ Array [ "y1": 2, "y2": 5, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": "_all", "y0": null, @@ -21208,6 +23672,8 @@ Array [ "y1": 10, "y2": 5, }, + "initialY0": null, + "initialY1": 10, "mark": null, "x": "_all", "y0": null, @@ -21221,6 +23687,8 @@ Array [ "y1": 10, "y2": 5, }, + "initialY0": null, + "initialY1": 10, "mark": null, "x": "_all", "y0": null, @@ -21234,6 +23702,8 @@ Array [ "y1": 3, "y2": 1, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": "_all", "y0": null, @@ -21247,6 +23717,8 @@ Array [ "y1": 3, "y2": 1, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": "_all", "y0": null, @@ -21260,6 +23732,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 7, "mark": null, "x": "_all", "y0": null, @@ -21273,6 +23747,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 7, "mark": null, "x": "_all", "y0": null, @@ -21286,6 +23762,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": "_all", "y0": null, @@ -21299,6 +23777,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": "_all", "y0": null, @@ -21312,6 +23792,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 7, "mark": null, "x": "_all", "y0": null, @@ -21325,6 +23807,8 @@ Array [ "y1": 7, "y2": 3, }, + "initialY0": null, + "initialY1": 7, "mark": null, "x": "_all", "y0": null, @@ -21338,6 +23822,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": "_all", "y0": null, @@ -21351,6 +23837,8 @@ Array [ "y1": 6, "y2": 4, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": "_all", "y0": null, @@ -21378,6 +23866,8 @@ Array [ 1, "a", ], + "initialY0": null, + "initialY1": 1, "mark": null, "x": 0, "y0": null, @@ -21389,6 +23879,8 @@ Array [ 1, "a", ], + "initialY0": null, + "initialY1": 1, "mark": null, "x": 1, "y0": null, @@ -21400,6 +23892,8 @@ Array [ 1, "a", ], + "initialY0": null, + "initialY1": 1, "mark": null, "x": 2, "y0": null, @@ -21425,6 +23919,8 @@ Array [ 1, "b", ], + "initialY0": null, + "initialY1": 1, "mark": null, "x": 0, "y0": null, @@ -21436,6 +23932,8 @@ Array [ 1, "b", ], + "initialY0": null, + "initialY1": 1, "mark": null, "x": 1, "y0": null, @@ -21447,6 +23945,8 @@ Array [ 1, "b", ], + "initialY0": null, + "initialY1": 1, "mark": null, "x": 2, "y0": null, @@ -21471,9 +23971,10 @@ exports[`Series should compute data series for stacked specs 1`] = ` Array [ Object { "counts": Object { - "areaSeries": 0, - "barSeries": 0, - "lineSeries": 2, + "area": 0, + "bar": 0, + "bubble": 0, + "line": 2, }, "dataSeries": Array [ Object { @@ -21484,11 +23985,12 @@ Array [ "y1": 1, "y2": 3, }, + "filled": undefined, "initialY0": null, "initialY1": 1, "mark": null, "x": 0, - "y0": null, + "y0": 0, "y1": 1, }, Object { @@ -21497,11 +23999,12 @@ Array [ "y1": 2, "y2": 7, }, + "filled": undefined, "initialY0": null, "initialY1": 2, "mark": null, "x": 1, - "y0": null, + "y0": 0, "y1": 2, }, Object { @@ -21510,11 +24013,12 @@ Array [ "y1": 1, "y2": 2, }, + "filled": undefined, "initialY0": null, "initialY1": 1, "mark": null, "x": 2, - "y0": null, + "y0": 0, "y1": 1, }, Object { @@ -21523,11 +24027,12 @@ Array [ "y1": 6, "y2": 10, }, + "filled": undefined, "initialY0": null, "initialY1": 6, "mark": null, "x": 3, - "y0": null, + "y0": 0, "y1": 6, }, ], @@ -21547,6 +24052,7 @@ Array [ "y1": 1, "y2": 3, }, + "filled": undefined, "initialY0": null, "initialY1": 3, "mark": null, @@ -21560,6 +24066,7 @@ Array [ "y1": 2, "y2": 7, }, + "filled": undefined, "initialY0": null, "initialY1": 7, "mark": null, @@ -21573,6 +24080,7 @@ Array [ "y1": 1, "y2": 2, }, + "filled": undefined, "initialY0": null, "initialY1": 2, "mark": null, @@ -21586,6 +24094,7 @@ Array [ "y1": 6, "y2": 10, }, + "filled": undefined, "initialY0": null, "initialY1": 10, "mark": null, @@ -21604,6 +24113,7 @@ Array [ }, ], "groupId": "group2", + "stackMode": undefined, }, ] `; @@ -21617,6 +24127,8 @@ Array [ "x": 0, "y": 1, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 0, "y0": null, @@ -21627,6 +24139,8 @@ Array [ "x": 1, "y": 2, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -21637,6 +24151,8 @@ Array [ "x": 2, "y": 10, }, + "initialY0": null, + "initialY1": 10, "mark": null, "x": 2, "y0": null, @@ -21647,6 +24163,8 @@ Array [ "x": 3, "y": 6, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 3, "y0": null, @@ -21674,6 +24192,8 @@ Array [ "y1": 1, "y2": 3, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 0, "y0": null, @@ -21685,6 +24205,8 @@ Array [ "y1": 2, "y2": 7, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 1, "y0": null, @@ -21696,6 +24218,8 @@ Array [ "y1": 1, "y2": 2, }, + "initialY0": null, + "initialY1": 1, "mark": null, "x": 2, "y0": null, @@ -21707,6 +24231,8 @@ Array [ "y1": 6, "y2": 10, }, + "initialY0": null, + "initialY1": 6, "mark": null, "x": 3, "y0": null, @@ -21729,6 +24255,8 @@ Array [ "y1": 1, "y2": 3, }, + "initialY0": null, + "initialY1": 3, "mark": null, "x": 0, "y0": null, @@ -21740,6 +24268,8 @@ Array [ "y1": 2, "y2": 7, }, + "initialY0": null, + "initialY1": 7, "mark": null, "x": 1, "y0": null, @@ -21751,6 +24281,8 @@ Array [ "y1": 1, "y2": 2, }, + "initialY0": null, + "initialY1": 2, "mark": null, "x": 2, "y0": null, @@ -21762,6 +24294,8 @@ Array [ "y1": 6, "y2": 10, }, + "initialY0": null, + "initialY1": 10, "mark": null, "x": 3, "y0": null, diff --git a/src/chart_types/xy_chart/utils/fill_series.ts b/src/chart_types/xy_chart/utils/fill_series.ts new file mode 100644 index 0000000000..0ad4e8e8a8 --- /dev/null +++ b/src/chart_types/xy_chart/utils/fill_series.ts @@ -0,0 +1,77 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { SpecId } from '../../../utils/ids'; +import { DataSeries } from './series'; + + +/** + * + * @param series + * @param xValues + * @internal + */ +export function fillSeries( + series: Map, + xValues: Set, +): Map { + const sortedXValues = [...xValues.values()]; + const filledSeries: Map = new Map(); + series.forEach((dataSeries, key) => { + const filledDataSeries = dataSeries.map(({ data, ...rest }) => { + if (data.length === xValues.size) { + return { + ...rest, + data, + }; + } + const filledData: typeof data = []; + const missingValues = new Set(xValues); + for (let i = 0; i < data.length; i++) { + const { x } = data[i]; + filledData.push(data[i]); + missingValues.delete(x); + } + + const missingValuesArray = [...missingValues.values()]; + for (let i = 0; i < missingValuesArray.length; i++) { + const missingValue = missingValuesArray[i]; + const index = sortedXValues.indexOf(missingValue); + + filledData.splice(index, 0, { + x: missingValue, + y1: null, + y0: null, + initialY1: null, + initialY0: null, + mark: null, + datum: undefined, + filled: { + x: missingValue, + }, + }); + } + return { + ...rest, + data: filledData, + }; + }); + filledSeries.set(key, filledDataSeries); + }); + return filledSeries; +} diff --git a/src/chart_types/xy_chart/utils/fit_function.test.ts b/src/chart_types/xy_chart/utils/fit_function.test.ts index 4323a91257..fd3c3c8521 100644 --- a/src/chart_types/xy_chart/utils/fit_function.test.ts +++ b/src/chart_types/xy_chart/utils/fit_function.test.ts @@ -54,9 +54,10 @@ describe('Fit Function', () => { const current = MockDataSeriesDatum.simple({ x: 3 }); const actual = testModule.getValue(current, 0, previous, null, Fit.Carry); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 20, + filled: { y1: 20 }, }); }); }); @@ -67,9 +68,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 4, y1: 20 }); const actual = testModule.getValue(current, 0, null, next, Fit.Lookahead); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 20, + filled: { y1: 20 }, }); }); }); @@ -82,9 +84,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 4, y1: 20 }); const actual = testModule.getValue(current, 0, previous, next, Fit.Average); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: (10 + 20) / 2, + filled: { y1: (10 + 20) / 2 }, }); }); }); @@ -96,9 +99,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 10, y1: 20 }); const actual = testModule.getValue(current, 0, previous, next, Fit.Nearest); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 10, + filled: { y1: 10 }, }); }); @@ -108,9 +112,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 10, y1: 20 }); const actual = testModule.getValue(current, 0, previous, next, Fit.Nearest); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 20, + filled: { y1: 20 }, }); }); }); @@ -122,9 +127,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 10, y1: 20 }); const actual = testModule.getValue(current, 0, previous, next, Fit.Linear); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: (10 + 20) / 2, + filled: { y1: (10 + 20) / 2 }, }); }); @@ -134,9 +140,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 10, y1: 20 }); const actual = testModule.getValue(current, 0, previous, next, Fit.Linear); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 13, + filled: { y1: 13 }, }); }); @@ -146,9 +153,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 10, y1: 10 }); const actual = testModule.getValue(current, 0, previous, next, Fit.Linear); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 17, + filled: { y1: 17 }, }); }); @@ -158,9 +166,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 10.767, y1: 20.657 }); const actual = testModule.getValue(current, 0, previous, next, Fit.Linear); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 13.3733264, + filled: { y1: 13.3733264 }, }); }); }); @@ -173,9 +182,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 4, y1: 20 }); const actual = testModule.getValue(current, 0, null, next, Fit.Nearest); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 20, + filled: { y1: 20 }, }); }); @@ -184,9 +194,10 @@ describe('Fit Function', () => { const current = MockDataSeriesDatum.simple({ x: 3 }); const actual = testModule.getValue(current, 0, previous, null, Fit.Nearest); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 20, + filled: { y1: 20 }, }); }); }); @@ -197,9 +208,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 4, y1: 20 }); const actual = testModule.getValue(current, 0, null, next, Fit.Average, 'nearest'); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 20, + filled: { y1: 20 }, }); }); @@ -208,9 +220,10 @@ describe('Fit Function', () => { const current = MockDataSeriesDatum.simple({ x: 3 }); const actual = testModule.getValue(current, 0, previous, null, Fit.Average, 'nearest'); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 20, + filled: { y1: 20 }, }); }); }); @@ -238,9 +251,10 @@ describe('Fit Function', () => { const current = MockDataSeriesDatum.simple({ x: 'c' }); const actual = testModule.getValue(current, 3, previous, null, Fit.Carry); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 20, + filled: { y1: 20 }, }); }); }); @@ -251,9 +265,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 'e', y1: 20, fittingIndex: 4 }); const actual = testModule.getValue(current, 3, null, next, Fit.Lookahead); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 20, + filled: { y1: 20 }, }); }); }); @@ -266,9 +281,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 'e', y1: 20, fittingIndex: 4 }); const actual = testModule.getValue(current, 3, previous, next, Fit.Average); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: (10 + 20) / 2, + filled: { y1: (10 + 20) / 2 }, }); }); }); @@ -280,9 +296,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 'e', y1: 20, fittingIndex: 10 }); const actual = testModule.getValue(current, 3, previous, next, Fit.Nearest); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 10, + filled: { y1: 10 }, }); }); @@ -292,9 +309,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 'e', y1: 20, fittingIndex: 10 }); const actual = testModule.getValue(current, 9, previous, next, Fit.Nearest); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 20, + filled: { y1: 20 }, }); }); }); @@ -306,9 +324,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 'e', y1: 20, fittingIndex: 10 }); const actual = testModule.getValue(current, 5, previous, next, Fit.Linear); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: (10 + 20) / 2, + filled: { y1: (10 + 20) / 2 }, }); }); @@ -318,9 +337,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 'e', y1: 20, fittingIndex: 10 }); const actual = testModule.getValue(current, 3, previous, next, Fit.Linear); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 13, + filled: { y1: 13 }, }); }); @@ -330,9 +350,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 'e', y1: 10, fittingIndex: 10 }); const actual = testModule.getValue(current, 3, previous, next, Fit.Linear); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 17, + filled: { y1: 17 }, }); }); @@ -342,9 +363,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 'e', fittingIndex: 10.767, y1: 20.657 }); const actual = testModule.getValue(current, 3.564, previous, next, Fit.Linear); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 13.3733264, + filled: { y1: 13.3733264 }, }); }); }); @@ -357,9 +379,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 'e', y1: 20, fittingIndex: 4 }); const actual = testModule.getValue(current, 3, null, next, Fit.Nearest); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 20, + filled: { y1: 20 }, }); }); @@ -368,9 +391,10 @@ describe('Fit Function', () => { const current = MockDataSeriesDatum.simple({ x: 'c' }); const actual = testModule.getValue(current, 3, previous, null, Fit.Nearest); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 20, + filled: { y1: 20 }, }); }); }); @@ -381,9 +405,10 @@ describe('Fit Function', () => { const next = MockDataSeriesDatum.full({ x: 'e', y1: 20, fittingIndex: 4 }); const actual = testModule.getValue(current, 3, null, next, Fit.Average, 'nearest'); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 20, + filled: { y1: 20 }, }); }); @@ -392,9 +417,10 @@ describe('Fit Function', () => { const current = MockDataSeriesDatum.simple({ x: 'c' }); const actual = testModule.getValue(current, 3, previous, null, Fit.Average, 'nearest'); - expect(actual).toMatchObject(current); - expect(actual.filled).toEqual({ + expect(actual).toMatchObject({ + ...current, y1: 20, + filled: { y1: 20 }, }); }); }); @@ -469,7 +495,7 @@ describe('Fit Function', () => { describe('allow mutliple fit config types', () => { it('should allow string config', () => { - testModule.fitFunction(dataSeries, Fit.None, ScaleType.Linear); + testModule.fitFunction(dataSeries.data, Fit.None, ScaleType.Linear); expect(testModule.parseConfig).toHaveBeenCalledWith(Fit.None); expect(testModule.parseConfig).toHaveBeenCalledTimes(1); @@ -479,7 +505,7 @@ describe('Fit Function', () => { const fitConfig = { type: Fit.None, }; - testModule.fitFunction(dataSeries, fitConfig, ScaleType.Linear); + testModule.fitFunction(dataSeries.data, fitConfig, ScaleType.Linear); expect(testModule.parseConfig).toHaveBeenCalledWith(fitConfig); expect(testModule.parseConfig).toHaveBeenCalledTimes(1); @@ -504,7 +530,7 @@ describe('Fit Function', () => { }); it('should call splice sort only', () => { - testModule.fitFunction(dataSeries, Fit.Linear, ScaleType.Linear); + testModule.fitFunction(dataSeries.data, Fit.Linear, ScaleType.Linear); expect(dataSeries.data.sort).not.toHaveBeenCalled(); expect(dataSeries.data.slice).toHaveBeenCalledTimes(1); @@ -512,14 +538,14 @@ describe('Fit Function', () => { }); it('should not call splice.sort if sorted is true', () => { - testModule.fitFunction(dataSeries, Fit.Linear, ScaleType.Linear, true); + testModule.fitFunction(dataSeries.data, Fit.Linear, ScaleType.Linear, true); expect(dataSeries.data.slice).not.toHaveBeenCalled(); expect(mockArray.sort).not.toHaveBeenCalled(); }); it('should not call splice.sort if scale is ordinal', () => { - testModule.fitFunction(dataSeries, Fit.Linear, ScaleType.Ordinal); + testModule.fitFunction(dataSeries.data, Fit.Linear, ScaleType.Ordinal); expect(dataSeries.data.slice).not.toHaveBeenCalled(); expect(mockArray.sort).not.toHaveBeenCalled(); @@ -527,7 +553,7 @@ describe('Fit Function', () => { it('should call splice.sort with predicate', () => { jest.spyOn(seriesUtils, 'datumXSortPredicate'); - testModule.fitFunction(dataSeries, Fit.Linear, ScaleType.Linear); + testModule.fitFunction(dataSeries.data, Fit.Linear, ScaleType.Linear); expect(seriesUtils.datumXSortPredicate).toHaveBeenCalledWith(Fit.Linear); }); @@ -546,56 +572,56 @@ describe('Fit Function', () => { describe('number value', () => { const endValue = 100; it('should set end values - None', () => { - const actual = testModule.fitFunction(sortedDS, { type: Fit.None, endValue }, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(sortedDS.data, { type: Fit.None, endValue }, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues[0]).toBeNull(); expect(finalValues[finalValues.length - 1]).toBeNull(); }); it('should set end values - Zero', () => { - const actual = testModule.fitFunction(sortedDS, { type: Fit.Zero, endValue }, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(sortedDS.data, { type: Fit.Zero, endValue }, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues[0]).toEqual(0); expect(finalValues[finalValues.length - 1]).toEqual(0); }); it('should set end values - Explicit', () => { - const actual = testModule.fitFunction(sortedDS, { type: Fit.Explicit, value: 20, endValue }, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(sortedDS.data, { type: Fit.Explicit, value: 20, endValue }, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues[0]).toEqual(20); expect(finalValues[finalValues.length - 1]).toEqual(20); }); it('should set end values - Lookahead', () => { - const actual = testModule.fitFunction(dataSeries, { type: Fit.Lookahead, endValue }, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(dataSeries.data, { type: Fit.Lookahead, endValue }, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues[0]).toEqual(3); expect(finalValues[finalValues.length - 1]).toEqual(endValue); }); it('should set end values - Nearest', () => { - const actual = testModule.fitFunction(dataSeries, { type: Fit.Nearest, endValue }, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(dataSeries.data, { type: Fit.Nearest, endValue }, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues[0]).toEqual(3); expect(finalValues[finalValues.length - 1]).toEqual(12); }); it('should set end values - Average', () => { - const actual = testModule.fitFunction(dataSeries, { type: Fit.Average, endValue }, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(dataSeries.data, { type: Fit.Average, endValue }, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues[0]).toEqual(endValue); expect(finalValues[finalValues.length - 1]).toEqual(endValue); }); it('should set end values - Linear', () => { - const actual = testModule.fitFunction(dataSeries, { type: Fit.Linear, endValue }, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(dataSeries.data, { type: Fit.Linear, endValue }, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues[0]).toEqual(endValue); expect(finalValues[finalValues.length - 1]).toEqual(endValue); @@ -606,56 +632,56 @@ describe('Fit Function', () => { const endValue = 'nearest'; it('should set end values - None', () => { - const actual = testModule.fitFunction(sortedDS, { type: Fit.None, endValue }, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(sortedDS.data, { type: Fit.None, endValue }, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues[0]).toBeNull(); expect(finalValues[finalValues.length - 1]).toBeNull(); }); it('should set end values - Zero', () => { - const actual = testModule.fitFunction(sortedDS, { type: Fit.Zero, endValue }, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(sortedDS.data, { type: Fit.Zero, endValue }, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues[0]).toEqual(0); expect(finalValues[finalValues.length - 1]).toEqual(0); }); it('should set end values - Explicit', () => { - const actual = testModule.fitFunction(sortedDS, { type: Fit.Explicit, value: 20, endValue }, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(sortedDS.data, { type: Fit.Explicit, value: 20, endValue }, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues[0]).toEqual(20); expect(finalValues[finalValues.length - 1]).toEqual(20); }); it('should set end values - Lookahead', () => { - const actual = testModule.fitFunction(dataSeries, { type: Fit.Lookahead, endValue }, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(dataSeries.data, { type: Fit.Lookahead, endValue }, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues[0]).toEqual(3); expect(finalValues[finalValues.length - 1]).toEqual(12); }); it('should set end values - Nearest', () => { - const actual = testModule.fitFunction(dataSeries, { type: Fit.Nearest, endValue }, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(dataSeries.data, { type: Fit.Nearest, endValue }, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues[0]).toEqual(3); expect(finalValues[finalValues.length - 1]).toEqual(12); }); it('should set end values - Average', () => { - const actual = testModule.fitFunction(dataSeries, { type: Fit.Average, endValue }, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(dataSeries.data, { type: Fit.Average, endValue }, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues[0]).toEqual(3); expect(finalValues[finalValues.length - 1]).toEqual(12); }); it('should set end values - Linear', () => { - const actual = testModule.fitFunction(dataSeries, { type: Fit.Linear, endValue }, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(dataSeries.data, { type: Fit.Linear, endValue }, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues[0]).toEqual(3); expect(finalValues[finalValues.length - 1]).toEqual(12); @@ -666,43 +692,42 @@ describe('Fit Function', () => { describe('Fit Types', () => { describe('None', () => { it('should return original dataSeries', () => { - const actual = testModule.fitFunction(dataSeries, Fit.None, scaleType); + const actual = testModule.fitFunction(dataSeries.data, Fit.None, scaleType); - expect(actual).toBe(dataSeries); + expect(actual).toBe(dataSeries.data); }); it('should return null data values without fit', () => { - const actual = testModule.fitFunction(dataSeries, Fit.None, scaleType); + const actual = testModule.fitFunction(dataSeries.data, Fit.None, scaleType); - expect(getFilledNullData(actual.data)).toEqualArrayOf(undefined, 7); + expect(getFilledNullData(actual)).toHaveLength(0); }); }); describe('Zero', () => { it('should NOT return original dataSeries', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Zero, scaleType); + const actual = testModule.fitFunction(dataSeries.data, Fit.Zero, scaleType); - expect(actual).not.toBe(dataSeries); + expect(actual).not.toBe(dataSeries.data); }); it('should return null data values with zeros', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Zero, scaleType); - const testActual = getFilledNullData(actual.data); - + const actual = testModule.fitFunction(dataSeries.data, Fit.Zero, scaleType); + const testActual = getFilledNullData(actual); expect(testActual).toEqualArrayOf(0, 7); }); }); describe('Explicit', () => { it('should return original dataSeries if no value provided', () => { - const actual = testModule.fitFunction(dataSeries, { type: Fit.Explicit }, scaleType); + const actual = testModule.fitFunction(dataSeries.data, { type: Fit.Explicit }, scaleType); - expect(actual).toBe(dataSeries); + expect(actual).toBe(dataSeries.data); }); it('should return null data values with set value', () => { - const actual = testModule.fitFunction(dataSeries, { type: Fit.Explicit, value: 20 }, scaleType); - const testActual = getFilledNullData(actual.data); + const actual = testModule.fitFunction(dataSeries.data, { type: Fit.Explicit, value: 20 }, scaleType); + const testActual = getFilledNullData(actual); expect(testActual).toEqualArrayOf(20, 7); }); @@ -710,20 +735,19 @@ describe('Fit Function', () => { describe('Lookahead', () => { it('should not return original dataSeries', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Lookahead, scaleType); + const actual = testModule.fitFunction(dataSeries.data, Fit.Lookahead, scaleType); - expect(actual).not.toBe(dataSeries); + expect(actual).not.toBe(dataSeries.data); }); it('should not fill non-null values', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Lookahead, scaleType); - - expect(getFilledNonNullData(actual.data)).toEqualArrayOf(undefined, 6); + const actual = testModule.fitFunction(dataSeries.data, Fit.Lookahead, scaleType); + expect(getFilledNonNullData(actual)).toEqualArrayOf(undefined, 6); }); it('should call getValue for first datum with correct args', () => { const ds = MockDataSeries.fitFunction({ ordinal, shuffle: false }); - testModule.fitFunction(ds, Fit.Lookahead, scaleType); + testModule.fitFunction(ds.data, Fit.Lookahead, scaleType); const [current, next] = ds.data; expect(testModule.getValue).nthCalledWith( @@ -739,8 +763,8 @@ describe('Fit Function', () => { it('should call getValue for 10th (4th null) datum with correct args', () => { const ds = MockDataSeries.fitFunction({ ordinal, shuffle: false }); - const actual = testModule.fitFunction(ds, Fit.Lookahead, scaleType); - const previous = actual.data[7]; + const actual = testModule.fitFunction(ds.data, Fit.Lookahead, scaleType); + const previous = actual[7]; const current = ds.data[8]; const next = ds.data[11]; @@ -757,7 +781,7 @@ describe('Fit Function', () => { it('should call getValue for last datum with correct args', () => { const ds = MockDataSeries.fitFunction({ ordinal, shuffle: false }); - testModule.fitFunction(ds, Fit.Lookahead, scaleType); + testModule.fitFunction(ds.data, Fit.Lookahead, scaleType); const [current, previous] = ds.data.slice().reverse(); expect(testModule.getValue).lastCalledWith( @@ -771,35 +795,36 @@ describe('Fit Function', () => { }); it('should call getValue for only null values', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Lookahead, scaleType); - const { length } = getFilledNullData(actual.data); + testModule.fitFunction(dataSeries.data, Fit.Lookahead, scaleType); + + const { length } = dataSeries.data.filter(({ y1 }) => y1 === null); expect(testModule.getValue).toBeCalledTimes(length); }); it('should fill null values correctly', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Lookahead, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(dataSeries.data, Fit.Lookahead, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues).toEqual([3, 3, 5, 4, 4, 5, 5, 6, 12, 12, 12, 12, null]); }); }); describe('Nearest', () => { it('should not return original dataSeries', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Nearest, scaleType); + const actual = testModule.fitFunction(dataSeries.data, Fit.Nearest, scaleType); - expect(actual).not.toBe(dataSeries); + expect(actual).not.toBe(dataSeries.data); }); it('should not fill non-null values', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Nearest, scaleType); + const actual = testModule.fitFunction(dataSeries.data, Fit.Nearest, scaleType); - expect(getFilledNonNullData(actual.data)).toEqualArrayOf(undefined, 6); + expect(getFilledNonNullData(actual)).toEqualArrayOf(undefined, 6); }); it('should call getValue for first datum with correct args', () => { const ds = MockDataSeries.fitFunction({ ordinal, shuffle: false }); - testModule.fitFunction(ds, Fit.Nearest, scaleType); + testModule.fitFunction(ds.data, Fit.Nearest, scaleType); const [current, next] = ds.data; expect(testModule.getValue).nthCalledWith( @@ -815,8 +840,8 @@ describe('Fit Function', () => { it('should call getValue for 10th (4th null) datum with correct args', () => { const ds = MockDataSeries.fitFunction({ ordinal, shuffle: false }); - const actual = testModule.fitFunction(ds, Fit.Nearest, scaleType); - const previous = actual.data[7]; + const actual = testModule.fitFunction(ds.data, Fit.Nearest, scaleType); + const previous = actual[7]; const current = ds.data[8]; const next = ds.data[11]; @@ -833,7 +858,7 @@ describe('Fit Function', () => { it('should call getValue for last datum with correct args', () => { const ds = MockDataSeries.fitFunction({ ordinal, shuffle: false }); - testModule.fitFunction(ds, Fit.Nearest, scaleType); + testModule.fitFunction(ds.data, Fit.Nearest, scaleType); const [current, previous] = ds.data.slice().reverse(); expect(testModule.getValue).lastCalledWith( @@ -847,15 +872,15 @@ describe('Fit Function', () => { }); it('should call getValue for only null values', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Nearest, scaleType); - const { length } = getFilledNullData(actual.data); + testModule.fitFunction(dataSeries.data, Fit.Nearest, scaleType); + const { length } = dataSeries.data.filter(({ y1 }) => y1 === null); expect(testModule.getValue).toBeCalledTimes(length); }); it('should fill null values correctly', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Nearest, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(dataSeries.data, Fit.Nearest, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues).toEqual([3, 3, 5, 5, 4, 4, 5, 6, 6, 6, 12, 12, 12]); }); @@ -863,20 +888,20 @@ describe('Fit Function', () => { describe('Average', () => { it('should not return original dataSeries', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Average, scaleType); + const actual = testModule.fitFunction(dataSeries.data, Fit.Average, scaleType); - expect(actual).not.toBe(dataSeries); + expect(actual).not.toBe(dataSeries.data); }); it('should not fill non-null values', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Average, scaleType); + const actual = testModule.fitFunction(dataSeries.data, Fit.Average, scaleType); - expect(getFilledNonNullData(actual.data)).toEqualArrayOf(undefined, 6); + expect(getFilledNonNullData(actual)).toEqualArrayOf(undefined, 6); }); it('should call getValue for first datum with correct args', () => { const ds = MockDataSeries.fitFunction({ ordinal, shuffle: false }); - testModule.fitFunction(ds, Fit.Average, scaleType); + testModule.fitFunction(ds.data, Fit.Average, scaleType); const [current, next] = ds.data; expect(testModule.getValue).nthCalledWith( @@ -892,8 +917,8 @@ describe('Fit Function', () => { it('should call getValue for 10th (4th null) datum with correct args', () => { const ds = MockDataSeries.fitFunction({ ordinal, shuffle: false }); - const actual = testModule.fitFunction(ds, Fit.Average, scaleType); - const previous = actual.data[7]; + const actual = testModule.fitFunction(ds.data, Fit.Average, scaleType); + const previous = actual[7]; const current = ds.data[8]; const next = ds.data[11]; @@ -910,7 +935,7 @@ describe('Fit Function', () => { it('should call getValue for last datum with correct args', () => { const ds = MockDataSeries.fitFunction({ ordinal, shuffle: false }); - testModule.fitFunction(ds, Fit.Average, scaleType); + testModule.fitFunction(ds.data, Fit.Average, scaleType); const [current, previous] = ds.data.slice().reverse(); expect(testModule.getValue).lastCalledWith( @@ -924,15 +949,15 @@ describe('Fit Function', () => { }); it('should call getValue for only null values', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Average, scaleType); - const { length } = getFilledNullData(actual.data); + testModule.fitFunction(dataSeries.data, Fit.Average, scaleType); + const { length } = dataSeries.data.filter(({ y1 }) => y1 === null); expect(testModule.getValue).toBeCalledTimes(length); }); it('should fill null values correctly', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Average, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(dataSeries.data, Fit.Average, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues).toEqual([null, 3, 5, 4.5, 4, 4.5, 5, 6, 9, 9, 9, 12, null]); }); @@ -940,20 +965,20 @@ describe('Fit Function', () => { describe('Linear', () => { it('should not return original dataSeries', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Linear, scaleType); + const actual = testModule.fitFunction(dataSeries.data, Fit.Linear, scaleType); - expect(actual).not.toBe(dataSeries); + expect(actual).not.toBe(dataSeries.data); }); it('should not fill non-null values', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Linear, scaleType); + const actual = testModule.fitFunction(dataSeries.data, Fit.Linear, scaleType); - expect(getFilledNonNullData(actual.data)).toEqualArrayOf(undefined, 6); + expect(getFilledNonNullData(actual)).toEqualArrayOf(undefined, 6); }); it('should call getValue for first datum with correct args', () => { const ds = MockDataSeries.fitFunction({ ordinal, shuffle: false }); - testModule.fitFunction(ds, Fit.Linear, scaleType); + testModule.fitFunction(ds.data, Fit.Linear, scaleType); const [current, next] = ds.data; expect(testModule.getValue).nthCalledWith( @@ -969,8 +994,8 @@ describe('Fit Function', () => { it('should call getValue for 10th (4th null) datum with correct args', () => { const ds = MockDataSeries.fitFunction({ ordinal, shuffle: false }); - const actual = testModule.fitFunction(ds, Fit.Linear, scaleType); - const previous = actual.data[7]; + const actual = testModule.fitFunction(ds.data, Fit.Linear, scaleType); + const previous = actual[7]; const current = ds.data[8]; const next = ds.data[11]; @@ -987,7 +1012,7 @@ describe('Fit Function', () => { it('should call getValue for last datum with correct args', () => { const ds = MockDataSeries.fitFunction({ ordinal, shuffle: false }); - testModule.fitFunction(ds, Fit.Linear, scaleType); + testModule.fitFunction(ds.data, Fit.Linear, scaleType); const [current, previous] = ds.data.slice().reverse(); expect(testModule.getValue).lastCalledWith( @@ -1001,15 +1026,15 @@ describe('Fit Function', () => { }); it('should call getValue for only null values', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Linear, scaleType); - const { length } = getFilledNullData(actual.data); + testModule.fitFunction(dataSeries.data, Fit.Linear, scaleType); + const { length } = dataSeries.data.filter(({ y1 }) => y1 === null); expect(testModule.getValue).toBeCalledTimes(length); }); it('should fill null values correctly', () => { - const actual = testModule.fitFunction(dataSeries, Fit.Linear, scaleType); - const finalValues = getYResolvedData(actual.data); + const actual = testModule.fitFunction(dataSeries.data, Fit.Linear, scaleType); + const finalValues = getYResolvedData(actual); expect(finalValues).toEqual([null, 3, 5, 4.5, 4, 4.5, 5, 6, 7.5, 9, 10.5, 12, null]); }); diff --git a/src/chart_types/xy_chart/utils/fit_function.ts b/src/chart_types/xy_chart/utils/fit_function.ts index 39e202e96f..dea33ebd6b 100644 --- a/src/chart_types/xy_chart/utils/fit_function.ts +++ b/src/chart_types/xy_chart/utils/fit_function.ts @@ -20,7 +20,7 @@ import { DeepNonNullable } from 'utility-types'; import { ScaleType } from '../../../scales/constants'; -import { DataSeries, DataSeriesDatum } from './series'; +import { DataSeriesDatum } from './series'; import { Fit, FitConfig } from './specs'; import { datumXSortPredicate } from './stacked_series_utils'; @@ -59,27 +59,36 @@ export const getValue = ( endValue?: number | 'nearest', ): DataSeriesDatum => { if (previous !== null && type === Fit.Carry) { + const { y1 } = previous; return { ...current, + y1, filled: { - y1: previous.y1, + ...current.filled, + y1, }, }; } if (next !== null && type === Fit.Lookahead) { + const { y1 } = next; return { ...current, + y1, filled: { - y1: next.y1, + ...current.filled, + y1, }, }; } if (previous !== null && next !== null) { if (type === Fit.Average) { + const y1 = (previous.y1 + next.y1) / 2; return { ...current, + y1, filled: { - y1: (previous.y1 + next.y1) / 2, + ...current.filled, + y1, }, }; } @@ -91,28 +100,37 @@ export const getValue = ( if (type === Fit.Nearest) { const x1Delta = Math.abs(currentX - x1); const x2Delta = Math.abs(currentX - x2); + const y1Delta = x1Delta > x2Delta ? y2 : y1; return { ...current, + y1: y1Delta, filled: { - y1: x1Delta > x2Delta ? y2 : y1, + ...current.filled, + y1: y1Delta, }, }; } if (type === Fit.Linear) { + // simple linear interpolation function + const linearInterpolatedY1 = previous.y1 + (currentX - x1) * ((y2 - y1) / (x2 - x1)); return { ...current, + y1: linearInterpolatedY1, filled: { - // simple linear interpolation function - y1: previous.y1 + (currentX - x1) * ((y2 - y1) / (x2 - x1)), + ...current.filled, + y1: linearInterpolatedY1, }, }; } } } else if ((previous !== null || next !== null) && (type === Fit.Nearest || endValue === 'nearest')) { + const nearestY1 = previous !== null ? previous.y1 : next!.y1; return { ...current, + y1: nearestY1, filled: { - y1: previous !== null ? previous.y1 : next!.y1, + ...current.filled, + y1: nearestY1, }, }; } @@ -124,7 +142,9 @@ export const getValue = ( // No matching fit - should only fall here on end conditions return { ...current, + y1: endValue, filled: { + ...current.filled, y1: endValue, }, }; @@ -160,45 +180,41 @@ export const parseConfig = (config?: Exclude | FitConfig): FitC /** @internal */ export const fitFunction = ( - dataSeries: DataSeries, + data: DataSeriesDatum[], fitConfig: Exclude | FitConfig, xScaleType: ScaleType, sorted = false, -): DataSeries => { +): DataSeriesDatum[] => { const { type, value, endValue } = parseConfig(fitConfig); if (type === Fit.None) { - return dataSeries; + return data; } - const { data } = dataSeries; - if (type === Fit.Zero) { - return { - ...dataSeries, - data: data.map((datum) => ({ - ...datum, - filled: { - y1: datum.y1 === null ? 0 : undefined, - }, - })), - }; + return data.map((datum) => ({ + ...datum, + y1: datum.y1 === null ? 0 : datum.y1, + filled: { + ...datum.filled, + y1: datum.y1 === null ? 0 : undefined, + }, + })); } if (type === Fit.Explicit) { if (value === undefined) { - return dataSeries; + return data; } - return { - ...dataSeries, - data: data.map((datum) => ({ - ...datum, - filled: { - y1: datum.y1 === null ? value : undefined, - }, - })), - }; + return data.map((datum) => ({ + ...datum, + y1: datum.y1 === null ? value : datum.y1, + filled: { + ...datum.filled, + y1: datum.y1 === null ? value : undefined, + }, + })); } const sortedData = sorted || xScaleType === ScaleType.Ordinal ? data : data.slice().sort(datumXSortPredicate(xScaleType)); @@ -208,10 +224,10 @@ export const fitFunction = ( for (let i = 0; i < sortedData.length; i++) { let j = i; - const current = sortedData[i]; + const currentValue = sortedData[i]; if ( - current.y1 === null + currentValue.y1 === null && nextNonNullDatum === null && (type === Fit.Lookahead || type === Fit.Nearest @@ -221,11 +237,11 @@ export const fitFunction = ( ) { // Forward lookahead to get next non-null value for (j = i + 1; j < sortedData.length; j++) { - const value = sortedData[j]; + const nextValue = sortedData[j]; - if (value.y1 !== null && value.x !== null) { + if (nextValue.y1 !== null && nextValue.x !== null) { nextNonNullDatum = { - ...(value as FullDataSeriesDatum), + ...(nextValue as FullDataSeriesDatum), fittingIndex: j, }; break; @@ -233,24 +249,21 @@ export const fitFunction = ( } } - const newValue = current.y1 === null ? getValue(current, i, previousNonNullDatum, nextNonNullDatum, type, endValue) : current; + const newValue = currentValue.y1 === null ? getValue(currentValue, i, previousNonNullDatum, nextNonNullDatum, type, endValue) : currentValue; newData[i] = newValue; - if (current.y1 !== null && current.x !== null) { + if (currentValue.y1 !== null && currentValue.x !== null) { previousNonNullDatum = { - ...(current as FullDataSeriesDatum), + ...(currentValue as FullDataSeriesDatum), fittingIndex: i, }; } - if (nextNonNullDatum !== null && nextNonNullDatum.x <= current.x) { + if (nextNonNullDatum !== null && nextNonNullDatum.x <= currentValue.x) { nextNonNullDatum = null; } } - return { - ...dataSeries, - data: newData, - }; + return newData; }; diff --git a/src/chart_types/xy_chart/utils/nonstacked_series_utils.ts b/src/chart_types/xy_chart/utils/fit_function_utils.ts similarity index 50% rename from src/chart_types/xy_chart/utils/nonstacked_series_utils.ts rename to src/chart_types/xy_chart/utils/fit_function_utils.ts index f3fb19b2eb..cc1d77b904 100644 --- a/src/chart_types/xy_chart/utils/nonstacked_series_utils.ts +++ b/src/chart_types/xy_chart/utils/fit_function_utils.ts @@ -18,24 +18,23 @@ */ import { ScaleType } from '../../../scales/constants'; -import { isDefined } from '../../../utils/commons'; import { getSpecsById } from '../state/utils/spec'; import { fitFunction } from './fit_function'; -import { DataSeries, DataSeriesDatum, RawDataSeries } from './series'; +import { DataSeries } from './series'; import { isAreaSeriesSpec, isLineSeriesSpec, SeriesSpecs, BasicSeriesSpec } from './specs'; + /** @internal */ -export const formatNonStackedDataSeriesValues = ( - dataseries: RawDataSeries[], - scaleToExtent: boolean, +export const applyFitFunctionToDataSeries = ( + dataseries: DataSeries[], seriesSpecs: SeriesSpecs, xScaleType: ScaleType, ): DataSeries[] => { const len = dataseries.length; const formattedValues: DataSeries[] = []; for (let i = 0; i < len; i++) { - const formattedDataValue = formatNonStackedDataValues(dataseries[i], scaleToExtent); - const spec = getSpecsById(seriesSpecs, formattedDataValue.specId); + const { specId, data, ...rest } = dataseries[i]; + const spec = getSpecsById(seriesSpecs, specId); if ( spec !== null @@ -43,44 +42,16 @@ export const formatNonStackedDataSeriesValues = ( && (isAreaSeriesSpec(spec) || isLineSeriesSpec(spec)) && spec.fit !== undefined ) { - const fittedData = fitFunction(formattedDataValue, spec.fit, xScaleType); - formattedValues.push(fittedData); - } else { - formattedValues.push(formattedDataValue); - } - } - return formattedValues; -}; + const fittedData = fitFunction(data, spec.fit, xScaleType); -/** @internal */ -export const formatNonStackedDataValues = (dataSeries: RawDataSeries, scaleToExtent: boolean): DataSeries => { - const len = dataSeries.data.length; - const formattedValues: DataSeries = { - ...dataSeries, - data: [], - }; - for (let i = 0; i < len; i++) { - const data = dataSeries.data[i]; - const { x, y1, mark, datum } = data; - let y0: number | null; - if (y1 === null) { - y0 = null; - } else if (scaleToExtent) { - y0 = data.y0 ? data.y0 : y1; + formattedValues.push({ + specId, + ...rest, + data: fittedData, + }); } else { - y0 = data.y0 ? data.y0 : 0; + formattedValues.push({ specId, data, ...rest }); } - - const formattedValue: DataSeriesDatum = { - x, - y1, - y0, - initialY1: y1, - initialY0: data.y0 == null || y1 === null ? null : data.y0, - mark: isDefined(mark) ? mark : null, - datum, - }; - formattedValues.data.push(formattedValue); } return formattedValues; }; diff --git a/src/chart_types/xy_chart/utils/nonstacked_series_utils.test.ts b/src/chart_types/xy_chart/utils/nonstacked_series_utils.test.ts index 0deabd676a..b7d3692d38 100644 --- a/src/chart_types/xy_chart/utils/nonstacked_series_utils.test.ts +++ b/src/chart_types/xy_chart/utils/nonstacked_series_utils.test.ts @@ -17,318 +17,120 @@ * under the License. */ -import { MockRawDataSeries, MockDataSeries } from '../../../mocks'; +import { MockDataSeries } from '../../../mocks'; import { MockSeriesSpecs, MockSeriesSpec } from '../../../mocks/specs'; +import { MockStore } from '../../../mocks/store'; import { ScaleType } from '../../../scales/constants'; +import { computeSeriesDomainsSelector } from '../state/selectors/compute_series_domains'; import * as fitFunctionModule from './fit_function'; -import * as testModule from './nonstacked_series_utils'; -import { RawDataSeries } from './series'; +import * as testModule from './fit_function_utils'; import { Fit } from './specs'; -const EMPTY_DATA_SET: RawDataSeries[] = [ - { - data: [], - seriesKeys: [], - yAccessor: 'y1', - splitAccessors: new Map(), - key: 'color-key', - specId: 'spec1', - }, -]; -const STANDARD_DATA_SET: RawDataSeries[] = [ - { - data: [ - { - x: 0, - y1: 10, - mark: null, - }, - ], - seriesKeys: [], - yAccessor: 'y1', - splitAccessors: new Map(), - key: 'color-key', - specId: 'spec1', - }, - { - data: [ - { - x: 0, - y1: 20, - mark: null, - }, - ], - seriesKeys: [], - yAccessor: 'y1', - splitAccessors: new Map(), - key: 'color-key', - specId: 'spec2', - }, - { - data: [ - { - x: 0, - y1: 30, - mark: null, - }, - ], - seriesKeys: [], - yAccessor: 'y1', - splitAccessors: new Map(), - key: 'color-key', - specId: 'spec3', - }, -]; -const WITH_NULL_DATASET: RawDataSeries[] = [ - { - data: [ - { - x: 0, - y1: 10, - mark: null, - }, - ], - seriesKeys: [], - yAccessor: 'y1', - splitAccessors: new Map(), - key: 'color-key', - specId: 'spec1', - }, - { - data: [ - { - x: 0, - y1: null, - mark: null, - }, - ], - seriesKeys: [], - yAccessor: 'y1', - splitAccessors: new Map(), - key: 'color-key', - specId: 'spec2', - }, - { - data: [ - { - x: 0, - y1: 30, - mark: null, - }, - ], - seriesKeys: [], - yAccessor: 'y1', - splitAccessors: new Map(), - key: 'color-key', - specId: 'spec3', - }, -]; -const STANDARD_DATA_SET_WY0: RawDataSeries[] = [ - { - data: [ - { - x: 0, - y0: 2, - y1: 10, - mark: null, - }, - ], - seriesKeys: [], - yAccessor: 'y1', - splitAccessors: new Map(), - key: 'color-key', - specId: 'spec1', - }, - { - data: [ - { - x: 0, - y0: 4, - y1: 20, - mark: null, - }, - ], - seriesKeys: [], - yAccessor: 'y1', - splitAccessors: new Map(), - key: 'color-key', - specId: 'spec2', - }, - { - data: [ - { - x: 0, - y0: 6, - y1: 30, - mark: null, - }, - ], - seriesKeys: [], - yAccessor: 'y1', - splitAccessors: new Map(), - key: 'color-key', - specId: 'spec3', - }, -]; -const WITH_NULL_DATASET_WY0: RawDataSeries[] = [ - { - data: [ - { - x: 0, - y0: 2, - y1: 10, - mark: null, - }, - ], - seriesKeys: [], - yAccessor: 'y1', - splitAccessors: new Map(), - key: 'color-key', - specId: 'spec1', - }, - { - data: [ - { - x: 0, - y1: null, - mark: null, - }, - ], - seriesKeys: [], - yAccessor: 'y1', - splitAccessors: new Map(), - key: 'color-key', - specId: 'spec2', - }, - { - data: [ - { - x: 0, - y0: 6, - y1: 30, - mark: null, - }, - ], - seriesKeys: [], - yAccessor: 'y1', - splitAccessors: new Map(), - key: 'color-key', - specId: 'spec3', - }, -]; -const DATA_SET_WITH_NULL_2: RawDataSeries[] = [ - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['a'], - key: 'a', - data: [ - { x: 1, y1: 1, mark: null }, - { x: 2, y1: 2, mark: null }, - { x: 4, y1: 4, mark: null }, - ], - }, - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['b'], - key: 'b', - data: [ - { x: 1, y1: 21, mark: null }, - { x: 3, y1: 23, mark: null }, - ], - }, -]; +const EMPTY_DATA_SET = MockSeriesSpec.area({ + xScaleType: ScaleType.Linear, + yAccessors: ['y1'], + splitSeriesAccessors: ['g'], + data: [], +}); +const STANDARD_DATA_SET = MockSeriesSpec.area({ + xScaleType: ScaleType.Linear, + yAccessors: ['y1'], + splitSeriesAccessors: ['g'], + data: [ + { x: 0, y1: 10, g: 'a' }, + { x: 0, y1: 20, g: 'b' }, + { x: 0, y1: 30, g: 'c' }, + ], +}); +const WITH_NULL_DATASET = MockSeriesSpec.area({ + xScaleType: ScaleType.Linear, + yAccessors: ['y1'], + splitSeriesAccessors: ['g'], + data: [ + { x: 0, y1: 10, g: 'a' }, + { x: 0, y1: null, g: 'b' }, + { x: 0, y1: 30, g: 'c' }, + ], +}); +const STANDARD_DATA_SET_WY0 = MockSeriesSpec.area({ + xScaleType: ScaleType.Linear, + yAccessors: ['y1'], + y0Accessors: ['y0'], + splitSeriesAccessors: ['g'], + data: [ + { x: 0, y0: 2, y1: 10, g: 'a' }, + { x: 0, y0: 4, y1: 20, g: 'b' }, + { x: 0, y0: 6, y1: 30, g: 'c' }, + ], +}); +const WITH_NULL_DATASET_WY0 = MockSeriesSpec.area({ + xScaleType: ScaleType.Linear, + yAccessors: ['y1'], + y0Accessors: ['y0'], + splitSeriesAccessors: ['g'], + data: [ + { x: 0, y0: 2, y1: 10, g: 'a' }, + { x: 0, y1: null, g: 'b' }, + { x: 0, y0: 6, y1: 30, g: 'c' }, + ], +}); +const DATA_SET_WITH_NULL_2 = MockSeriesSpec.area({ + xScaleType: ScaleType.Linear, + yAccessors: ['y1'], + splitSeriesAccessors: ['g'], + data: [ + { x: 1, y1: 1, g: 'a' }, + { x: 2, y1: 2, g: 'a' }, + { x: 4, y1: 4, g: 'a' }, + { x: 1, y1: 21, g: 'b' }, + { x: 3, y1: 23, g: 'b' }, + ], +}); describe('Non-Stacked Series Utils', () => { describe('Format stacked dataset', () => { test('empty data', () => { - const formattedData = testModule.formatNonStackedDataSeriesValues( - EMPTY_DATA_SET, - false, - MockSeriesSpecs.empty(), - ScaleType.Linear, - ); - expect(formattedData[0].data.length).toBe(0); + const store = MockStore.default(); + MockStore.addSpecs(EMPTY_DATA_SET, store); + const { formattedDataSeries: { nonStacked } } = computeSeriesDomainsSelector(store.getState()); + expect(nonStacked).toHaveLength(0); }); test('format data without nulls', () => { - let formattedData = testModule.formatNonStackedDataSeriesValues( - STANDARD_DATA_SET, - false, - MockSeriesSpecs.empty(), - ScaleType.Linear, - ); - expect(formattedData[0].data[0]).toEqual({ - datum: undefined, - initialY0: null, - initialY1: 10, - x: 0, - y0: 0, - y1: 10, - mark: null, - }); - expect(formattedData[1].data[0]).toEqual({ - datum: undefined, - initialY0: null, - initialY1: 20, - x: 0, - y0: 0, - y1: 20, - mark: null, - }); - expect(formattedData[2].data[0]).toEqual({ - datum: undefined, - initialY0: null, - initialY1: 30, - x: 0, - y0: 0, - y1: 30, - mark: null, - }); - formattedData = testModule.formatNonStackedDataSeriesValues( - STANDARD_DATA_SET, - true, - MockSeriesSpecs.empty(), - ScaleType.Linear, - ); - expect(formattedData[0].data[0]).toEqual({ - datum: undefined, + const store = MockStore.default(); + MockStore.addSpecs(STANDARD_DATA_SET, store); + const { formattedDataSeries: { nonStacked: [{ dataSeries }] } } = computeSeriesDomainsSelector(store.getState()); + + expect(dataSeries[0].data[0]).toMatchObject({ initialY0: null, initialY1: 10, x: 0, - y0: 10, + y0: null, y1: 10, mark: null, }); - expect(formattedData[1].data[0]).toEqual({ - datum: undefined, + expect(dataSeries[1].data[0]).toMatchObject({ initialY0: null, initialY1: 20, x: 0, - y0: 20, + y0: null, y1: 20, mark: null, }); - expect(formattedData[2].data[0]).toEqual({ - datum: undefined, + expect(dataSeries[2].data[0]).toMatchObject({ initialY0: null, initialY1: 30, x: 0, - y0: 30, + y0: null, y1: 30, mark: null, }); }); test('format data with nulls', () => { - const formattedData = testModule.formatNonStackedDataSeriesValues( - WITH_NULL_DATASET, - false, - MockSeriesSpecs.empty(), - ScaleType.Linear, - ); - expect(formattedData[1].data[0]).toEqual({ - datum: undefined, + const store = MockStore.default(); + MockStore.addSpecs(WITH_NULL_DATASET, store); + const { formattedDataSeries: { nonStacked: [{ dataSeries }] } } = computeSeriesDomainsSelector(store.getState()); + + + expect(dataSeries[1].data[0]).toMatchObject({ initialY0: null, initialY1: null, x: 0, @@ -338,14 +140,12 @@ describe('Non-Stacked Series Utils', () => { }); }); test('format data without nulls with y0 values', () => { - const formattedData = testModule.formatNonStackedDataSeriesValues( - STANDARD_DATA_SET_WY0, - false, - MockSeriesSpecs.empty(), - ScaleType.Linear, - ); - expect(formattedData[0].data[0]).toEqual({ - datum: undefined, + const store = MockStore.default(); + MockStore.addSpecs(STANDARD_DATA_SET_WY0, store); + const { formattedDataSeries: { nonStacked: [{ dataSeries }] } } = computeSeriesDomainsSelector(store.getState()); + + + expect(dataSeries[0].data[0]).toMatchObject({ initialY0: 2, initialY1: 10, x: 0, @@ -353,8 +153,7 @@ describe('Non-Stacked Series Utils', () => { y1: 10, mark: null, }); - expect(formattedData[1].data[0]).toEqual({ - datum: undefined, + expect(dataSeries[1].data[0]).toMatchObject({ initialY0: 4, initialY1: 20, x: 0, @@ -362,8 +161,7 @@ describe('Non-Stacked Series Utils', () => { y1: 20, mark: null, }); - expect(formattedData[2].data[0]).toEqual({ - datum: undefined, + expect(dataSeries[2].data[0]).toMatchObject({ initialY0: 6, initialY1: 30, x: 0, @@ -373,14 +171,11 @@ describe('Non-Stacked Series Utils', () => { }); }); test('format data with nulls - fit functions', () => { - const formattedData = testModule.formatNonStackedDataSeriesValues( - WITH_NULL_DATASET_WY0, - false, - MockSeriesSpecs.empty(), - ScaleType.Linear, - ); - expect(formattedData[0].data[0]).toEqual({ - datum: undefined, + const store = MockStore.default(); + MockStore.addSpecs(WITH_NULL_DATASET_WY0, store); + const { formattedDataSeries: { nonStacked: [{ dataSeries }] } } = computeSeriesDomainsSelector(store.getState()); + + expect(dataSeries[0].data[0]).toMatchObject({ initialY0: 2, initialY1: 10, x: 0, @@ -388,8 +183,7 @@ describe('Non-Stacked Series Utils', () => { y1: 10, mark: null, }); - expect(formattedData[1].data[0]).toEqual({ - datum: undefined, + expect(dataSeries[1].data[0]).toMatchObject({ initialY0: null, initialY1: null, x: 0, @@ -397,8 +191,7 @@ describe('Non-Stacked Series Utils', () => { y0: null, mark: null, }); - expect(formattedData[2].data[0]).toEqual({ - datum: undefined, + expect(dataSeries[2].data[0]).toMatchObject({ initialY0: 6, initialY1: 30, x: 0, @@ -408,58 +201,55 @@ describe('Non-Stacked Series Utils', () => { }); }); test('format data without nulls on second series', () => { - const formattedData = testModule.formatNonStackedDataSeriesValues( - DATA_SET_WITH_NULL_2, - false, - MockSeriesSpecs.empty(), - ScaleType.Linear, - ); - expect(formattedData.length).toBe(2); - expect(formattedData[0].data.length).toBe(3); - expect(formattedData[1].data.length).toBe(2); + const store = MockStore.default(); + MockStore.addSpecs(DATA_SET_WITH_NULL_2, store); + const { formattedDataSeries: { nonStacked: [{ dataSeries }] } } = computeSeriesDomainsSelector(store.getState()); + + + expect(dataSeries.length).toBe(2); + expect(dataSeries[0].data.length).toBe(4); + expect(dataSeries[1].data.length).toBe(4); - expect(formattedData[0].data[0]).toEqual({ - datum: undefined, + expect(dataSeries[0].data[0]).toMatchObject({ initialY0: null, initialY1: 1, x: 1, - y0: 0, + y0: null, // todo check if we can move that to 0 y1: 1, mark: null, }); - expect(formattedData[0].data[1]).toEqual({ - datum: undefined, + expect(dataSeries[0].data[1]).toMatchObject({ + initialY0: null, initialY1: 2, x: 2, - y0: 0, + y0: null, y1: 2, mark: null, }); - expect(formattedData[0].data[2]).toEqual({ - datum: undefined, + expect(dataSeries[0].data[3]).toMatchObject({ initialY0: null, initialY1: 4, x: 4, - y0: 0, + y0: null, y1: 4, mark: null, }); - expect(formattedData[1].data[0]).toEqual({ - datum: undefined, + expect(dataSeries[1].data[0]).toMatchObject({ + initialY0: null, initialY1: 21, x: 1, - y0: 0, + y0: null, y1: 21, mark: null, }); - expect(formattedData[1].data[1]).toEqual({ - datum: undefined, + expect(dataSeries[1].data[2]).toMatchObject({ + initialY0: null, initialY1: 23, x: 3, - y0: 0, + y0: null, y1: 23, mark: null, }); @@ -468,70 +258,56 @@ describe('Non-Stacked Series Utils', () => { describe('Using fit functions', () => { describe.each(['area', 'line'])('Spec type - %s', (specType) => { - const rawDataSeries = [MockRawDataSeries.fitFunction({ shuffle: false })]; - const dataSeries = MockDataSeries.fitFunction({ shuffle: false }); + const dataSeries = [MockDataSeries.fitFunction({ shuffle: false })]; + const dataSeriesData = MockDataSeries.fitFunction({ shuffle: false }).data; const spec = specType === 'area' ? MockSeriesSpec.area({ fit: Fit.Linear }) : MockSeriesSpec.line({ fit: Fit.Linear }); const seriesSpecs = MockSeriesSpecs.fromSpecs([spec]); beforeAll(() => { - jest.spyOn(fitFunctionModule, 'fitFunction').mockReturnValue(dataSeries); - jest.spyOn(testModule, 'formatNonStackedDataValues').mockReturnValue(dataSeries); - }); - - it('return call formatNonStackedDataValues with args', () => { - testModule.formatNonStackedDataSeriesValues(rawDataSeries, false, seriesSpecs, ScaleType.Linear); - - expect(testModule.formatNonStackedDataValues).toHaveBeenCalledWith(rawDataSeries[0], false); + jest.spyOn(fitFunctionModule, 'fitFunction').mockReturnValue(dataSeriesData); }); it('return call fitFunction with args', () => { - testModule.formatNonStackedDataSeriesValues(rawDataSeries, false, seriesSpecs, ScaleType.Linear); + testModule.applyFitFunctionToDataSeries(dataSeries, seriesSpecs, ScaleType.Linear); - expect(fitFunctionModule.fitFunction).toHaveBeenCalledWith(dataSeries, Fit.Linear, ScaleType.Linear); + expect(fitFunctionModule.fitFunction).toHaveBeenCalledWith(dataSeriesData, Fit.Linear, ScaleType.Linear); }); it('return not call fitFunction if no fit specified', () => { - const spec = specType === 'area' ? MockSeriesSpec.area({ fit: undefined }) : MockSeriesSpec.line({ fit: undefined }); - const noFitSpec = MockSeriesSpecs.fromSpecs([spec]); - testModule.formatNonStackedDataSeriesValues(rawDataSeries, false, noFitSpec, ScaleType.Linear); + const currentSpec = specType === 'area' ? MockSeriesSpec.area({ fit: undefined }) : MockSeriesSpec.line({ fit: undefined }); + const noFitSpec = MockSeriesSpecs.fromSpecs([currentSpec]); + testModule.applyFitFunctionToDataSeries(dataSeries, noFitSpec, ScaleType.Linear); expect(fitFunctionModule.fitFunction).not.toHaveBeenCalled(); }); it('return fitted dataSeries', () => { - const actual = testModule.formatNonStackedDataSeriesValues(rawDataSeries, false, seriesSpecs, ScaleType.Linear); + const actual = testModule.applyFitFunctionToDataSeries(dataSeries, seriesSpecs, ScaleType.Linear); - expect(actual[0]).toBe(dataSeries); + expect(actual[0].data).toBe(dataSeriesData); }); }); describe('Non area and line specs', () => { - const rawDataSeries = [MockRawDataSeries.fitFunction({ shuffle: false })]; - const dataSeries = MockDataSeries.fitFunction({ shuffle: false }); + const dataSeries = [MockDataSeries.fitFunction({ shuffle: false })]; + const dataSeriesData = MockDataSeries.fitFunction({ shuffle: false }).data; const spec = MockSeriesSpec.bar(); const seriesSpecs = MockSeriesSpecs.fromSpecs([spec]); beforeAll(() => { - jest.spyOn(fitFunctionModule, 'fitFunction').mockReturnValue(dataSeries); - jest.spyOn(testModule, 'formatNonStackedDataValues').mockReturnValue(dataSeries); - }); - - it('return call formatNonStackedDataValues with args', () => { - testModule.formatNonStackedDataSeriesValues(rawDataSeries, false, seriesSpecs, ScaleType.Linear); - - expect(testModule.formatNonStackedDataValues).toHaveBeenCalledWith(rawDataSeries[0], false); + jest.spyOn(fitFunctionModule, 'fitFunction').mockReturnValue(dataSeriesData); }); it('return call fitFunction with args', () => { - testModule.formatNonStackedDataSeriesValues(rawDataSeries, false, seriesSpecs, ScaleType.Linear); + testModule.applyFitFunctionToDataSeries(dataSeries, seriesSpecs, ScaleType.Linear); expect(fitFunctionModule.fitFunction).not.toHaveBeenCalled(); }); it('return fitted dataSeries', () => { - const actual = testModule.formatNonStackedDataSeriesValues(rawDataSeries, false, seriesSpecs, ScaleType.Linear); + const actual = testModule.applyFitFunctionToDataSeries(dataSeries, seriesSpecs, ScaleType.Linear); - expect(actual[0]).toBe(dataSeries); + expect(actual[0].data).toBe(dataSeriesData); }); }); }); diff --git a/src/chart_types/xy_chart/utils/scales.test.ts b/src/chart_types/xy_chart/utils/scales.test.ts index 828c23ec6b..6f3454440b 100644 --- a/src/chart_types/xy_chart/utils/scales.test.ts +++ b/src/chart_types/xy_chart/utils/scales.test.ts @@ -127,27 +127,30 @@ describe('Series scales', () => { groupId: 'g1', dataSeries: [], counts: { - areaSeries: 10, - barSeries: 2, - lineSeries: 2, + area: 10, + bar: 2, + line: 2, + bubble: 0, }, }, { groupId: 'g2', dataSeries: [], counts: { - areaSeries: 10, - barSeries: 20, - lineSeries: 2, + area: 10, + bar: 20, + line: 2, + bubble: 0, }, }, { groupId: 'g3', dataSeries: [], counts: { - areaSeries: 10, - barSeries: 0, - lineSeries: 2, + area: 10, + bar: 0, + line: 2, + bubble: 0, }, }, ]; @@ -156,18 +159,20 @@ describe('Series scales', () => { groupId: 'g1', dataSeries: [], counts: { - areaSeries: 10, - barSeries: 5, - lineSeries: 2, + area: 10, + bar: 5, + line: 2, + bubble: 0, }, }, { groupId: 'g2', dataSeries: [], counts: { - areaSeries: 10, - barSeries: 7, - lineSeries: 2, + area: 10, + bar: 7, + line: 2, + bubble: 0, }, }, ]; diff --git a/src/chart_types/xy_chart/utils/scales.ts b/src/chart_types/xy_chart/utils/scales.ts index 4b4b4a56f1..579bf4031e 100644 --- a/src/chart_types/xy_chart/utils/scales.ts +++ b/src/chart_types/xy_chart/utils/scales.ts @@ -22,6 +22,7 @@ import { ScaleType } from '../../../scales/constants'; import { GroupId } from '../../../utils/ids'; import { XDomain, YDomain } from '../domains/types'; import { FormattedDataSeries } from './series'; +import { SeriesTypes } from './specs'; /** * Count the max number of bars in cluster value. @@ -41,9 +42,9 @@ export function countBarsInCluster( // along x axis, we count one "space" per bar series. // we ignore the points, areas, lines as they are // aligned with the x value and doesn't occupy space - const nonStackedBarsInCluster = nonStacked.reduce((acc, ns) => acc + ns.counts.barSeries, 0); + const nonStackedBarsInCluster = nonStacked.reduce((acc, ns) => acc + ns.counts[SeriesTypes.Bar], 0); // count stacked bars groups as 1 per group - const stackedBarsInCluster = stacked.reduce((acc, ns) => acc + (ns.counts.barSeries > 0 ? 1 : 0), 0); + const stackedBarsInCluster = stacked.reduce((acc, ns) => acc + (ns.counts[SeriesTypes.Bar] > 0 ? 1 : 0), 0); const totalBarsInCluster = nonStackedBarsInCluster + stackedBarsInCluster; return { nonStackedBarsInCluster, diff --git a/src/chart_types/xy_chart/utils/series.test.ts b/src/chart_types/xy_chart/utils/series.test.ts index 6eb5c037b7..725295e96f 100644 --- a/src/chart_types/xy_chart/utils/series.test.ts +++ b/src/chart_types/xy_chart/utils/series.test.ts @@ -19,24 +19,27 @@ import { ChartTypes } from '../..'; import { MockSeriesIdentifier } from '../../../mocks/series/series_identifiers'; -import { MockSeriesSpec } from '../../../mocks/specs'; +import { MockSeriesSpec, MockGlobalSpec } from '../../../mocks/specs'; +import { MockStore } from '../../../mocks/store'; import { SeededDataGenerator } from '../../../mocks/utils'; import { ScaleType } from '../../../scales/constants'; import { SpecTypes } from '../../../specs/constants'; import { AccessorFn } from '../../../utils/accessor'; +import { Position } from '../../../utils/commons'; import * as TestDataset from '../../../utils/data_samples/test_dataset'; import { ColorConfig } from '../../../utils/themes/theme'; +import { computeSeriesDomainsSelector } from '../state/selectors/compute_series_domains'; import { SeriesCollectionValue, getFormattedDataseries, getSeriesColors, getSortedDataSeriesColorsValuesMap, - getSplittedSeries, - RawDataSeries, - splitSeries, + getDataSeriesBySpecId, + splitSeriesDataByAccessors, XYChartSeriesIdentifier, - cleanDatum, + extractYandMarkFromDatum, getSeriesName, + DataSeries, } from './series'; import { BasicSeriesSpec, LineSeriesSpec, SeriesTypes, AreaSeriesSpec } from './specs'; import { formatStackedDataSeriesValues } from './stacked_series_utils'; @@ -45,7 +48,7 @@ const dg = new SeededDataGenerator(); describe('Series', () => { test('Can split dataset into 1Y0G series', () => { - const splittedSeries = splitSeries({ + const splittedSeries = splitSeriesDataByAccessors({ id: 'spec1', data: TestDataset.BARCHART_1Y0G, xAccessor: 'x', @@ -53,88 +56,79 @@ describe('Series', () => { splitSeriesAccessors: ['y'], }); - expect(splittedSeries.rawDataSeries).toMatchSnapshot(); + expect([...splittedSeries.dataSeries.values()]).toMatchSnapshot(); }); test('Can split dataset into 1Y1G series', () => { - const splittedSeries = splitSeries({ + const splittedSeries = splitSeriesDataByAccessors({ id: 'spec1', data: TestDataset.BARCHART_1Y1G, xAccessor: 'x', yAccessors: ['y'], }); - expect(splittedSeries.rawDataSeries).toMatchSnapshot(); + expect([...splittedSeries.dataSeries.values()]).toMatchSnapshot(); }); test('Can split dataset into 1Y2G series', () => { - const splittedSeries = splitSeries({ + const splittedSeries = splitSeriesDataByAccessors({ id: 'spec1', data: TestDataset.BARCHART_1Y2G, xAccessor: 'x', yAccessors: ['y'], splitSeriesAccessors: ['g1', 'g2'], }); - expect(splittedSeries.rawDataSeries).toMatchSnapshot(); + expect([...splittedSeries.dataSeries.values()]).toMatchSnapshot(); }); test('Can split dataset into 2Y0G series', () => { - const splittedSeries = splitSeries({ + const splittedSeries = splitSeriesDataByAccessors({ id: 'spec1', data: TestDataset.BARCHART_2Y0G, xAccessor: 'x', yAccessors: ['y1', 'y2'], }); - expect(splittedSeries.rawDataSeries).toMatchSnapshot(); + expect([...splittedSeries.dataSeries.values()]).toMatchSnapshot(); }); test('Can split dataset into 2Y1G series', () => { - const splittedSeries = splitSeries({ + const splittedSeries = splitSeriesDataByAccessors({ id: 'spec1', data: TestDataset.BARCHART_2Y1G, xAccessor: 'x', yAccessors: ['y1', 'y2'], splitSeriesAccessors: ['g'], }); - expect(splittedSeries.rawDataSeries).toMatchSnapshot(); + expect([...splittedSeries.dataSeries.values()]).toMatchSnapshot(); }); test('Can split dataset into 2Y2G series', () => { - const splittedSeries = splitSeries({ + const splittedSeries = splitSeriesDataByAccessors({ id: 'spec1', data: TestDataset.BARCHART_2Y2G, xAccessor: 'x', yAccessors: ['y1', 'y2'], splitSeriesAccessors: ['g1', 'g2'], }); - expect(splittedSeries.rawDataSeries).toMatchSnapshot(); + expect([...splittedSeries.dataSeries.values()]).toMatchSnapshot(); }); test('Can stack simple dataseries', () => { - const dataSeries: RawDataSeries[] = [ - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['a'], - key: 'a', - data: [ - { x: 1, y1: 1, mark: null }, - { x: 2, y1: 2, mark: null }, - { x: 4, y1: 4, mark: null }, - ], - }, - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['b'], - key: 'b', - data: [ - { x: 1, y1: 21, mark: null }, - { x: 3, y1: 23, mark: null }, - ], - }, - ]; - const xValues = new Set([1, 2, 3, 4]); - const stackedValues = formatStackedDataSeriesValues(dataSeries, false, false, xValues, ScaleType.Linear); - expect(stackedValues).toMatchSnapshot(); + const store = MockStore.default(); + MockStore.addSpecs(MockSeriesSpec.area({ + id: 'spec1', + splitSeriesAccessors: ['g'], + yAccessors: ['y1'], + stackAccessors: ['x'], + xScaleType: ScaleType.Linear, + data: [ + { x: 1, y1: 1, g: 'a' }, + { x: 2, y1: 2, g: 'a' }, + { x: 4, y1: 4, g: 'a' }, + { x: 1, y1: 21, g: 'b' }, + { x: 3, y1: 23, g: 'b' }, + ], + }), store); + + const { formattedDataSeries: { stacked } } = computeSeriesDomainsSelector(store.getState()); + + expect(stacked[0].dataSeries).toMatchSnapshot(); }); test('Can stack multiple dataseries', () => { - const dataSeries: RawDataSeries[] = [ + const dataSeries: DataSeries[] = [ { specId: 'spec1', yAccessor: 'y1', @@ -142,10 +136,10 @@ describe('Series', () => { seriesKeys: ['a'], key: 'a', data: [ - { x: 1, y1: 1, mark: null }, - { x: 2, y1: 2, mark: null }, - { x: 3, y1: 3, mark: null }, - { x: 4, y1: 4, mark: null }, + { x: 1, y1: 1, mark: null, y0: null, initialY1: 1, initialY0: null, datum: undefined }, + { x: 2, y1: 2, mark: null, y0: null, initialY1: 2, initialY0: null, datum: undefined }, + { x: 3, y1: 3, mark: null, y0: null, initialY1: 3, initialY0: null, datum: undefined }, + { x: 4, y1: 4, mark: null, y0: null, initialY1: 4, initialY0: null, datum: undefined }, ], }, { @@ -155,10 +149,10 @@ describe('Series', () => { seriesKeys: ['b'], key: 'b', data: [ - { x: 1, y1: 1, mark: null }, - { x: 2, y1: 2, mark: null }, - { x: 3, y1: 3, mark: null }, - { x: 4, y1: 4, mark: null }, + { x: 1, y1: 1, mark: null, y0: null, initialY1: 1, initialY0: null, datum: undefined }, + { x: 2, y1: 2, mark: null, y0: null, initialY1: 2, initialY0: null, datum: undefined }, + { x: 3, y1: 3, mark: null, y0: null, initialY1: 3, initialY0: null, datum: undefined }, + { x: 4, y1: 4, mark: null, y0: null, initialY1: 4, initialY0: null, datum: undefined }, ], }, { @@ -168,10 +162,10 @@ describe('Series', () => { seriesKeys: ['b'], key: 'b', data: [ - { x: 1, y1: 1, mark: null }, - { x: 2, y1: 2, mark: null }, - { x: 3, y1: 3, mark: null }, - { x: 4, y1: 4, mark: null }, + { x: 1, y1: 1, mark: null, y0: null, initialY1: 1, initialY0: null, datum: undefined }, + { x: 2, y1: 2, mark: null, y0: null, initialY1: 2, initialY0: null, datum: undefined }, + { x: 3, y1: 3, mark: null, y0: null, initialY1: 3, initialY0: null, datum: undefined }, + { x: 4, y1: 4, mark: null, y0: null, initialY1: 4, initialY0: null, datum: undefined }, ], }, { @@ -181,57 +175,47 @@ describe('Series', () => { seriesKeys: ['b'], key: 'b', data: [ - { x: 1, y1: 1, mark: null }, - { x: 2, y1: 2, mark: null }, - { x: 3, y1: 3, mark: null }, - { x: 4, y1: 4, mark: null }, + { x: 1, y1: 1, mark: null, y0: null, initialY1: 1, initialY0: null, datum: undefined }, + { x: 2, y1: 2, mark: null, y0: null, initialY1: 2, initialY0: null, datum: undefined }, + { x: 3, y1: 3, mark: null, y0: null, initialY1: 3, initialY0: null, datum: undefined }, + { x: 4, y1: 4, mark: null, y0: null, initialY1: 4, initialY0: null, datum: undefined }, ], }, ]; const xValues = new Set([1, 2, 3, 4]); - const stackedValues = formatStackedDataSeriesValues(dataSeries, false, false, xValues, ScaleType.Linear); + const stackedValues = formatStackedDataSeriesValues(dataSeries, xValues); expect(stackedValues).toMatchSnapshot(); }); test('Can stack unsorted dataseries', () => { - const dataSeries: RawDataSeries[] = [ - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['a'], - key: 'a', - data: [ - { x: 1, y1: 1, mark: null }, - { x: 4, y1: 4, mark: null }, - { x: 2, y1: 2, mark: null }, - ], - }, - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['b'], - key: 'b', - data: [ - { x: 3, y1: 23, mark: null }, - { x: 1, y1: 21, mark: null }, - ], - }, - ]; - const xValues = new Set([1, 2, 3, 4]); - const stackedValues = formatStackedDataSeriesValues(dataSeries, false, false, xValues, ScaleType.Linear); - expect(stackedValues).toMatchSnapshot(); + const store = MockStore.default(); + MockStore.addSpecs(MockSeriesSpec.area({ + id: 'spec1', + splitSeriesAccessors: ['g'], + yAccessors: ['y1'], + stackAccessors: ['x'], + xScaleType: ScaleType.Linear, + data: [ + { x: 1, y1: 1, g: 'a' }, + { x: 4, y1: 4, g: 'a' }, + { x: 2, y1: 2, g: 'a' }, + { x: 3, y1: 23, g: 'b' }, + { x: 1, y1: 21, g: 'b' }, + ], + }), store); + const { formattedDataSeries: { stacked } } = computeSeriesDomainsSelector(store.getState()); + + expect(stacked[0].dataSeries).toMatchSnapshot(); }); test('Can stack high volume of dataseries', () => { const maxArrayItems = 1000; - const dataSeries: RawDataSeries[] = [ + const dataSeries: DataSeries[] = [ { specId: 'spec1', yAccessor: 'y1', splitAccessors: new Map(), seriesKeys: ['a'], key: 'a', - data: new Array(maxArrayItems).fill(0).map((d, i) => ({ x: i, y1: i, mark: null })), + data: new Array(maxArrayItems).fill(0).map((d, i) => ({ x: i, y1: i, mark: null, y0: null, initialY1: i, initialY0: null, datum: undefined })), }, { specId: 'spec1', @@ -239,193 +223,141 @@ describe('Series', () => { splitAccessors: new Map(), seriesKeys: ['b'], key: 'b', - data: new Array(maxArrayItems).fill(0).map((d, i) => ({ x: i, y1: i, mark: null })), + data: new Array(maxArrayItems).fill(0).map((d, i) => ({ x: i, y1: i, mark: null, y0: null, initialY1: i, initialY0: null, datum: undefined })), }, ]; const xValues = new Set(new Array(maxArrayItems).fill(0).map((d, i) => i)); - const stackedValues = formatStackedDataSeriesValues(dataSeries, false, false, xValues, ScaleType.Linear); + const stackedValues = formatStackedDataSeriesValues(dataSeries, xValues); expect(stackedValues).toMatchSnapshot(); }); test('Can stack simple dataseries with scale to extent', () => { - const dataSeries: RawDataSeries[] = [ - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['a'], - key: 'a', - data: [ - { x: 1, y1: 1, mark: null }, - { x: 2, y1: 2, mark: null }, - { x: 4, y1: 4, mark: null }, - ], - }, - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['b'], - key: 'b', + const store = MockStore.default(); + MockStore.addSpecs([ + MockGlobalSpec.axis({ + id: 'y', + position: Position.Left, + domain: { fit: true }, + }), + MockSeriesSpec.bar({ + id: 'spec1', + yAccessors: ['y1'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + xScaleType: ScaleType.Linear, data: [ - { x: 1, y1: 21, mark: null }, - { x: 3, y1: 23, mark: null }, + { x: 1, y1: 1, g: 'a' }, + { x: 2, y1: 2, g: 'a' }, + { x: 4, y1: 4, g: 'a' }, + { x: 1, y1: 21, g: 'b' }, + { x: 3, y1: 23, g: 'b' }, ], - }, - ]; - const xValues = new Set([1, 2, 3, 4]); - const stackedValues = formatStackedDataSeriesValues(dataSeries, true, false, xValues, ScaleType.Linear); - // the datum on the snapshots is undefined because we are not adding it to - // the test raw dataseries - expect(stackedValues).toMatchSnapshot(); + }), + ], + store); + + const seriesDomains = computeSeriesDomainsSelector(store.getState()); + expect(seriesDomains.formattedDataSeries.stacked[0].dataSeries).toMatchSnapshot(); }); test('Can stack multiple dataseries with scale to extent', () => { - const dataSeries: RawDataSeries[] = [ - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['a'], - key: 'a', - data: [ - { x: 1, y1: 1, mark: null }, - { x: 2, y1: 2, mark: null }, - { x: 3, y1: 3, mark: null }, - { x: 4, y1: 4, mark: null }, - ], - }, - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['b'], - key: 'b', - data: [ - { x: 1, y1: 1, mark: null }, - { x: 2, y1: 2, mark: null }, - { x: 3, y1: 3, mark: null }, - { x: 4, y1: 4, mark: null }, - ], - }, - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['b'], - key: 'b', - data: [ - { x: 1, y1: 1, mark: null }, - { x: 2, y1: 2, mark: null }, - { x: 3, y1: 3, mark: null }, - { x: 4, y1: 4, mark: null }, - ], - }, - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['b'], - key: 'b', + const store = MockStore.default(); + MockStore.addSpecs([ + MockGlobalSpec.axis({ + id: 'y', + position: Position.Left, + domain: { fit: true }, + }), + MockSeriesSpec.bar({ + id: 'spec1', + yAccessors: ['y1'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + xScaleType: ScaleType.Linear, data: [ - { x: 1, y1: 1, mark: null }, - { x: 2, y1: 2, mark: null }, - { x: 3, y1: 3, mark: null }, - { x: 4, y1: 4, mark: null }, + { x: 1, y1: 1, g: 'a' }, + { x: 2, y1: 2, g: 'a' }, + { x: 3, y1: 3, g: 'a' }, + { x: 4, y1: 4, g: 'a' }, + { x: 1, y1: 1, g: 'b' }, + { x: 2, y1: 2, g: 'b' }, + { x: 3, y1: 3, g: 'b' }, + { x: 4, y1: 4, g: 'b' }, + { x: 1, y1: 1, g: 'c' }, + { x: 2, y1: 2, g: 'c' }, + { x: 3, y1: 3, g: 'c' }, + { x: 4, y1: 4, g: 'c' }, + { x: 1, y1: 1, g: 'd' }, + { x: 2, y1: 2, g: 'd' }, + { x: 3, y1: 3, g: 'd' }, + { x: 4, y1: 4, g: 'd' }, ], - }, - ]; - const xValues = new Set([1, 2, 3, 4]); - const stackedValues = formatStackedDataSeriesValues(dataSeries, true, false, xValues, ScaleType.Linear); - // the datum on the snapshots is undefined because we are not adding it to - // the test raw dataseries - expect(stackedValues).toMatchSnapshot(); + }), + ], + store); + + const seriesDomains = computeSeriesDomainsSelector(store.getState()); + expect(seriesDomains.formattedDataSeries.stacked[0].dataSeries).toMatchSnapshot(); }); test('Can stack simple dataseries with y0', () => { - const dataSeries: RawDataSeries[] = [ - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['a'], - key: 'a', - data: [ - { x: 1, y1: 3, y0: 1, mark: null }, - { x: 2, y1: 3, y0: 2, mark: null }, - { x: 4, y1: 4, y0: 3, mark: null }, - ], - }, - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['b'], - key: 'b', + const store = MockStore.default(); + MockStore.addSpecs([ + MockGlobalSpec.axis({ + id: 'y', + position: Position.Left, + domain: { fit: true }, + }), + MockSeriesSpec.bar({ + id: 'spec1', + yAccessors: ['y1'], + y0Accessors: ['y0'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + xScaleType: ScaleType.Linear, data: [ - { x: 1, y1: 2, y0: 1, mark: null }, - { x: 2, y1: 3, y0: 1, mark: null }, - { x: 3, y1: 23, y0: 4, mark: null }, - { x: 4, y1: 4, y0: 1, mark: null }, + { x: 1, y1: 3, y0: 1, g: 'a' }, + { x: 2, y1: 3, y0: 2, g: 'a' }, + { x: 4, y1: 4, y0: 3, g: 'a' }, + { x: 1, y1: 2, y0: 1, g: 'b' }, + { x: 2, y1: 3, y0: 1, g: 'b' }, + { x: 3, y1: 23, y0: 4, g: 'b' }, + { x: 4, y1: 4, y0: 1, g: 'b' }, ], - }, - ]; - const xValues = new Set([1, 2, 3, 4]); - const stackedValues = formatStackedDataSeriesValues(dataSeries, true, false, xValues, ScaleType.Linear); - // 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); + }), + ], + store); - 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(); + const seriesDomains = computeSeriesDomainsSelector(store.getState()); + expect(seriesDomains.formattedDataSeries.stacked[0].dataSeries).toMatchSnapshot(); }); test('Can stack simple dataseries with scale to extent with y0', () => { - const dataSeries: RawDataSeries[] = [ - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['a'], - key: 'a', - data: [ - { x: 1, y1: 3, y0: 1, mark: null }, - { x: 2, y1: 3, y0: 2, mark: null }, - { x: 4, y1: 4, y0: 3, mark: null }, - ], - }, - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['b'], - key: 'b', + const store = MockStore.default(); + MockStore.addSpecs([ + MockGlobalSpec.axis({ + id: 'y', + position: Position.Left, + domain: { fit: true }, + }), + MockSeriesSpec.bar({ + id: 'spec1', + yAccessors: ['y1'], + y0Accessors: ['y0'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + xScaleType: ScaleType.Linear, data: [ - { x: 1, y1: 2, y0: 1, mark: null }, - { x: 2, y1: 3, y0: 1, mark: null }, - { x: 3, y1: 23, y0: 4, mark: null }, - { x: 4, y1: 4, y0: 1, mark: null }, + { x: 1, y1: 3, y0: 1, g: 'a' }, + { x: 2, y1: 3, y0: 2, g: 'a' }, + { x: 4, y1: 4, y0: 3, g: 'a' }, + { x: 1, y1: 2, y0: 1, g: 'b' }, + { x: 2, y1: 3, y0: 1, g: 'b' }, + { x: 3, y1: 23, y0: 4, g: 'b' }, + { x: 4, y1: 4, y0: 1, g: 'b' }, ], - }, - ]; - const xValues = new Set([1, 2, 3, 4]); - const stackedValues = formatStackedDataSeriesValues(dataSeries, true, false, xValues, ScaleType.Linear); - // 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(); + }), + ], + store); + + const seriesDomains = computeSeriesDomainsSelector(store.getState()); + expect(seriesDomains.formattedDataSeries.stacked[0].dataSeries).toMatchSnapshot(); }); test('should split an array of specs into data series', () => { @@ -457,9 +389,9 @@ describe('Series', () => { hideInLegend: false, }; - const splittedDataSeries = getSplittedSeries([spec1, spec2]); - expect(splittedDataSeries.splittedSeries.get('spec1')).toMatchSnapshot(); - expect(splittedDataSeries.splittedSeries.get('spec2')).toMatchSnapshot(); + const splittedDataSeries = getDataSeriesBySpecId([spec1, spec2]); + expect(splittedDataSeries.dataSeriesBySpecId.get('spec1')).toMatchSnapshot(); + expect(splittedDataSeries.dataSeriesBySpecId.get('spec2')).toMatchSnapshot(); }); test('should compute data series for stacked specs', () => { const spec1: BasicSeriesSpec = { @@ -490,10 +422,10 @@ describe('Series', () => { hideInLegend: false, }; const xValues = new Set([0, 1, 2, 3]); - const splittedDataSeries = getSplittedSeries([spec1, spec2]); + const splittedDataSeries = getDataSeriesBySpecId([spec1, spec2]); const stackedDataSeries = getFormattedDataseries( [spec1, spec2], - splittedDataSeries.splittedSeries, + splittedDataSeries.dataSeriesBySpecId, xValues, ScaleType.Linear, [], @@ -585,11 +517,11 @@ describe('Series', () => { hideInLegend: false, }; - const allSeries = getSplittedSeries([splitSpec]); - expect(allSeries.splittedSeries.get(specId)?.length).toBe(2); + const allSeries = getDataSeriesBySpecId([splitSpec]); + expect(allSeries.dataSeriesBySpecId.get(specId)?.length).toBe(2); - const emptyDeselected = getSplittedSeries([splitSpec]); - expect(emptyDeselected.splittedSeries.get(specId)?.length).toBe(2); + const emptyDeselected = getDataSeriesBySpecId([splitSpec]); + expect(emptyDeselected.dataSeriesBySpecId.get(specId)?.length).toBe(2); const deselectedDataSeries: XYChartSeriesIdentifier[] = [ { @@ -600,8 +532,8 @@ describe('Series', () => { key: 'spec{splitSpec}yAccessor{y1}splitAccessors{}', }, ]; - const subsetSplit = getSplittedSeries([splitSpec], deselectedDataSeries); - expect(subsetSplit.splittedSeries.get(specId)?.length).toBe(1); + const subsetSplit = getDataSeriesBySpecId([splitSpec], deselectedDataSeries); + expect(subsetSplit.dataSeriesBySpecId.get(specId)?.length).toBe(1); }); test('should sort series color by series spec sort index', () => { @@ -678,26 +610,26 @@ describe('Series', () => { expect(getSortedDataSeriesColorsValuesMap(seriesCollection)).toEqual(undefinedSortedColorValues); }); test('clean datum shall parse string as number for y values', () => { - let datum = cleanDatum([0, 1, 2], 0, 1, [], 2); + let datum = extractYandMarkFromDatum([0, 1, 2], 1, [], 2); expect(datum).toBeDefined(); expect(datum?.y1).toBe(1); expect(datum?.y0).toBe(2); - datum = cleanDatum([0, '1', 2], 0, 1, [], 2); + datum = extractYandMarkFromDatum([0, '1', 2], 1, [], 2); expect(datum).toBeDefined(); expect(datum?.y1).toBe(1); expect(datum?.y0).toBe(2); - datum = cleanDatum([0, '1', '2'], 0, 1, [], 2); + datum = extractYandMarkFromDatum([0, '1', '2'], 1, [], 2); expect(datum).toBeDefined(); expect(datum?.y1).toBe(1); expect(datum?.y0).toBe(2); - datum = cleanDatum([0, 1, '2'], 0, 1, [], 2); + datum = extractYandMarkFromDatum([0, 1, '2'], 1, [], 2); expect(datum).toBeDefined(); expect(datum?.y1).toBe(1); expect(datum?.y0).toBe(2); - datum = cleanDatum([0, 'invalid', 'invalid'], 0, 1, [], 2); + datum = extractYandMarkFromDatum([0, 'invalid', 'invalid'], 1, [], 2); expect(datum).toBeDefined(); expect(datum?.y1).toBe(null); expect(datum?.y0).toBe(null); @@ -921,27 +853,27 @@ describe('Series', () => { describe('functional accessors', () => { test('Can split dataset into 2Y2G series', () => { const xAccessor: AccessorFn = (d) => d.x; - const splittedSeries = splitSeries({ + const splittedSeries = splitSeriesDataByAccessors({ id: 'spec1', data: TestDataset.BARCHART_2Y2G, xAccessor, yAccessors: ['y1', 'y2'], splitSeriesAccessors: ['g1', 'g2'], }); - expect(splittedSeries.rawDataSeries.length).toBe(8); - expect(splittedSeries.rawDataSeries).toMatchSnapshot(); + expect([...splittedSeries.dataSeries.values()].length).toBe(8); + expect([...splittedSeries.dataSeries.values()]).toMatchSnapshot(); }); test('Can split dataset with custom _all xAccessor', () => { const xAccessor: AccessorFn = () => '_all'; - const splittedSeries = splitSeries({ + const splittedSeries = splitSeriesDataByAccessors({ id: 'spec1', data: TestDataset.BARCHART_2Y2G, xAccessor, yAccessors: ['y1'], }); - expect(splittedSeries.rawDataSeries.length).toBe(1); - expect(splittedSeries.rawDataSeries).toMatchSnapshot(); + expect([...splittedSeries.dataSeries.values()].length).toBe(1); + expect([...splittedSeries.dataSeries.values()]).toMatchSnapshot(); }); test('Shall ignore undefined values on splitSeriesAccessors', () => { @@ -961,9 +893,9 @@ describe('Series', () => { yAccessors: [1], splitSeriesAccessors: [2], }); - const splittedSeries = splitSeries(spec); - expect(splittedSeries.rawDataSeries.length).toBe(2); - expect(splittedSeries.rawDataSeries).toMatchSnapshot(); + const splittedSeries = splitSeriesDataByAccessors(spec); + expect([...splittedSeries.dataSeries.values()].length).toBe(2); + expect([...splittedSeries.dataSeries.values()]).toMatchSnapshot(); }); test('Should ignore series if splitSeriesAccessors are defined but not contained in any datum', () => { const spec = MockSeriesSpec.bar({ @@ -976,8 +908,8 @@ describe('Series', () => { yAccessors: [1], splitSeriesAccessors: [2], }); - const splittedSeries = splitSeries(spec); - expect(splittedSeries.rawDataSeries.length).toBe(0); + const splittedSeries = splitSeriesDataByAccessors(spec); + expect([...splittedSeries.dataSeries.values()].length).toBe(0); }); }); }); diff --git a/src/chart_types/xy_chart/utils/series.ts b/src/chart_types/xy_chart/utils/series.ts index 6666228274..19a2afcdb8 100644 --- a/src/chart_types/xy_chart/utils/series.ts +++ b/src/chart_types/xy_chart/utils/series.ts @@ -27,14 +27,14 @@ import { Logger } from '../../../utils/logger'; import { ColorConfig } from '../../../utils/themes/theme'; import { splitSpecsByGroupId, YBasicSeriesSpec } from '../domains/y_domain'; import { LastValues } from '../state/utils/types'; -import { formatNonStackedDataSeriesValues } from './nonstacked_series_utils'; -import { BasicSeriesSpec, SeriesTypes, SeriesSpecs, SeriesNameConfigOptions } from './specs'; +import { applyFitFunctionToDataSeries } from './fit_function_utils'; +import { BasicSeriesSpec, SeriesTypes, SeriesSpecs, SeriesNameConfigOptions, StackMode } from './specs'; import { formatStackedDataSeriesValues } from './stacked_series_utils'; /** @internal */ export const SERIES_DELIMITER = ' - '; -/** @internal */ +/** @public */ export interface FilledValues { /** the x value */ x?: number | string; @@ -44,20 +44,7 @@ export interface FilledValues { y0?: number; } -export interface RawDataSeriesDatum { - /** the x value */ - x: number | string; - /** the main y metric */ - y1: number | null; - /** the optional y0 metric, used for bars and area with a lower bound */ - y0?: number | null; - /** the optional mark metric, used for lines and area series */ - mark?: number | null; - /** the datum */ - datum?: T | null; -} - -/** @internal */ +/** @public */ export interface DataSeriesDatum { /** the x value */ x: number | string; @@ -89,25 +76,16 @@ export type DataSeries = XYChartSeriesIdentifier & { data: DataSeriesDatum[]; }; -/** @internal */ -export type RawDataSeries = XYChartSeriesIdentifier & { - // seriesColorKey: string; - data: RawDataSeriesDatum[]; -}; - /** @internal */ export interface FormattedDataSeries { groupId: GroupId; dataSeries: DataSeries[]; counts: DataSeriesCounts; + stackMode?: StackMode; } /** @internal */ -export interface DataSeriesCounts { - barSeries: number; - lineSeries: number; - areaSeries: number; -} +export type DataSeriesCounts = {[key in SeriesTypes]: number}; /** @internal */ export type SeriesCollectionValue = { @@ -129,9 +107,11 @@ export function getSeriesIndex(series: SeriesIdentifier[], target: SeriesIdentif /** * Split a dataset into multiple series depending on the accessors. * Each series is then associated with a key thats belong to its configuration. - * @internal + * This method removes every data with an invalid x: a string or number value is required + * `y` values and `mark` values are casted to number or null. + * @internal */ -export function splitSeries({ +export function splitSeriesDataByAccessors({ id: specId, data, xAccessor, @@ -143,14 +123,11 @@ export function splitSeries({ BasicSeriesSpec, 'id' | 'data' | 'xAccessor' | 'yAccessors' | 'y0Accessors' | 'splitSeriesAccessors' | 'markSizeAccessor' >): { - rawDataSeries: RawDataSeries[]; - colorsValues: Set; - xValues: Set; + dataSeries: Map; + xValues: Array; } { - const isMultipleY = yAccessors && yAccessors.length > 1; - const series = new Map(); - const colorsValues = new Set(); - const xValues = new Set(); + const dataSeries = new Map(); + const xValues: Array = []; const nonNumericValues: any[] = []; data.forEach((datum) => { @@ -160,38 +137,49 @@ export function splitSeries({ return; } - if (isMultipleY) { - yAccessors.forEach((accessor, index) => { - const cleanedDatum = cleanDatum( - datum, - xAccessor, - accessor, - nonNumericValues, - y0Accessors && y0Accessors[index], - markSizeAccessor, - ); - - if (cleanedDatum !== null && cleanedDatum.x !== null && cleanedDatum.x !== undefined) { - xValues.add(cleanedDatum.x); - const seriesKey = updateSeriesMap(series, splitAccessors, accessor, cleanedDatum, specId); - colorsValues.add(seriesKey); - } - }); - } else { - const cleanedDatum = cleanDatum( + // skip if the datum is not an object or null + if (typeof datum !== 'object' || datum === null) { + return null; + } + + const x = getAccessorValue(datum, xAccessor); + + // skip if the x value is not a string or a number + if (typeof x !== 'string' && typeof x !== 'number') { + return null; + } + + xValues.push(x); + + yAccessors.forEach((accessor, index) => { + const cleanedDatum = extractYandMarkFromDatum( datum, - xAccessor, - yAccessors[0], + accessor, nonNumericValues, - y0Accessors && y0Accessors[0], + y0Accessors && y0Accessors[index], markSizeAccessor, ); - if (cleanedDatum !== null && cleanedDatum.x !== null && cleanedDatum.x !== undefined) { - xValues.add(cleanedDatum.x); - const seriesKey = updateSeriesMap(series, splitAccessors, yAccessors[0], cleanedDatum, specId); - colorsValues.add(seriesKey); + const seriesKeys = [...splitAccessors.values(), accessor]; + const seriesKey = getSeriesKey({ + specId, + yAccessor: accessor, + splitAccessors, + }); + const newDatum = { x, ...cleanedDatum }; + const series = dataSeries.get(seriesKey); + if (series) { + series.data.push(newDatum); + } else { + dataSeries.set(seriesKey, { + specId, + yAccessor: accessor, + splitAccessors, + data: [newDatum], + key: seriesKey, + seriesKeys, + }); } - } + }); }); if (nonNumericValues.length > 0) { @@ -201,8 +189,7 @@ export function splitSeries({ } return { - rawDataSeries: [...series.values()], - colorsValues, + dataSeries, xValues, }; } @@ -223,40 +210,6 @@ export function getSeriesKey({ return `spec{${specId}}yAccessor{${yAccessor}}splitAccessors{${joinedAccessors}}`; } -/** - * Mutate the passed map adding or updating the DataSeries stored - * along with the series key - * @internal - */ -function updateSeriesMap( - seriesMap: Map, - splitAccessors: Map, - accessor: any, - datum: RawDataSeriesDatum, - specId: SpecId, -): string { - const seriesKeys = [...splitAccessors.values(), accessor]; - const seriesKey = getSeriesKey({ - specId, - yAccessor: accessor, - splitAccessors, - }); - const series = seriesMap.get(seriesKey); - if (series) { - series.data.push(datum); - } else { - seriesMap.set(seriesKey, { - specId, - yAccessor: accessor, - splitAccessors, - data: [datum], - key: seriesKey, - seriesKeys, - }); - } - return seriesKey; -} - /** * Get the array of values that forms a series key * @internal @@ -275,34 +228,25 @@ function getSplitAccessors(datum: Datum, accessors: Accessor[] = []): Map { + const mark = markSizeAccessor === undefined + ? null + : castToNumber( + getAccessorValue(datum, markSizeAccessor), + nonNumericValues + ); const y1 = castToNumber(datum[yAccessor], nonNumericValues); - const cleanedDatum: RawDataSeriesDatum = { x, y1, datum, y0: null, mark }; - if (y0Accessor) { - cleanedDatum.y0 = castToNumber(datum[y0Accessor as keyof typeof datum], nonNumericValues); - } - return cleanedDatum; + const y0 = y0Accessor ? castToNumber(datum[y0Accessor as keyof typeof datum], nonNumericValues) : null; + return { y1, datum, y0, mark, initialY0: y0, initialY1: y1 }; } function castToNumber(value: any, nonNumericValues: any[]): number | null { @@ -313,7 +257,6 @@ function castToNumber(value: any, nonNumericValues: any[]): number | null { if (isNaN(num)) { nonNumericValues.push(value); - return null; } return num; @@ -322,7 +265,7 @@ function castToNumber(value: any, nonNumericValues: any[]): number | null { /** @internal */ export function getFormattedDataseries( specs: YBasicSeriesSpec[], - dataSeries: Map, + availableDataSeries: Map, xValues: Set, xScaleType: ScaleType, seriesSpecs: SeriesSpecs, @@ -337,6 +280,7 @@ export function getFormattedDataseries( groupId: GroupId; dataSeries: DataSeries[]; counts: DataSeriesCounts; + stackMode?: StackMode; }[] = []; const nonStackedFormattedDataSeries: { groupId: GroupId; @@ -345,28 +289,29 @@ export function getFormattedDataseries( }[] = []; specsByGroupIdsEntries.forEach(([groupId, groupSpecs]) => { - const { isPercentageStack } = groupSpecs; + const { stackMode } = groupSpecs; // format stacked data series - const stackedDataSeries = getRawDataSeries(groupSpecs.stacked, dataSeries); - const stackedDataSeriesValues = formatStackedDataSeriesValues( - stackedDataSeries.rawDataSeries, - false, - isPercentageStack, + const stackedDataSeries = getDataSeriesBySpecGroup(groupSpecs.stacked, availableDataSeries); + const fittedDataSeries = applyFitFunctionToDataSeries(stackedDataSeries.dataSeries, seriesSpecs, xScaleType); + const fittedAndStackedDataSeries = formatStackedDataSeriesValues( + fittedDataSeries, xValues, - xScaleType, + stackMode, ); + stackedFormattedDataSeries.push({ groupId, counts: stackedDataSeries.counts, - dataSeries: stackedDataSeriesValues, + dataSeries: fittedAndStackedDataSeries, + stackMode, }); // format non stacked data series - const nonStackedDataSeries = getRawDataSeries(groupSpecs.nonStacked, dataSeries); + const nonStackedDataSeries = getDataSeriesBySpecGroup(groupSpecs.nonStacked, availableDataSeries); nonStackedFormattedDataSeries.push({ groupId, counts: nonStackedDataSeries.counts, - dataSeries: formatNonStackedDataSeriesValues(nonStackedDataSeries.rawDataSeries, false, seriesSpecs, xScaleType), + dataSeries: applyFitFunctionToDataSeries(nonStackedDataSeries.dataSeries, seriesSpecs, xScaleType), }); }); return { @@ -375,105 +320,115 @@ export function getFormattedDataseries( }; } -function getRawDataSeries( +function getDataSeriesBySpecGroup( seriesSpecs: YBasicSeriesSpec[], - dataSeries: Map, + dataSeries: Map, ): { - rawDataSeries: RawDataSeries[]; + dataSeries: DataSeries[]; counts: DataSeriesCounts; } { - const rawDataSeries: RawDataSeries[] = []; - const counts = { - barSeries: 0, - lineSeries: 0, - areaSeries: 0, - }; - const seriesSpecsCount = seriesSpecs.length; - let i = 0; - for (; i < seriesSpecsCount; i++) { - const spec = seriesSpecs[i]; - const { id, seriesType } = spec; + return seriesSpecs.reduce<{ + dataSeries: DataSeries[]; + counts: DataSeriesCounts; + }>((acc, { id, seriesType }) => { const ds = dataSeries.get(id); - switch (seriesType) { - case SeriesTypes.Bar: - counts.barSeries += ds ? ds.length : 0; - break; - case SeriesTypes.Line: - counts.lineSeries += ds ? ds.length : 0; - break; - case SeriesTypes.Area: - default: - counts.areaSeries += ds ? ds.length : 0; - break; + if (!ds) { + return acc; } - if (ds) { - rawDataSeries.push(...ds); - } - } - return { - rawDataSeries, - counts, - }; + acc.dataSeries.push(...ds); + acc.counts[seriesType] += ds.length; + return acc; + }, { + dataSeries: [], + counts: { + [SeriesTypes.Bar]: 0, + [SeriesTypes.Area]: 0, + [SeriesTypes.Line]: 0, + [SeriesTypes.Bubble]: 0, + }, + }); } + /** * * @param seriesSpecs the map for all the series spec * @param deselectedDataSeries the array of deselected/hidden data series * @internal */ -export function getSplittedSeries( +export function getDataSeriesBySpecId( seriesSpecs: BasicSeriesSpec[], deselectedDataSeries: SeriesIdentifier[] = [], ): { - splittedSeries: Map; + dataSeriesBySpecId: Map; seriesCollection: Map; xValues: Set; fallbackScale?: ScaleType; } { - const splittedSeries = new Map(); + const dataSeriesBySpecId = new Map(); const seriesCollection = new Map(); - const xValues: Set = new Set(); + + // the unique set of values along the x axis + const globalXValues: Set = new Set(); + let isNumberArray = true; let isOrdinalScale = false; // eslint-disable-next-line no-restricted-syntax for (const spec of seriesSpecs) { - const dataSeries = splitSeries(spec); - let currentRawDataSeries = dataSeries.rawDataSeries; + // check scale type and cast to Ordinal if we found at least one series + // with Ordinal Scale if (spec.xScaleType === ScaleType.Ordinal) { isOrdinalScale = true; } + + const { dataSeries, xValues } = splitSeriesDataByAccessors(spec); + + // filter deleselected dataseries + let filteredDataSeries: DataSeries[] = [...dataSeries.values()]; if (deselectedDataSeries.length > 0) { - currentRawDataSeries = dataSeries.rawDataSeries.filter(({ key }) => !deselectedDataSeries.some(({ key: deselectedKey }) => key === deselectedKey)); + filteredDataSeries = filteredDataSeries.filter( + ({ key }) => + !deselectedDataSeries.some( + ({ key: deselectedKey }) => key === deselectedKey + ) + ); } - splittedSeries.set(spec.id, currentRawDataSeries); + dataSeriesBySpecId.set(spec.id, filteredDataSeries); const banded = spec.y0Accessors && spec.y0Accessors.length > 0; - dataSeries.rawDataSeries.forEach((series) => { + dataSeries.forEach((series, key) => { const { data, ...seriesIdentifier } = series; - seriesCollection.set(series.key, { + seriesCollection.set(key, { banded, specSortIndex: spec.sortIndex, seriesIdentifier, }); }); + // check the nature of the x values. If all of them are numbers + // we can use a continuous scale, if not we should use an ordinal scale. + // The xValue is already casted to be a valid number or a string // eslint-disable-next-line no-restricted-syntax - for (const xValue of dataSeries.xValues) { + for (const xValue of xValues) { if (isNumberArray && typeof xValue !== 'number') { isNumberArray = false; } - xValues.add(xValue); + globalXValues.add(xValue); } } - return { - splittedSeries, + dataSeriesBySpecId, seriesCollection, // keep the user order for ordinal scales - xValues: (isOrdinalScale || !isNumberArray) ? xValues : new Set([...xValues].sort()), + xValues: (isOrdinalScale || !isNumberArray) ? globalXValues : new Set([...globalXValues] + .sort((a, b) => { + if (typeof a === 'string' || typeof b === 'string') { + return 0; + } + return a - b; + })), fallbackScale: (!isOrdinalScale && !isNumberArray) ? ScaleType.Ordinal : undefined, }; } diff --git a/src/chart_types/xy_chart/utils/specs.ts b/src/chart_types/xy_chart/utils/specs.ts index 84aafcc4b0..89788d6934 100644 --- a/src/chart_types/xy_chart/utils/specs.ts +++ b/src/chart_types/xy_chart/utils/specs.ts @@ -42,22 +42,44 @@ import { } from '../../../utils/themes/theme'; import { PrimitiveValue } from '../../partition_chart/layout/utils/group_by_rollup'; import { AnnotationTooltipFormatter, CustomAnnotationTooltip } from '../annotations/types'; -import { RawDataSeriesDatum, XYChartSeriesIdentifier } from './series'; +import { XYChartSeriesIdentifier, DataSeriesDatum } from './series'; /** @public */ export type BarStyleOverride = RecursivePartial | Color | null; /** @public */ export type PointStyleOverride = RecursivePartial | Color | null; +/** @public */ export const SeriesTypes = Object.freeze({ Area: 'area' as const, Bar: 'bar' as const, Line: 'line' as const, Bubble: 'bubble' as const, }); + /** @public */ export type SeriesTypes = $Values; + +/** + * The offset and mode applied when stacking values + * @public + */ +export const StackMode = Object.freeze({ + /** Applies a zero baseline and normalizes the values for each point such that the topline is always one. */ + Percentage: 'percentage' as const, + /** Shifts the baseline so as to minimize the weighted wiggle of layers. */ + Wiggle: 'wiggle' as const, + /** Shifts the baseline down such that the center of the streamgraph is always at zero. */ + Silhouette: 'silhouette' as const, +}); + +/** + * The offset and mode applied when stacking values + * @public + */ +export type StackMode = $Values; + /** * Override for bar styles per datum * @@ -68,7 +90,7 @@ export type SeriesTypes = $Values; * @public */ export type BarStyleAccessor = ( - datum: RawDataSeriesDatum, + datum: DataSeriesDatum, seriesIdentifier: XYChartSeriesIdentifier, ) => BarStyleOverride; /** @@ -81,7 +103,7 @@ export type BarStyleAccessor = ( * @public */ export type PointStyleAccessor = ( - datum: RawDataSeriesDatum, + datum: DataSeriesDatum, seriesIdentifier: XYChartSeriesIdentifier, ) => PointStyleOverride; @@ -446,9 +468,10 @@ export type BarSeriesSpec = BasicSeriesSpec & enableHistogramMode?: boolean; barSeriesStyle?: RecursivePartial; /** - * Stack each series in percentage for each point. + * Stack each series using a specific mode: Percentage, Wiggle, Silhouette. + * The last two modes are generally used for stream graphs */ - stackAsPercentage?: boolean; + stackMode?: StackMode; /** * Functional accessor to return custom color or style for bar datum */ @@ -541,9 +564,10 @@ export type AreaSeriesSpec = BasicSeriesSpec & curve?: CurveType; areaSeriesStyle?: RecursivePartial; /** - * Stack each series in percentage for each point. + * Stack each series using a specific mode: Percentage, Wiggle, Silhouette. + * The last two modes are generally used for stream graphs */ - stackAsPercentage?: boolean; + stackMode?: StackMode; /** * An optional functional accessor to return custom color or style for point datum */ diff --git a/src/chart_types/xy_chart/utils/stacked_percent_series_utils.test.ts b/src/chart_types/xy_chart/utils/stacked_percent_series_utils.test.ts index bbb5fd13ac..67b74690a2 100644 --- a/src/chart_types/xy_chart/utils/stacked_percent_series_utils.test.ts +++ b/src/chart_types/xy_chart/utils/stacked_percent_series_utils.test.ts @@ -17,211 +17,218 @@ * under the License. */ -import { MockRawDataSeries } from '../../../mocks'; +import { MockSeriesSpec } from '../../../mocks/specs'; +import { MockStore } from '../../../mocks/store'; import { ScaleType } from '../../../scales/constants'; -import { formatStackedDataSeriesValues } from './stacked_series_utils'; +import { computeSeriesDomainsSelector } from '../state/selectors/compute_series_domains'; +import { StackMode } from './specs'; describe('Stacked Series Utils', () => { - const STANDARD_DATA_SET = MockRawDataSeries.fromData([[{ x: 0, y1: 10 }], [{ x: 0, y1: 20 }], [{ x: 0, y1: 70 }]], { - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [], - }); - const WITH_NULL_DATASET = MockRawDataSeries.fromData([[{ x: 0, y1: 10 }], [{ x: 0, y1: null }], [{ x: 0, y1: 30 }]], { - yAccessor: 'y1', - seriesKeys: [], - }); - const STANDARD_DATA_SET_WY0 = MockRawDataSeries.fromData( - [[{ x: 0, y0: 2, y1: 10 }], [{ x: 0, y0: 4, y1: 20 }], [{ x: 0, y0: 6, y1: 70 }]], - { - yAccessor: 'y1', - seriesKeys: [], - }, - ); - const WITH_NULL_DATASET_WY0 = MockRawDataSeries.fromData( - [[{ x: 0, y0: 2, y1: 10 }], [{ x: 0, y1: null }], [{ x: 0, y0: 6, y1: 90, mark: null }]], - { - yAccessor: 'y1', - seriesKeys: [], - }, - ); - const DATA_SET_WITH_NULL_2 = MockRawDataSeries.defaults( - [ - { - seriesKeys: ['a'], - key: 'a', - data: [ - { x: 1, y1: 10 }, - { x: 2, y1: 20 }, - { x: 4, y1: 40 }, - ], - }, - { - seriesKeys: ['b'], - key: 'b', - data: [ - { x: 1, y1: 90 }, - { x: 3, y1: 30 }, - ], - }, - ], - { - specId: 'spec1', - yAccessor: 'y1', - }, - ); - const xValues = new Set([0]); - const with2NullsXValues = new Set([1, 2, 3, 4]); + const STANDARD_DATA_SET = [{ x: 0, y1: 10, g: 'a' }, { x: 0, y1: 20, g: 'b' }, { x: 0, y1: 70, g: 'c' }]; + + const WITH_NULL_DATASET = [{ x: 0, y1: 10, g: 'a' }, { x: 0, y1: null, g: 'b' }, { x: 0, y1: 30, g: 'c' }]; + const STANDARD_DATA_SET_WY0 = [{ x: 0, y0: 2, y1: 10, g: 'a' }, { x: 0, y0: 4, y1: 20, g: 'b' }, { x: 0, y0: 6, y1: 70, g: 'c' }]; + const WITH_NULL_DATASET_WY0 = [{ x: 0, y0: 2, y1: 10, g: 'a' }, { x: 0, y1: null, g: 'b' }, { x: 0, y0: 6, y1: 90, mark: null, g: 'c' }]; + const DATA_SET_WITH_NULL_2 = [ + { x: 1, y1: 10, g: 'a' }, + { x: 2, y1: 20, g: 'a' }, + { x: 4, y1: 40, g: 'a' }, + { x: 1, y1: 90, g: 'b' }, + { x: 3, y1: 30, g: 'b' }, + ]; describe('Format stacked dataset', () => { test('format data without nulls', () => { - const formattedData = formatStackedDataSeriesValues(STANDARD_DATA_SET, false, true, xValues, ScaleType.Linear); - const data0 = formattedData[0].data[0]; - expect(data0.initialY1).toBe(0.1); - expect(data0.y0).toBeNull(); + const store = MockStore.default(); + MockStore.addSpecs([ + MockSeriesSpec.area({ + xAccessor: 'x', + yAccessors: ['y1'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + stackMode: StackMode.Percentage, + data: STANDARD_DATA_SET, + }), + ], store); + const { formattedDataSeries } = computeSeriesDomainsSelector(store.getState()); + const { stacked } = formattedDataSeries; + const [data0] = stacked[0].dataSeries[0].data; + expect(data0.initialY1).toBe(10); + expect(data0.y0).toBe(0); expect(data0.y1).toBe(0.1); - const data1 = formattedData[1].data[0]; - expect(data1.initialY1).toBe(0.2); + const [data1] = stacked[0].dataSeries[1].data; + expect(data1.initialY1).toBe(20); expect(data1.y0).toBe(0.1); expect(data1.y1).toBeCloseTo(0.3); - const data2 = formattedData[2].data[0]; - expect(data2.initialY1).toBe(0.7); - expect(data2.y0).toBe(0.3); + const [data2] = stacked[0].dataSeries[2].data; + expect(data2.initialY1).toBe(70); + expect(data2.y0).toBeCloseTo(0.3); expect(data2.y1).toBe(1); }); test('format data with nulls', () => { - const formattedData = formatStackedDataSeriesValues(WITH_NULL_DATASET, false, true, xValues, ScaleType.Linear); - const data0 = formattedData[0].data[0]; - expect(data0.initialY1).toBe(0.25); - expect(data0.y0).toBeNull(); + const store = MockStore.default(); + MockStore.addSpecs([ + MockSeriesSpec.area({ + yAccessors: ['y1'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + stackMode: StackMode.Percentage, + data: WITH_NULL_DATASET, + }), + ], store); + const { formattedDataSeries: { stacked } } = computeSeriesDomainsSelector(store.getState()); + + const [data0] = stacked[0].dataSeries[0].data; + expect(data0.initialY1).toBe(10); + expect(data0.y0).toBe(0); expect(data0.y1).toBe(0.25); - expect(formattedData[1].data[0]).toMatchObject({ + expect(stacked[0].dataSeries[1].data[0]).toMatchObject({ initialY0: null, initialY1: null, x: 0, - y1: null, + y1: 0.25, y0: 0.25, mark: null, }); - const data2 = formattedData[2].data[0]; - expect(data2.initialY1).toBe(0.75); + const [data2] = stacked[0].dataSeries[2].data; + expect(data2.initialY1).toBe(30); expect(data2.y0).toBe(0.25); expect(data2.y1).toBe(1); }); test('format data without nulls with y0 values', () => { - const formattedData = formatStackedDataSeriesValues( - STANDARD_DATA_SET_WY0, - false, - true, - xValues, - ScaleType.Linear, - ); - const data0 = formattedData[0].data[0]; - expect(data0.initialY0).toBe(0.02); - expect(data0.initialY1).toBe(0.1); + const store = MockStore.default(); + MockStore.addSpecs([ + MockSeriesSpec.area({ + yAccessors: ['y1'], + y0Accessors: ['y0'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + stackMode: StackMode.Percentage, + data: STANDARD_DATA_SET_WY0, + }), + ], store); + const { formattedDataSeries: { stacked } } = computeSeriesDomainsSelector(store.getState()); + + const [data0] = stacked[0].dataSeries[0].data; + expect(data0.initialY0).toBe(2); + expect(data0.initialY1).toBe(10); expect(data0.y0).toBe(0.02); expect(data0.y1).toBe(0.1); - const data1 = formattedData[1].data[0]; - expect(data1.initialY0).toBe(0.04); - expect(data1.initialY1).toBe(0.2); + const [data1] = stacked[0].dataSeries[1].data; + expect(data1.initialY0).toBe(4); + expect(data1.initialY1).toBe(20); expect(data1.y0).toBe(0.14); expect(data1.y1).toBeCloseTo(0.3, 5); - const data2 = formattedData[2].data[0]; - expect(data2.initialY0).toBe(0.06); - expect(data2.initialY1).toBe(0.7); - expect(data2.y0).toBe(0.36); + const [data2] = stacked[0].dataSeries[2].data; + expect(data2.initialY0).toBe(6); + expect(data2.initialY1).toBe(70); + expect(data2.y0).toBeCloseTo(0.36); expect(data2.y1).toBe(1); }); test('format data with nulls - missing points', () => { - const formattedData = formatStackedDataSeriesValues( - WITH_NULL_DATASET_WY0, - false, - true, - xValues, - ScaleType.Linear, - ); - const data0 = formattedData[0].data[0]; - expect(data0.initialY0).toBe(0.02); - expect(data0.initialY1).toBe(0.1); + const store = MockStore.default(); + MockStore.addSpecs([ + MockSeriesSpec.area({ + yAccessors: ['y1'], + y0Accessors: ['y0'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + stackMode: StackMode.Percentage, + data: WITH_NULL_DATASET_WY0, + }), + ], store); + const { formattedDataSeries: { stacked } } = computeSeriesDomainsSelector(store.getState()); + + + const [data0] = stacked[0].dataSeries[0].data; + expect(data0.initialY0).toBe(2); + expect(data0.initialY1).toBe(10); expect(data0.y0).toBe(0.02); expect(data0.y1).toBe(0.1); - const data1 = formattedData[1].data[0]; + const [data1] = stacked[0].dataSeries[1].data; expect(data1.initialY0).toBe(null); expect(data1.initialY1).toBe(null); expect(data1.y0).toBe(0.1); - expect(data1.y1).toBe(null); + expect(data1.y1).toBe(0.1); - const data2 = formattedData[2].data[0]; - expect(data2.initialY0).toBe(0.06); - expect(data2.initialY1).toBe(0.9); + const [data2] = stacked[0].dataSeries[2].data; + expect(data2.initialY0).toBe(6); + expect(data2.initialY1).toBe(90); expect(data2.y0).toBe(0.16); expect(data2.y1).toBe(1); }); test('format data without nulls on second series', () => { - const formattedData = formatStackedDataSeriesValues( - DATA_SET_WITH_NULL_2, - false, - true, - with2NullsXValues, - ScaleType.Linear, - ); - expect(formattedData.length).toBe(2); - expect(formattedData[0].data.length).toBe(4); - expect(formattedData[1].data.length).toBe(4); - expect(formattedData[0].data[0]).toMatchObject({ + const store = MockStore.default(); + MockStore.addSpecs([ + MockSeriesSpec.area({ + xScaleType: ScaleType.Linear, + yAccessors: ['y1'], + y0Accessors: ['y0'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + stackMode: StackMode.Percentage, + data: DATA_SET_WITH_NULL_2, + }), + ], store); + const { formattedDataSeries: { stacked } } = computeSeriesDomainsSelector(store.getState()); + + + expect(stacked[0].dataSeries.length).toBe(2); + expect(stacked[0].dataSeries[0].data.length).toBe(4); + expect(stacked[0].dataSeries[1].data.length).toBe(4); + expect(stacked[0].dataSeries[0].data[0]).toMatchObject({ initialY0: null, - initialY1: 0.1, + initialY1: 10, x: 1, - y0: null, + y0: 0, y1: 0.1, mark: null, }); - expect(formattedData[0].data[1]).toMatchObject({ + expect(stacked[0].dataSeries[0].data[1]).toMatchObject({ initialY0: null, - initialY1: 1, + initialY1: 20, x: 2, - y0: null, + y0: 0, y1: 1, mark: null, }); - expect(formattedData[0].data[3]).toMatchObject({ + expect(stacked[0].dataSeries[0].data[3]).toMatchObject({ initialY0: null, - initialY1: 1, + initialY1: 40, x: 4, - y0: null, + y0: 0, y1: 1, mark: null, }); - expect(formattedData[1].data[0]).toMatchObject({ + expect(stacked[0].dataSeries[1].data[0]).toMatchObject({ initialY0: null, - initialY1: 0.9, + initialY1: 90, x: 1, y0: 0.1, y1: 1, mark: null, }); - expect(formattedData[1].data[1]).toMatchObject({ + expect(stacked[0].dataSeries[1].data[1]).toMatchObject({ initialY0: null, - initialY1: 0, + initialY1: null, x: 2, y0: 1, y1: 1, mark: null, filled: { x: 2, - y1: 0, }, }); - expect(formattedData[1].data[2]).toMatchObject({ + expect(stacked[0].dataSeries[1].data[2]).toMatchObject({ initialY0: null, - initialY1: 1, + initialY1: 30, x: 3, y0: 0, y1: 1, diff --git a/src/chart_types/xy_chart/utils/stacked_series_utils.test.ts b/src/chart_types/xy_chart/utils/stacked_series_utils.test.ts index ede0fc831d..4356efda8c 100644 --- a/src/chart_types/xy_chart/utils/stacked_series_utils.test.ts +++ b/src/chart_types/xy_chart/utils/stacked_series_utils.test.ts @@ -17,302 +17,166 @@ * under the License. */ +import { MockSeriesSpec } from '../../../mocks/specs'; +import { MockStore } from '../../../mocks/store'; import { ScaleType } from '../../../scales/constants'; -import { RawDataSeries } from './series'; -import { - computeYStackedMapValues, - formatStackedDataSeriesValues, - getYValueStackMap, - getStackedFormattedSeriesDatum, - StackedValues, -} from './stacked_series_utils'; +import { computeSeriesDomainsSelector } from '../state/selectors/compute_series_domains'; +import { StackMode } from './specs'; describe('Stacked Series Utils', () => { - const EMPTY_DATA_SET: RawDataSeries[] = [ - { - data: [], - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [], - key: 'color-key', - specId: 'spec1', - }, - ]; - const STANDARD_DATA_SET: RawDataSeries[] = [ - { - data: [ - { - x: 0, - y1: 10, - mark: null, - }, - ], - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [], - key: 'color-key', - specId: 'spec1', - }, - { - data: [ - { - x: 0, - y1: 20, - mark: null, - }, - ], - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [], - key: 'color-key', - specId: 'spec2', - }, - { - data: [ - { - x: 0, - y1: 30, - mark: null, - }, - ], - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [], - key: 'color-key', - specId: 'spec3', - }, - ]; - const WITH_NULL_DATASET: RawDataSeries[] = [ - { - data: [ - { - x: 0, - y1: 10, - mark: null, - }, - ], - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [], - key: 'color-key', - specId: 'spec1', - }, - { - data: [ - { - x: 0, - y1: null, - mark: null, - }, - ], - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [], - key: 'color-key', - specId: 'spec2', - }, - { - data: [ - { - x: 0, - y1: 30, - mark: null, - }, - ], - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [], - key: 'color-key', - specId: 'spec3', - }, - ]; - const STANDARD_DATA_SET_WY0: RawDataSeries[] = [ - { - data: [ - { - x: 0, - y0: 2, - y1: 10, - mark: null, - }, - ], - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [], - key: 'color-key', - specId: 'spec1', - }, - { - data: [ - { - x: 0, - y0: 4, - y1: 20, - mark: null, - }, - ], - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [], - key: 'color-key', - specId: 'spec2', - }, - { - data: [ - { - x: 0, - y0: 6, - y1: 30, - mark: null, - }, - ], - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [], - key: 'color-key', - specId: 'spec3', - }, - ]; - const WITH_NULL_DATASET_WY0: RawDataSeries[] = [ - { - data: [ - { - x: 0, - y0: 2, - y1: 10, - mark: null, - }, - ], - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [], - key: 'color-key', - specId: 'spec1', - }, - { - data: [ - { - x: 0, - y1: null, - mark: null, - }, - ], - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [], - key: 'color-key', - specId: 'spec2', - }, - { - data: [ - { - x: 0, - y0: 6, - y1: 30, - mark: null, - }, - ], - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: [], - key: 'color-key', - specId: 'spec3', - }, - ]; - const DATA_SET_WITH_NULL_2: RawDataSeries[] = [ - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['a'], - key: 'a', - data: [ - { x: 1, y1: 1, mark: null }, - { x: 2, y1: 2, mark: null }, - { x: 4, y1: 4, mark: null }, - ], - }, - { - specId: 'spec1', - yAccessor: 'y1', - splitAccessors: new Map(), - seriesKeys: ['b'], - key: 'b', - data: [ - { x: 1, y1: 21, mark: null }, - { x: 3, y1: 23, mark: null }, - ], - }, - ]; - const xValues = new Set([0]); - const emptyXValues: Set = new Set(); - const with2NullsXValues = new Set([1, 2, 3, 4]); - describe('create stacked maps', () => { - test('with empty values', () => { - const stackedMap = getYValueStackMap(EMPTY_DATA_SET, emptyXValues); - expect(stackedMap.size).toBe(0); - }); - test('with basic values', () => { - const stackedMap = getYValueStackMap(STANDARD_DATA_SET, xValues); - expect(stackedMap.size).toBe(1); - const x0StackArray = stackedMap.get(0)!; - expect(x0StackArray).toBeDefined(); - expect(x0StackArray.length).toBe(3); - expect(x0StackArray).toEqual([10, 20, 30]); - // expect(x0StackArray).toEqual([10, 20, 30]); - }); - test('with values with nulls', () => { - const stackedMap = getYValueStackMap(WITH_NULL_DATASET, xValues); - expect(stackedMap.size).toBe(1); - const x0StackArray = stackedMap.get(0)!; - expect(x0StackArray).toBeDefined(); - expect(x0StackArray.length).toBe(3); - expect(x0StackArray).toEqual([10, null, 30]); - }); + const EMPTY_DATA_SET = MockSeriesSpec.area({ + xScaleType: ScaleType.Linear, + yAccessors: ['y1'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + data: [], + }); + const STANDARD_DATA_SET = MockSeriesSpec.area({ + xScaleType: ScaleType.Linear, + yAccessors: ['y1'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + data: [ + { x: 0, y1: 10, g: 'a' }, + { x: 0, y1: 20, g: 'b' }, + { x: 0, y1: 30, g: 'c' }, + ], + }); + const WITH_NULL_DATASET = MockSeriesSpec.area({ + xScaleType: ScaleType.Linear, + yAccessors: ['y1'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + data: [ + { x: 0, y1: 10, g: 'a' }, + { x: 0, y1: null, g: 'b' }, + { x: 0, y1: 30, g: 'c' }, + ], }); + + const STANDARD_DATA_SET_WY0 = MockSeriesSpec.area({ + xScaleType: ScaleType.Linear, + yAccessors: ['y1'], + y0Accessors: ['y0'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + data: [ + { x: 0, y0: 2, y1: 10, g: 'a' }, + { x: 0, y0: 4, y1: 20, g: 'b' }, + { x: 0, y0: 6, y1: 30, g: 'c' }, + ], + }); + const WITH_NULL_DATASET_WY0 = MockSeriesSpec.area({ + xScaleType: ScaleType.Linear, + yAccessors: ['y1'], + y0Accessors: ['y0'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + data: [ + { x: 0, y0: 2, y1: 10, g: 'a' }, + { x: 0, y1: null, g: 'b' }, + { x: 0, y0: 6, y1: 30, g: 'c' }, + ], + }); + + const DATA_SET_WITH_NULL_2 = MockSeriesSpec.area({ + xScaleType: ScaleType.Linear, + yAccessors: ['y1'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + data: [ + { x: 1, y1: 1, g: 'a' }, + { x: 2, y1: 2, g: 'a' }, + { x: 4, y1: 4, g: 'a' }, + { x: 1, y1: 21, g: 'b' }, + { x: 3, y1: 23, g: 'b' }, + ], + }); + describe('compute stacked arrays', () => { test('with empty values', () => { - const stackedMap = getYValueStackMap(EMPTY_DATA_SET, emptyXValues); - let computedStackedMap = computeYStackedMapValues(stackedMap, false); - expect(computedStackedMap.size).toBe(0); - computedStackedMap = computeYStackedMapValues(stackedMap, true); - expect(computedStackedMap.size).toBe(0); + const store = MockStore.default(); + MockStore.addSpecs(EMPTY_DATA_SET, store); + const { formattedDataSeries: { stacked } } = computeSeriesDomainsSelector(store.getState()); + expect(stacked).toHaveLength(0); }); test('with basic values', () => { - const stackedMap = getYValueStackMap(STANDARD_DATA_SET, xValues); - const computedStackedMap = computeYStackedMapValues(stackedMap, false); - expect(computedStackedMap.size).toBe(1); - const x0Array = computedStackedMap.get(0)!; - expect(x0Array).toBeDefined(); - expect(x0Array.values).toEqual([0, 10, 30, 60]); - expect(x0Array.percent).toEqual([0, 0.16666666666666666, 0.5, 1]); - expect(x0Array.total).toBe(60); + const store = MockStore.default(); + MockStore.addSpecs(STANDARD_DATA_SET, store); + const { formattedDataSeries: { stacked: [{ dataSeries }] } } = computeSeriesDomainsSelector(store.getState()); + + const values = [ + dataSeries[0].data[0].y0, + dataSeries[0].data[0].y1, + dataSeries[1].data[0].y1, + dataSeries[2].data[0].y1, + ]; + expect(values).toEqual([0, 10, 30, 60]); + }); + + test('with basic values in percentage', () => { + const store = MockStore.default(); + MockStore.addSpecs( + MockSeriesSpec.area({ + ...STANDARD_DATA_SET, + stackMode: StackMode.Percentage, + }), + store); + const { formattedDataSeries: { stacked: [{ dataSeries }] } } = computeSeriesDomainsSelector(store.getState()); + + const values = [ + dataSeries[0].data[0].y0, + dataSeries[0].data[0].y1, + dataSeries[1].data[0].y1, + dataSeries[2].data[0].y1, + ]; + expect(values).toEqual([0, 0.16666666666666666, 0.5, 1]); }); test('with null values', () => { - const stackedMap = getYValueStackMap(WITH_NULL_DATASET, xValues); - const computedStackedMap = computeYStackedMapValues(stackedMap, false); - expect(computedStackedMap.size).toBe(1); - const x0Array = computedStackedMap.get(0)!; - expect(x0Array).toBeDefined(); - expect(x0Array.values).toEqual([0, 10, 10, 40]); - expect(x0Array.percent).toEqual([0, 0.25, 0.25, 1]); - expect(x0Array.total).toBe(40); + const store = MockStore.default(); + MockStore.addSpecs(WITH_NULL_DATASET, store); + const { formattedDataSeries: { stacked: [{ dataSeries }] } } = computeSeriesDomainsSelector(store.getState()); + + const values = [ + dataSeries[0].data[0].y0, + dataSeries[0].data[0].y1, + dataSeries[1].data[0].y1, + dataSeries[2].data[0].y1, + ]; + expect(values).toEqual([0, 10, 10, 40]); + }); + test('with null values as percentage', () => { + const store = MockStore.default(); + MockStore.addSpecs(MockSeriesSpec.area({ + ...WITH_NULL_DATASET, + stackMode: StackMode.Percentage, + }), store); + const { formattedDataSeries: { stacked: [{ dataSeries }] } } = computeSeriesDomainsSelector(store.getState()); + + const values = [ + dataSeries[0].data[0].y0, + dataSeries[0].data[0].y1, + dataSeries[1].data[0].y1, + dataSeries[2].data[0].y1, + ]; + expect(values).toEqual([0, 0.25, 0.25, 1]); }); }); describe('Format stacked dataset', () => { test('format data without nulls', () => { - const formattedData = formatStackedDataSeriesValues(STANDARD_DATA_SET, false, false, xValues, ScaleType.Linear); - expect(formattedData[0].data[0]).toEqual({ - datum: undefined, + const store = MockStore.default(); + MockStore.addSpecs(STANDARD_DATA_SET, store); + const { formattedDataSeries: { stacked: [{ dataSeries }] } } = computeSeriesDomainsSelector(store.getState()); + + expect(dataSeries[0].data[0]).toMatchObject({ initialY0: null, initialY1: 10, x: 0, - y0: null, + y0: 0, y1: 10, mark: null, }); - expect(formattedData[1].data[0]).toEqual({ - datum: undefined, + expect(dataSeries[1].data[0]).toMatchObject({ initialY0: null, initialY1: 20, x: 0, @@ -320,8 +184,7 @@ describe('Stacked Series Utils', () => { y1: 30, mark: null, }); - expect(formattedData[2].data[0]).toEqual({ - datum: undefined, + expect(dataSeries[2].data[0]).toMatchObject({ initialY0: null, initialY1: 30, x: 0, @@ -331,27 +194,26 @@ describe('Stacked Series Utils', () => { }); }); test('format data with nulls', () => { - const formattedData = formatStackedDataSeriesValues(WITH_NULL_DATASET, false, false, xValues, ScaleType.Linear); - expect(formattedData[1].data[0]).toEqual({ - datum: undefined, + const store = MockStore.default(); + MockStore.addSpecs(WITH_NULL_DATASET, store); + const { formattedDataSeries: { stacked: [{ dataSeries }] } } = computeSeriesDomainsSelector(store.getState()); + + expect(dataSeries[1].data[0]).toMatchObject({ + initialY0: null, initialY1: null, x: 0, - y1: null, - y0: null, + y1: 10, + y0: 10, mark: null, }); }); test('format data without nulls with y0 values', () => { - const formattedData = formatStackedDataSeriesValues( - STANDARD_DATA_SET_WY0, - false, - false, - xValues, - ScaleType.Linear, - ); - expect(formattedData[0].data[0]).toEqual({ - datum: undefined, + const store = MockStore.default(); + MockStore.addSpecs(STANDARD_DATA_SET_WY0, store); + const { formattedDataSeries: { stacked: [{ dataSeries }] } } = computeSeriesDomainsSelector(store.getState()); + + expect(dataSeries[0].data[0]).toMatchObject({ initialY0: 2, initialY1: 10, x: 0, @@ -359,8 +221,7 @@ describe('Stacked Series Utils', () => { y1: 10, mark: null, }); - expect(formattedData[1].data[0]).toEqual({ - datum: undefined, + expect(dataSeries[1].data[0]).toMatchObject({ initialY0: 4, initialY1: 20, x: 0, @@ -368,8 +229,7 @@ describe('Stacked Series Utils', () => { y1: 30, mark: null, }); - expect(formattedData[2].data[0]).toEqual({ - datum: undefined, + expect(dataSeries[2].data[0]).toMatchObject({ initialY0: 6, initialY1: 30, x: 0, @@ -379,15 +239,11 @@ describe('Stacked Series Utils', () => { }); }); test('format data with nulls - missing points', () => { - const formattedData = formatStackedDataSeriesValues( - WITH_NULL_DATASET_WY0, - false, - false, - xValues, - ScaleType.Linear, - ); - expect(formattedData[0].data[0]).toEqual({ - datum: undefined, + const store = MockStore.default(); + MockStore.addSpecs(WITH_NULL_DATASET_WY0, store); + const { formattedDataSeries: { stacked: [{ dataSeries }] } } = computeSeriesDomainsSelector(store.getState()); + + expect(dataSeries[0].data[0]).toMatchObject({ initialY0: 2, initialY1: 10, x: 0, @@ -395,17 +251,15 @@ describe('Stacked Series Utils', () => { y1: 10, mark: null, }); - expect(formattedData[1].data[0]).toEqual({ - datum: undefined, + expect(dataSeries[1].data[0]).toMatchObject({ initialY0: null, initialY1: null, x: 0, - y1: null, - y0: null, + y1: 10, + y0: 10, mark: null, }); - expect(formattedData[2].data[0]).toEqual({ - datum: undefined, + expect(dataSeries[2].data[0]).toMatchObject({ initialY0: 6, initialY1: 30, x: 0, @@ -415,46 +269,39 @@ describe('Stacked Series Utils', () => { }); }); test('format data without nulls on second series', () => { - const formattedData = formatStackedDataSeriesValues( - DATA_SET_WITH_NULL_2, - false, - false, - with2NullsXValues, - ScaleType.Linear, - ); - expect(formattedData.length).toBe(2); - expect(formattedData[0].data.length).toBe(4); - expect(formattedData[1].data.length).toBe(4); + const store = MockStore.default(); + MockStore.addSpecs(DATA_SET_WITH_NULL_2, store); + const { formattedDataSeries: { stacked: [{ dataSeries }] } } = computeSeriesDomainsSelector(store.getState()); - expect(formattedData[0].data[0]).toEqual({ - datum: undefined, + expect(dataSeries.length).toBe(2); + expect(dataSeries[0].data.length).toBe(4); + expect(dataSeries[1].data.length).toBe(4); + + expect(dataSeries[0].data[0]).toMatchObject({ initialY0: null, initialY1: 1, x: 1, - y0: null, + y0: 0, y1: 1, mark: null, }); - expect(formattedData[0].data[1]).toEqual({ - datum: undefined, + expect(dataSeries[0].data[1]).toMatchObject({ initialY0: null, initialY1: 2, x: 2, - y0: null, + y0: 0, y1: 2, mark: null, }); - expect(formattedData[0].data[3]).toEqual({ - datum: undefined, + expect(dataSeries[0].data[3]).toMatchObject({ initialY0: null, initialY1: 4, x: 4, - y0: null, + y0: 0, y1: 4, mark: null, }); - expect(formattedData[1].data[0]).toEqual({ - datum: undefined, + expect(dataSeries[1].data[0]).toMatchObject({ initialY0: null, initialY1: 21, x: 1, @@ -462,8 +309,7 @@ describe('Stacked Series Utils', () => { y1: 22, mark: null, }); - expect(formattedData[1].data[2]).toEqual({ - datum: undefined, + expect(dataSeries[1].data[2]).toMatchObject({ initialY0: null, initialY1: 23, x: 3, @@ -474,19 +320,32 @@ describe('Stacked Series Utils', () => { }); }); test('Correctly handle 0 values on percentage stack', () => { - const stackedValues: Map = new Map(); - stackedValues.set(1, { - values: [0, 0, 0], - percent: [0, 0, 0], - total: 0, + const store = MockStore.default(); + MockStore.addSpecs(MockSeriesSpec.area({ + xScaleType: ScaleType.Linear, + yAccessors: ['y1'], + splitSeriesAccessors: ['g'], + stackAccessors: ['x'], + data: [ + { x: 1, y1: 0, g: 'a' }, + { x: 1, y1: 0, g: 'b' }, + ], + }), store); + const { formattedDataSeries: { stacked: [{ dataSeries }] } } = computeSeriesDomainsSelector(store.getState()); + + expect(dataSeries[0].data[0]).toMatchObject({ + initialY0: null, + initialY1: 0, + x: 1, + y0: 0, + y1: 0, + mark: null, }); - const formattedDatum = getStackedFormattedSeriesDatum({ x: 1, y1: 0, mark: null }, stackedValues, 0, false, true); - expect(formattedDatum).toEqual({ - datum: undefined, + expect(dataSeries[1].data[0]).toMatchObject({ initialY0: null, initialY1: 0, x: 1, - y0: null, + y0: 0, y1: 0, mark: null, }); diff --git a/src/chart_types/xy_chart/utils/stacked_series_utils.ts b/src/chart_types/xy_chart/utils/stacked_series_utils.ts index 6d694938be..305cdce620 100644 --- a/src/chart_types/xy_chart/utils/stacked_series_utils.ts +++ b/src/chart_types/xy_chart/utils/stacked_series_utils.ts @@ -17,9 +17,20 @@ * under the License. */ +import { + stack as D3Stack, + stackOffsetExpand as D3StackOffsetExpand, + stackOffsetNone as D3StackOffsetNone, + stackOffsetSilhouette as D3StackOffsetSilhouette, + stackOffsetWiggle as D3StackOffsetWiggle, + stackOrderNone, + SeriesPoint, +} from 'd3-shape'; + +import { SeriesKey } from '../../../commons/series_id'; import { ScaleType } from '../../../scales/constants'; -import { isDefined } from '../../../utils/commons'; -import { DataSeries, DataSeriesDatum, RawDataSeries, RawDataSeriesDatum, FilledValues } from './series'; +import { DataSeries, DataSeriesDatum } from './series'; +import { StackMode } from './specs'; /** @internal */ export interface StackedValues { @@ -29,239 +40,136 @@ export interface StackedValues { } /** @internal */ -export const datumXSortPredicate = (xScaleType: ScaleType, sortedXValues?: (string | number)[]) => (a: DataSeriesDatum, b: DataSeriesDatum) => { - if (xScaleType === ScaleType.Ordinal || typeof a.x === 'string' || typeof b.x === 'string') { - return sortedXValues ? sortedXValues.indexOf(a.x) - sortedXValues.indexOf(b.x) : 0; +export const datumXSortPredicate = ( + xScaleType: ScaleType, + sortedXValues?: (string | number)[] +) => (a: { x: number | string }, b: { x: number | string }) => { + if ( + xScaleType === ScaleType.Ordinal + || typeof a.x === 'string' + || typeof b.x === 'string' + ) { + return sortedXValues + ? sortedXValues.indexOf(a.x) - sortedXValues.indexOf(b.x) + : 0; } return a.x - b.x; }; -/** - * Map each y value from a RawDataSeries on it's specific x value into, - * ordering the stack based on the dataseries index. - * @param dataseries - * @internal - */ -export function getYValueStackMap( - dataseries: RawDataSeries[], - xValues: Set, -): Map { - const stackMap = new Map(); - const missingXValues = new Set([...xValues]); - 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); - if (xValues.has(datum.x)) { - missingXValues.delete(datum.x); - } - }); - // eslint-disable-next-line no-restricted-syntax - for (const x of missingXValues.values()) { - const stack = stackMap.get(x) || new Array(dataseries.length).fill(0); - // currently filling as 0 value - stack[index] = 0; - stackMap.set(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 - * @internal - */ -export function computeYStackedMapValues( - yValueStackMap: Map, - scaleToExtent: boolean, -): Map { - const stackedValues = new Map(); - yValueStackMap.forEach((yStackArray, xValue) => { - const stackArray = yStackArray.reduce( - (acc, currentValue, index) => { - if (acc.values.length === 0) { - if (scaleToExtent) { - return { - values: [currentValue, currentValue], - total: currentValue, - }; - } - return { - values: [0, currentValue], - total: currentValue, - }; - } - return { - values: [...acc.values, acc.values[index] + currentValue], - total: acc.total + currentValue, - }; - }, - { - values: [] as number[], - total: 0, - }, - ); - const percent = stackArray.values.map((value) => { - if (stackArray.total === 0) { - return 0; - } - return value / stackArray.total; - }); - stackedValues.set(xValue, { - values: stackArray.values, - percent, - total: stackArray.total, - }); - }); - return stackedValues; -} +type D3StackArrayElement = Record; +type D3UnionStack = Record< + SeriesKey, + { + y0: SeriesPoint[], + y1: SeriesPoint[], + } +>; /** @internal */ export function formatStackedDataSeriesValues( - dataseries: RawDataSeries[], - scaleToExtent: boolean, - isPercentageMode: boolean, + dataSeries: DataSeries[], xValues: Set, - xScaleType: ScaleType, + stackMode?: StackMode, ): DataSeries[] { - const yValueStackMap = getYValueStackMap(dataseries, xValues); - const stackedValues = computeYStackedMapValues(yValueStackMap, scaleToExtent); - const stackedDataSeries: DataSeries[] = dataseries.map((ds, seriesIndex) => { - const newData: DataSeriesDatum[] = []; - const missingXValues = new Set([...xValues]); - ds.data.forEach((data) => { - const formattedSeriesDatum = getStackedFormattedSeriesDatum( - data, - stackedValues, - seriesIndex, - scaleToExtent, - isPercentageMode, - ); - if (formattedSeriesDatum === undefined) { - return; + const dataSeriesKeys = dataSeries.reduce>((acc, curr) => { + acc[curr.key] = curr; + return acc; + }, {}); + + const xValuesArray = [...xValues]; + const reorderedArray: Array = []; + const xValueMap: Map> = new Map(); + // transforming the current set of series into the d3 stack required data structure + dataSeries.forEach(({ data, key }) => { + const dsMap: Map = new Map(); + data.forEach((d) => { + const { x, y0, y1 } = d; + const xIndex = xValuesArray.indexOf(x); + + if (reorderedArray[xIndex] === undefined) { + reorderedArray[xIndex] = { x }; } - missingXValues.delete(data.x); - newData.push(formattedSeriesDatum); + // y0 can be considered as always present + reorderedArray[xIndex][`${key}-y0`] = y0; + // if y0 is available, we have to count y1 as the different of y1 and y0 + // to correctly stack them when stacking banded charts + reorderedArray[xIndex][`${key}-y1`] = (y1 ?? 0) - (y0 ?? 0); + dsMap.set(x, d); }); - // eslint-disable-next-line no-restricted-syntax - for (const x of missingXValues.values()) { - const filledSeriesDatum = getStackedFormattedSeriesDatum( - { - x, - // filling as 0 value - y1: 0, - mark: null, - datum: null, - }, - stackedValues, - seriesIndex, - scaleToExtent, - isPercentageMode, - { - x, - // filling as 0 value - y1: 0, - }, - ); - if (filledSeriesDatum) { - newData.push(filledSeriesDatum); - } - } - const sortedXValues = [...xValues]; - newData.sort(datumXSortPredicate(xScaleType, sortedXValues)); - return { - ...ds, - data: newData, - }; + xValueMap.set(key, dsMap); }); - return stackedDataSeries; -} -/** @internal */ -export function getStackedFormattedSeriesDatum( - data: RawDataSeriesDatum, - stackedValues: Map, - seriesIndex: number, - scaleToExtent: boolean, - isPercentageMode = false, - filled?: FilledValues, -): DataSeriesDatum | undefined { - const { x, mark: markValue, datum } = data; - const stack = stackedValues.get(x); - if (!stack) { - return; - } - let y1: number | null = null; - let y0: number | null | undefined = null; - if (isPercentageMode) { - if (data.y1 != null) { - y1 = stack.total !== 0 ? data.y1 / stack.total : 0; + const stackOffset = getOffsetBasedOnStackMode(stackMode); + + const keys = Object.keys(dataSeriesKeys).reduce((acc, key) => ([...acc, `${key}-y0`, `${key}-y1`]), []); + + const stack = D3Stack() + .keys(keys) + .order(stackOrderNone) + .offset(stackOffset)(reorderedArray); + + const unionedYStacks = stack.reduce((acc, d) => { + const key = d.key.slice(0, -3); + const accessor = d.key.slice(-2); + if (accessor !== 'y1' && accessor !== 'y0') { + return acc; } - if (data.y0 != null) { - y0 = stack.total !== 0 ? data.y0 / stack.total : 0; + if (!acc[key]) { + acc[key] = { + y0: [], + y1: [], + }; } - } else { - // eslint-disable-next-line prefer-destructuring - y1 = data.y1; - // eslint-disable-next-line prefer-destructuring - y0 = data.y0; - } + acc[key][accessor] = d.map((da) => da); + return acc; + }, {}); - let computedY0: number | null; - if (scaleToExtent) { - computedY0 = y0 || y1; - } else { - computedY0 = y0 || null; - } - const initialY0 = y0 == null ? null : y0; - const mark = isDefined(markValue) ? markValue : null; - if (seriesIndex === 0) { + return Object.keys(unionedYStacks).map((stackedDataSeriesKey) => { + const dataSeriesProps = dataSeriesKeys[stackedDataSeriesKey]; + const dsMap = xValueMap.get(stackedDataSeriesKey); + const { y0: y0StackArray, y1: y1StackArray } = unionedYStacks[stackedDataSeriesKey]; + const data = y1StackArray.map((y1Stack, index) => { + const { x } = y1Stack.data; + if (x === undefined || x === null) { + return null; + } + const originalData = dsMap?.get(x); + if (!originalData) { + return null; + } + const [,y0] = y0StackArray[index]; + const [,y1] = y1Stack; + const { initialY0, initialY1, mark, datum, filled } = originalData; + return { + x, + y1, + y0, + initialY0, + initialY1, + mark, + datum, + filled, + }; + }).filter((d) => d !== null) as DataSeriesDatum[]; return { - x, - y1, - y0: computedY0, - initialY1: y1, - initialY0, - mark, - datum, - ...(filled && { filled }), + ...dataSeriesProps, + data, }; - } - const stackY = isPercentageMode ? stack.percent[seriesIndex] : stack.values[seriesIndex]; - let stackedY1: number | null = null; - let stackedY0: number | null = null; - if (isPercentageMode) { - stackedY1 = y1 !== null && stackY != null ? stackY + y1 : null; - stackedY0 = y0 != null && stackY != null ? stackY + y0 : stackY; - } else { - if (stackY == null) { - stackedY1 = y1 !== null ? y1 : null; - stackedY0 = y0 != null ? y0 : stackY; - } else { - stackedY1 = y1 !== null ? stackY + y1 : null; - stackedY0 = y0 != null ? stackY + y0 : stackY; - } - // configure null y0 if y1 is null - // it's semantically correct to say y0 is null if y1 is null - if (stackedY1 === null) { - stackedY0 = null; - } - } + }); +} - return { - x, - y1: stackedY1, - y0: stackedY0, - initialY1: y1, - initialY0, - mark, - datum, - ...(filled && { filled }), - }; + +function getOffsetBasedOnStackMode(stackMode?: StackMode) { + switch (stackMode) { + case StackMode.Percentage: + return D3StackOffsetExpand; + case StackMode.Silhouette: + return D3StackOffsetSilhouette; + case StackMode.Wiggle: + return D3StackOffsetWiggle; + default: + return D3StackOffsetNone; + } } diff --git a/src/components/tooltip/tooltip.tsx b/src/components/tooltip/tooltip.tsx index 8a3993526e..de537dacdc 100644 --- a/src/components/tooltip/tooltip.tsx +++ b/src/components/tooltip/tooltip.tsx @@ -235,9 +235,7 @@ const mapStateToProps = (state: GlobalChartState): TooltipStateProps => { return HIDDEN_TOOLTIP_PROPS; } const { visible, isExternal } = getInternalIsTooltipVisibleSelector(state); - if (state.chartId === 'chart4') { - // console.log(visible, isExternal); - } + const settingsSpec = getSettingsSpecSelector(state); const settings = getTooltipSettings(settingsSpec, isExternal); return { diff --git a/src/index.ts b/src/index.ts index 217bccaeef..b6eb816f89 100644 --- a/src/index.ts +++ b/src/index.ts @@ -31,7 +31,7 @@ export { SimplePadding } from './utils/dimensions'; export { timeFormatter, niceTimeFormatter, niceTimeFormatByDay } from './utils/data/formatters'; export { Datum, Position, Rendering, Rotation, VerticalAlignment, HorizontalAlignment } from './utils/commons'; export { SeriesIdentifier } from './commons/series_id'; -export { XYChartSeriesIdentifier } from './chart_types/xy_chart/utils/series'; +export { XYChartSeriesIdentifier, DataSeriesDatum, FilledValues } from './chart_types/xy_chart/utils/series'; export { AnnotationTooltipFormatter, CustomAnnotationTooltip } from './chart_types/xy_chart/annotations/types'; export { GeometryValue } from './utils/geometry'; export { diff --git a/src/mocks/series/data.ts b/src/mocks/series/data.ts index ba922aa431..8dddfd4743 100644 --- a/src/mocks/series/data.ts +++ b/src/mocks/series/data.ts @@ -38,7 +38,7 @@ export const fitFunctionData: DataSeriesDatum[] = [ y1: 3, y0: 0, initialY1: 3, - initialY0: null, + initialY0: 0, mark: null, datum: { x: 1, @@ -50,7 +50,7 @@ export const fitFunctionData: DataSeriesDatum[] = [ y1: 5, y0: 0, initialY1: 5, - initialY0: null, + initialY0: 0, mark: null, datum: { x: 2, @@ -74,7 +74,7 @@ export const fitFunctionData: DataSeriesDatum[] = [ y1: 4, y0: 0, initialY1: 4, - initialY0: null, + initialY0: 0, mark: null, datum: { x: 4, @@ -98,7 +98,7 @@ export const fitFunctionData: DataSeriesDatum[] = [ y1: 5, y0: 0, initialY1: 5, - initialY0: null, + initialY0: 0, mark: null, datum: { x: 6, @@ -110,7 +110,7 @@ export const fitFunctionData: DataSeriesDatum[] = [ y1: 6, y0: 0, initialY1: 6, - initialY0: null, + initialY0: 0, mark: null, datum: { x: 7, @@ -158,7 +158,7 @@ export const fitFunctionData: DataSeriesDatum[] = [ y1: 12, y0: 0, initialY1: 12, - initialY0: null, + initialY0: 0, mark: null, datum: { x: 11, diff --git a/src/mocks/series/series.ts b/src/mocks/series/series.ts index b55bd195b3..333487eeb9 100644 --- a/src/mocks/series/series.ts +++ b/src/mocks/series/series.ts @@ -23,9 +23,10 @@ import { FullDataSeriesDatum, WithIndex } from '../../chart_types/xy_chart/utils import { DataSeries, DataSeriesDatum, - RawDataSeries, - RawDataSeriesDatum, + XYChartSeriesIdentifier, + FormattedDataSeries, } from '../../chart_types/xy_chart/utils/series'; +import { DEFAULT_GLOBAL_ID } from '../../specs'; import { mergePartial } from '../../utils/commons'; import { getRandomNumberGenerator } from '../utils'; import { fitFunctionData } from './data'; @@ -68,9 +69,10 @@ export class MockDataSeries { }; } - static fromData(data: DataSeries['data']): DataSeries { + static fromData(data: DataSeries['data'], seriesIdentifier?: Partial): DataSeries { return { ...MockDataSeries.base, + ...seriesIdentifier, data, }; } @@ -87,75 +89,20 @@ export class MockDataSeries { } } -type RawDataSeriesPartialData = Omit & { - data: Partial[]; -}; - -/** @internal */ -export class MockRawDataSeries { - private static readonly base: RawDataSeries = { - specId: 'spec1', - seriesKeys: ['spec1'], - yAccessor: 'y', - splitAccessors: new Map(), - key: 'spec1', - data: [], +export class MockFormattedDataSeries { + private static readonly base: FormattedDataSeries = { + groupId: DEFAULT_GLOBAL_ID, + dataSeries: [], + counts: { + area: 0, + bar: 0, + bubble: 0, + line: 0, + }, }; - static default({ data, ...partial }: Partial): RawDataSeries { - return { - ...MockRawDataSeries.base, - ...partial, - ...(data && { - data: data.map((datum) => MockRawDataSeriesDatum.default(datum)), - }), - }; - } - - static defaults(partials: Partial[], defaults?: Partial): RawDataSeries[] { - return partials.map((partial) => MockRawDataSeries.default({ - ...defaults, - ...partial, - })); - } - - static fitFunction( - options: { shuffle?: boolean; ordinal?: boolean } = { shuffle: true, ordinal: false }, - ): RawDataSeries { - const rawData = fitFunctionData.map(({ initialY0, initialY1, filled, ...datum }) => datum); - const ordinalData = options.ordinal - ? rawData.map((d) => ({ ...d, x: String.fromCharCode(97 + (d.x as number)) })) - : rawData; - const data = options.shuffle && !options.ordinal ? shuffle(ordinalData) : ordinalData; - - return { - ...MockRawDataSeries.base, - data, - }; - } - - static fromData[] | Partial[][]>( - data: T, - defaults?: Partial>, - ): T extends Partial[] ? RawDataSeries : RawDataSeries[] { - const mergedDefault: RawDataSeries = { - ...MockRawDataSeries.base, - ...defaults, - }; - - if (Array.isArray(data) && data[0] && Array.isArray(data[0])) { - return (data as Partial[][]).map((d, i) => ({ - ...mergedDefault, - specId: `spec${i + 1}`, - key: `key${i + 1}`, - data: d.map((datum) => MockRawDataSeriesDatum.default(datum)), - })) as any; - } - - return { - ...mergedDefault, - data: [MockRawDataSeriesDatum.default(data as any)], - } as any; + static default(partial?: Partial) { + return mergePartial(MockFormattedDataSeries.base, partial, { mergeOptionalPartialValues: true }); } } @@ -167,12 +114,20 @@ export class MockDataSeriesDatum { y0: null, mark: null, initialY1: null, - initialY0: 1, - datum: null, + initialY0: null, + datum: undefined, }; static default(partial?: Partial): DataSeriesDatum { - return mergePartial(MockDataSeriesDatum.base, partial, { mergeOptionalPartialValues: true }); + const merged = mergePartial(MockDataSeriesDatum.base, partial, { mergeOptionalPartialValues: true }); + if (merged.initialY1 === null) { + merged.initialY1 = merged.y1; + } + + if (merged.initialY0 === null) { + merged.initialY0 = merged.y0; + } + return merged; } /** @@ -247,53 +202,3 @@ export class MockDataSeriesDatum { }); } } - -/** @internal */ -export class MockRawDataSeriesDatum { - private static readonly base: RawDataSeriesDatum = { - x: 1, - y1: 1, - y0: null, - mark: null, - datum: { - x: 1, - y1: 1, - y0: 1, - }, - }; - - static default(partial?: Partial): RawDataSeriesDatum { - return mergePartial(MockRawDataSeriesDatum.base, partial); - } - - /** - * Fill raw datum with minimal values, default missing required values to `null` - */ - static simple({ - x, - y1 = null, - y0 = null, - }: Partial & Pick): RawDataSeriesDatum { - return { - x, - y1, - y0, - mark: null, - datum: { - x: 1, - y1: 1, - y0: 1, - }, - }; - } - - static ordinal(partial?: Partial): RawDataSeriesDatum { - return mergePartial( - { - ...MockRawDataSeriesDatum.base, - x: 'a', - }, - partial, - ); - } -} diff --git a/src/mocks/series/series_identifiers.ts b/src/mocks/series/series_identifiers.ts index 80e37d8de5..f92688fd78 100644 --- a/src/mocks/series/series_identifiers.ts +++ b/src/mocks/series/series_identifiers.ts @@ -19,7 +19,7 @@ import { SeriesCollectionValue, - getSplittedSeries, + getDataSeriesBySpecId, XYChartSeriesIdentifier, } from '../../chart_types/xy_chart/utils/series'; import { BasicSeriesSpec } from '../../specs'; @@ -34,7 +34,7 @@ export class MockSeriesCollection { } static fromSpecs(seriesSpecs: BasicSeriesSpec[]) { - const { seriesCollection } = getSplittedSeries(seriesSpecs, []); + const { seriesCollection } = getDataSeriesBySpecId(seriesSpecs, []); return seriesCollection; } @@ -57,7 +57,7 @@ export class MockSeriesIdentifier { } static fromSpecs(specs: BasicSeriesSpec[]): XYChartSeriesIdentifier[] { - const { seriesCollection } = getSplittedSeries(specs); + const { seriesCollection } = getDataSeriesBySpecId(specs); return [...seriesCollection.values()].map(({ seriesIdentifier }) => seriesIdentifier); } diff --git a/src/mocks/series/utils.ts b/src/mocks/series/utils.ts index 167bbca7aa..06159dce6c 100644 --- a/src/mocks/series/utils.ts +++ b/src/mocks/series/utils.ts @@ -24,22 +24,37 @@ import { DataSeriesDatum } from '../../chart_types/xy_chart/utils/series'; * Helper function to return array of rendered y1 values * @internal */ -export const getFilledNullData = (data: DataSeriesDatum[]): (number | undefined)[] => data.filter(({ y1 }) => y1 === null).map(({ filled }) => filled && filled.y1); +export const getFilledNullData = ( + data: DataSeriesDatum[] +): (number | undefined)[] => + data + .filter(({ filled }) => filled?.y1 !== undefined) + .map(({ filled }) => filled?.y1); /** * Helper function to return array of rendered y1 values * @internal */ -export const getFilledNonNullData = (data: DataSeriesDatum[]): (number | undefined)[] => data.filter(({ y1 }) => y1 !== null).map(({ filled }) => filled && filled.y1); +export const getFilledNonNullData = ( + data: DataSeriesDatum[] +): (number | undefined)[] => + data + .filter( + ({ y1, filled }) => + y1 !== null && (filled?.y1 === undefined) + ) + .map(({ filled }) => filled?.y1); /** * Helper function to return array of rendered x values * @internal */ -export const getXValueData = (data: DataSeriesDatum[]): (number | string)[] => data.map(({ x }) => x); +export const getXValueData = (data: DataSeriesDatum[]): (number | string)[] => + data.map(({ x }) => x); /** * Returns value of `y1` or `filled.y1` or null * @internal */ -export const getYResolvedData = (data: DataSeriesDatum[]): (number | null)[] => data.map(getYValue); +export const getYResolvedData = (data: DataSeriesDatum[]): (number | null)[] => + data.map(getYValue); diff --git a/src/mocks/specs/specs.ts b/src/mocks/specs/specs.ts index 69ce8abc66..f30ebe6641 100644 --- a/src/mocks/specs/specs.ts +++ b/src/mocks/specs/specs.ts @@ -59,7 +59,6 @@ export class MockSeriesSpec { yAccessors: ['y'], hideInLegend: false, enableHistogramMode: false, - stackAsPercentage: false, data: [] as any[], }; diff --git a/src/renderers/canvas/index.ts b/src/renderers/canvas/index.ts index 48ef9339bb..66804af8a8 100644 --- a/src/renderers/canvas/index.ts +++ b/src/renderers/canvas/index.ts @@ -91,31 +91,31 @@ export function withClipRanges( negate = false, fun: (ctx: CanvasRenderingContext2D) => void, ) { - withContext(ctx, (ctx) => { + withContext(ctx, (context) => { const { length } = clippedRanges; const { width, height } = clippings; - ctx.beginPath(); + context.beginPath(); if (negate) { clippedRanges.forEach(([x0, x1]) => { - ctx.rect(x0, 0, x1 - x0, height); + context.rect(x0, 0, x1 - x0, height); }); } else { if (length > 0) { - ctx.rect(0, 0, clippedRanges[0][0], height); + context.rect(0, 0, clippedRanges[0][0], height); const lastX = clippedRanges[length - 1][1]; - ctx.rect(lastX, 0, width - lastX, height); + context.rect(lastX, 0, width - lastX, height); } if (length > 1) { for (let i = 1; i < length; i++) { const [, x0] = clippedRanges[i - 1]; const [x1] = clippedRanges[i]; - ctx.rect(x0, 0, x1 - x0, height); + context.rect(x0, 0, x1 - x0, height); } } } - ctx.clip(); - fun(ctx); + context.clip(); + fun(context); }); } diff --git a/src/utils/data_samples/babynames.ts b/src/utils/data_samples/babynames.ts new file mode 100644 index 0000000000..0b0a76a454 --- /dev/null +++ b/src/utils/data_samples/babynames.ts @@ -0,0 +1,1182 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +// data taken from https://www.data-to-viz.com/graph/streamgraph.html +export const BABYNAME_DATA = [ + [1880, 'F', 'Helen', 636, 0.00651612638826278], + [1880, 'F', 'Amanda', 241, 0.00246916109995492], + [1880, 'F', 'Betty', 117, 0.00119872136387853], + [1880, 'F', 'Dorothy', 112, 0.00114749395516577], + [1880, 'F', 'Linda', 27, 0.000276628007048891], + [1880, 'F', 'Deborah', 12, 0.000122945780910618], + [1880, 'F', 'Jessica', 7, 7.17183721978607e-05], + [1881, 'F', 'Helen', 612, 0.00619088564058469], + [1881, 'F', 'Amanda', 263, 0.0026604622932578], + [1881, 'F', 'Betty', 112, 0.00113297253553184], + [1881, 'F', 'Dorothy', 109, 0.00110262505690152], + [1881, 'F', 'Linda', 38, 0.000384401395984017], + [1881, 'F', 'Deborah', 14, 0.00014162156694148], + [1881, 'F', 'Jessica', 7, 7.081078347074e-05], + [1882, 'F', 'Helen', 838, 0.00724311990042871], + [1882, 'F', 'Amanda', 288, 0.00248928225694925], + [1882, 'F', 'Betty', 123, 0.00106313096390541], + [1882, 'F', 'Dorothy', 115, 0.000993984234545706], + [1882, 'F', 'Linda', 36, 0.000311160282118656], + [1882, 'F', 'Deborah', 15, 0.00012965011754944], + [1882, 'F', 'Jessica', 8, 6.91467293597013e-05], + [1883, 'F', 'Helen', 862, 0.0071798032633955], + [1883, 'F', 'Amanda', 287, 0.00239049134175697], + [1883, 'F', 'Dorothy', 141, 0.00117442257556701], + [1883, 'F', 'Betty', 120, 0.000999508574950649], + [1883, 'F', 'Linda', 49, 0.000408132668104848], + [1883, 'F', 'Deborah', 16, 0.00013326780999342], + [1883, 'F', 'Jessica', 6, 4.99754287475325e-05], + [1884, 'F', 'Helen', 986, 0.00716642681668193], + [1884, 'F', 'Amanda', 337, 0.00244937711685782], + [1884, 'F', 'Dorothy', 163, 0.00118471356097277], + [1884, 'F', 'Betty', 144, 0.00104661811521521], + [1884, 'F', 'Linda', 33, 0.000239849984736819], + [1884, 'F', 'Jessica', 14, 0.000101754538979257], + [1884, 'F', 'Deborah', 13, 9.44863576235954e-05], + [1884, 'F', 'Patricia', 6, 4.36090881339671e-05], + [1885, 'F', 'Helen', 1134, 0.00798878470436565], + [1885, 'F', 'Amanda', 339, 0.0023881816708818], + [1885, 'F', 'Dorothy', 196, 0.00138077760322369], + [1885, 'F', 'Betty', 155, 0.0010919414719371], + [1885, 'F', 'Linda', 60, 0.000422687021395008], + [1885, 'F', 'Deborah', 10, 7.0447836899168e-05], + [1885, 'F', 'Jessica', 6, 4.22687021395008e-05], + [1885, 'F', 'Patricia', 5, 3.5223918449584e-05], + [1886, 'F', 'Helen', 1267, 0.00824140084300359], + [1886, 'F', 'Amanda', 370, 0.0024067232138211], + [1886, 'F', 'Dorothy', 230, 0.00149607118696987], + [1886, 'F', 'Betty', 167, 0.00108627777488682], + [1886, 'F', 'Linda', 49, 0.000318728209397929], + [1886, 'F', 'Jessica', 11, 7.15512306811677e-05], + [1886, 'F', 'Deborah', 10, 6.50465733465161e-05], + [1886, 'F', 'Patricia', 8, 5.20372586772129e-05], + [1887, 'F', 'Helen', 1405, 0.00903990426065808], + [1887, 'F', 'Amanda', 338, 0.00217472429900529], + [1887, 'F', 'Dorothy', 272, 0.00175007399209893], + [1887, 'F', 'Betty', 178, 0.00114526900953533], + [1887, 'F', 'Linda', 50, 0.000321704777959362], + [1887, 'F', 'Deborah', 15, 9.65114333878087e-05], + [1887, 'F', 'Patricia', 10, 6.43409555918724e-05], + [1887, 'F', 'Jessica', 8, 5.1472764473498e-05], + [1888, 'F', 'Helen', 1847, 0.0097494286000834], + [1888, 'F', 'Amanda', 404, 0.0021325225524817], + [1888, 'F', 'Dorothy', 373, 0.00196888839622691], + [1888, 'F', 'Betty', 214, 0.00112960353027496], + [1888, 'F', 'Linda', 77, 0.000406446130052205], + [1888, 'F', 'Deborah', 26, 0.000137241550407238], + [1888, 'F', 'Jessica', 18, 9.50133810511647e-05], + [1888, 'F', 'Patricia', 12, 6.33422540341098e-05], + [1889, 'F', 'Helen', 1909, 0.010088838858677], + [1889, 'F', 'Amanda', 413, 0.00218265607576406], + [1889, 'F', 'Dorothy', 377, 0.00199240034034637], + [1889, 'F', 'Betty', 189, 0.000998842610942876], + [1889, 'F', 'Linda', 74, 0.000391081233914142], + [1889, 'F', 'Patricia', 17, 8.9842986169465e-05], + [1889, 'F', 'Deborah', 12, 6.34185784725635e-05], + [1889, 'F', 'Jessica', 9, 4.75639338544226e-05], + [1890, 'F', 'Helen', 2312, 0.0114647849608997], + [1890, 'F', 'Dorothy', 458, 0.00227113819727166], + [1890, 'F', 'Amanda', 392, 0.00194385627364736], + [1890, 'F', 'Betty', 216, 0.00107110447731589], + [1890, 'F', 'Linda', 54, 0.000267776119328973], + [1890, 'F', 'Deborah', 24, 0.000119011608590655], + [1890, 'F', 'Jessica', 18, 8.9258706442991e-05], + [1890, 'F', 'Patricia', 11, 5.45469872707167e-05], + [1891, 'F', 'Helen', 2417, 0.0122960619025574], + [1891, 'F', 'Dorothy', 566, 0.00287942533589056], + [1891, 'F', 'Amanda', 371, 0.00188739717246537], + [1891, 'F', 'Betty', 239, 0.00121587041568524], + [1891, 'F', 'Linda', 78, 0.000396811265370077], + [1891, 'F', 'Deborah', 15, 7.63098587250149e-05], + [1891, 'F', 'Jessica', 14, 7.12225348100139e-05], + [1891, 'F', 'Patricia', 12, 6.10478869800119e-05], + [1892, 'F', 'Helen', 2936, 0.0130538203321255], + [1892, 'F', 'Dorothy', 626, 0.00278327368116844], + [1892, 'F', 'Amanda', 455, 0.00202298646155214], + [1892, 'F', 'Betty', 255, 0.00113376164328746], + [1892, 'F', 'Linda', 83, 0.000369028299579841], + [1892, 'F', 'Patricia', 21, 9.33686059177912e-05], + [1892, 'F', 'Deborah', 16, 7.11379854611742e-05], + [1892, 'F', 'Jessica', 14, 6.22457372785274e-05], + [1893, 'F', 'Helen', 3249, 0.0144251260922071], + [1893, 'F', 'Dorothy', 821, 0.00364513035447894], + [1893, 'F', 'Amanda', 387, 0.00171822831569226], + [1893, 'F', 'Betty', 298, 0.00132308020174753], + [1893, 'F', 'Linda', 82, 0.000364069048803012], + [1893, 'F', 'Patricia', 28, 0.000124316260566882], + [1893, 'F', 'Deborah', 24, 0.000106556794771613], + [1893, 'F', 'Jessica', 15, 6.65979967322583e-05], + [1894, 'F', 'Helen', 3676, 0.0155781194378994], + [1894, 'F', 'Dorothy', 1052, 0.004458156052413], + [1894, 'F', 'Amanda', 418, 0.00177139660637703], + [1894, 'F', 'Betty', 298, 0.00126286169545539], + [1894, 'F', 'Linda', 94, 0.000398352346888614], + [1894, 'F', 'Patricia', 36, 0.00015256047327649], + [1894, 'F', 'Deborah', 18, 7.62802366382452e-05], + [1894, 'F', 'Jessica', 10, 4.23779092434696e-05], + [1895, 'F', 'Helen', 4023, 0.0162803967512049], + [1895, 'F', 'Dorothy', 1127, 0.00456077731509022], + [1895, 'F', 'Amanda', 431, 0.00174418369370354], + [1895, 'F', 'Betty', 350, 0.00141639047052491], + [1895, 'F', 'Linda', 96, 0.000388495671915405], + [1895, 'F', 'Patricia', 35, 0.000141639047052491], + [1895, 'F', 'Jessica', 19, 7.68897683999239e-05], + [1895, 'F', 'Deborah', 13, 5.26087889052111e-05], + [1896, 'F', 'Helen', 4392, 0.0174290555690039], + [1896, 'F', 'Dorothy', 1366, 0.00542078549800987], + [1896, 'F', 'Amanda', 367, 0.00145638966161758], + [1896, 'F', 'Betty', 342, 0.00135718055660276], + [1896, 'F', 'Linda', 104, 0.000412709876861659], + [1896, 'F', 'Patricia', 37, 0.000146829475421936], + [1896, 'F', 'Deborah', 18, 7.14305556106717e-05], + [1896, 'F', 'Jessica', 9, 3.57152778053359e-05], + [1897, 'F', 'Helen', 4519, 0.0182015909777464], + [1897, 'F', 'Dorothy', 1472, 0.00592890947538012], + [1897, 'F', 'Betty', 367, 0.00147819957708186], + [1897, 'F', 'Amanda', 354, 0.00142583828416071], + [1897, 'F', 'Linda', 81, 0.000326251132816433], + [1897, 'F', 'Patricia', 49, 0.000197361796395126], + [1897, 'F', 'Deborah', 23, 9.26392105528144e-05], + [1897, 'F', 'Jessica', 9, 3.62501258684926e-05], + [1898, 'F', 'Helen', 5230, 0.0190774258971497], + [1898, 'F', 'Dorothy', 1671, 0.00609529228950997], + [1898, 'F', 'Betty', 421, 0.00153567806934991], + [1898, 'F', 'Amanda', 371, 0.00135329350054351], + [1898, 'F', 'Linda', 102, 0.000372064520365061], + [1898, 'F', 'Patricia', 47, 0.000171441494678018], + [1898, 'F', 'Deborah', 21, 7.6601518898689e-05], + [1898, 'F', 'Jessica', 13, 4.74199878896646e-05], + [1899, 'F', 'Helen', 5048, 0.0203967837084327], + [1899, 'F', 'Dorothy', 1687, 0.0068164370277587], + [1899, 'F', 'Betty', 410, 0.00165663259121581], + [1899, 'F', 'Amanda', 326, 0.00131722493838135], + [1899, 'F', 'Linda', 98, 0.000395975594973534], + [1899, 'F', 'Patricia', 56, 0.000226271768556305], + [1899, 'F', 'Jessica', 14, 5.65679421390763e-05], + [1899, 'F', 'Deborah', 11, 4.44462402521314e-05], + [1900, 'F', 'Helen', 6343, 0.0199606639918181], + [1900, 'F', 'Dorothy', 2491, 0.00783887971048698], + [1900, 'F', 'Betty', 664, 0.00208952875462198], + [1900, 'F', 'Amanda', 377, 0.00118637400676579], + [1900, 'F', 'Linda', 126, 0.000396506962473448], + [1900, 'F', 'Patricia', 89, 0.000280072378255055], + [1900, 'F', 'Deborah', 26, 8.18188970183306e-05], + [1900, 'F', 'Jessica', 23, 7.2378255054677e-05], + [1901, 'F', 'Helen', 5247, 0.0206386292834891], + [1901, 'F', 'Dorothy', 2173, 0.00854731111740458], + [1901, 'F', 'Betty', 474, 0.00186443878032663], + [1901, 'F', 'Amanda', 317, 0.00124689260203279], + [1901, 'F', 'Linda', 86, 0.000338273702759684], + [1901, 'F', 'Patricia', 68, 0.000267472230089053], + [1901, 'F', 'Deborah', 21, 8.26017181157368e-05], + [1901, 'F', 'Jessica', 8, 3.14673211869474e-05], + [1902, 'F', 'Helen', 5967, 0.0212853998637335], + [1902, 'F', 'Dorothy', 2707, 0.00965637295644822], + [1902, 'F', 'Betty', 580, 0.00206896797736977], + [1902, 'F', 'Amanda', 301, 0.00107372303653155], + [1902, 'F', 'Linda', 91, 0.000324613941276981], + [1902, 'F', 'Patricia', 85, 0.000303210824269708], + [1902, 'F', 'Deborah', 21, 7.49109095254572e-05], + [1902, 'F', 'Jessica', 9, 3.21046755109102e-05], + [1903, 'F', 'Helen', 6129, 0.0220310713951934], + [1903, 'F', 'Dorothy', 3078, 0.0110640622865729], + [1903, 'F', 'Betty', 596, 0.00214235903924543], + [1903, 'F', 'Amanda', 247, 0.000887856850157082], + [1903, 'F', 'Linda', 90, 0.000323510593174645], + [1903, 'F', 'Patricia', 79, 0.000283970409564411], + [1903, 'F', 'Deborah', 21, 7.54858050740839e-05], + [1903, 'F', 'Jessica', 16, 5.75129943421592e-05], + [1904, 'F', 'Helen', 6488, 0.0221858992333418], + [1904, 'F', 'Dorothy', 3477, 0.0118896996970298], + [1904, 'F', 'Betty', 707, 0.00241760646701181], + [1904, 'F', 'Amanda', 294, 0.00100534130311382], + [1904, 'F', 'Patricia', 124, 0.000424021501993585], + [1904, 'F', 'Linda', 101, 0.000345372352430259], + [1904, 'F', 'Deborah', 23, 7.86491495633262e-05], + [1904, 'F', 'Jessica', 16, 5.471245187014e-05], + [1905, 'F', 'Helen', 6811, 0.0219801852389712], + [1905, 'F', 'Dorothy', 3937, 0.0127053280407913], + [1905, 'F', 'Betty', 807, 0.0026043179397812], + [1905, 'F', 'Amanda', 311, 0.00100364669054765], + [1905, 'F', 'Patricia', 121, 0.000390486332978346], + [1905, 'F', 'Linda', 106, 0.000342078936328138], + [1905, 'F', 'Deborah', 18, 5.80888759802498e-05], + [1905, 'F', 'Jessica', 17, 5.48617162035692e-05], + [1906, 'F', 'Helen', 7176, 0.0228942608018734], + [1906, 'F', 'Dorothy', 4326, 0.013801640500126], + [1906, 'F', 'Betty', 865, 0.00275969002140754], + [1906, 'F', 'Amanda', 260, 0.000829502202966427], + [1906, 'F', 'Patricia', 157, 0.000500891714868189], + [1906, 'F', 'Linda', 98, 0.000312658522656576], + [1906, 'F', 'Deborah', 25, 7.97598272083103e-05], + [1906, 'F', 'Jessica', 18, 5.74270755899834e-05], + [1907, 'F', 'Helen', 7579, 0.0224607551721379], + [1907, 'F', 'Dorothy', 4967, 0.0147199592215343], + [1907, 'F', 'Betty', 1018, 0.00301689520586309], + [1907, 'F', 'Amanda', 285, 0.000844612115590354], + [1907, 'F', 'Patricia', 177, 0.000524548577050852], + [1907, 'F', 'Linda', 102, 0.000302282230842864], + [1907, 'F', 'Deborah', 21, 6.22345769382366e-05], + [1907, 'F', 'Jessica', 17, 5.03803718071439e-05], + [1908, 'F', 'Helen', 8439, 0.0238031438540277], + [1908, 'F', 'Dorothy', 5703, 0.0160859496859249], + [1908, 'F', 'Betty', 1128, 0.00318165022720029], + [1908, 'F', 'Amanda', 260, 0.000733359094922052], + [1908, 'F', 'Patricia', 205, 0.000578225440227003], + [1908, 'F', 'Linda', 93, 0.000262316907029811], + [1908, 'F', 'Deborah', 25, 7.05152975886589e-05], + [1908, 'F', 'Jessica', 17, 4.7950402360288e-05], + [1909, 'F', 'Helen', 9250, 0.0251291775559769], + [1909, 'F', 'Dorothy', 6253, 0.0169873240278404], + [1909, 'F', 'Betty', 1082, 0.00293943460708833], + [1909, 'F', 'Amanda', 271, 0.000736216985694027], + [1909, 'F', 'Patricia', 233, 0.00063298360762623], + [1909, 'F', 'Linda', 105, 0.000285250123608387], + [1909, 'F', 'Deborah', 26, 7.06333639411244e-05], + [1909, 'F', 'Jessica', 18, 4.89000211900092e-05], + [1910, 'F', 'Helen', 10479, 0.0249781896712004], + [1910, 'F', 'Dorothy', 7318, 0.0174434957547327], + [1910, 'F', 'Betty', 1389, 0.00331087942106091], + [1910, 'F', 'Patricia', 316, 0.000753231027397587], + [1910, 'F', 'Amanda', 278, 0.000662652612710535], + [1910, 'F', 'Linda', 137, 0.000326559021371739], + [1910, 'F', 'Deborah', 33, 7.8660202228229e-05], + [1910, 'F', 'Jessica', 28, 6.67419897694064e-05], + [1911, 'F', 'Helen', 11802, 0.0267127194372267], + [1911, 'F', 'Dorothy', 8869, 0.0200741491856265], + [1911, 'F', 'Betty', 1456, 0.00329551936117625], + [1911, 'F', 'Patricia', 325, 0.000735607000262555], + [1911, 'F', 'Amanda', 280, 0.000633753723303124], + [1911, 'F', 'Linda', 130, 0.000294242800105022], + [1911, 'F', 'Deborah', 36, 8.14826215675446e-05], + [1911, 'F', 'Jessica', 21, 4.75315292477343e-05], + [1912, 'F', 'Helen', 16133, 0.0274974944947061], + [1912, 'F', 'Dorothy', 12645, 0.0215524588040388], + [1912, 'F', 'Betty', 2011, 0.00342759941913183], + [1912, 'F', 'Patricia', 504, 0.000859030386495497], + [1912, 'F', 'Amanda', 310, 0.000528371864709532], + [1912, 'F', 'Linda', 189, 0.000322136394935811], + [1912, 'F', 'Jessica', 36, 6.13593133211069e-05], + [1912, 'F', 'Deborah', 32, 5.45416118409839e-05], + [1913, 'F', 'Helen', 18889, 0.0288423952212843], + [1913, 'F', 'Dorothy', 14674, 0.0224063374173925], + [1913, 'F', 'Betty', 2239, 0.00341882168989653], + [1913, 'F', 'Patricia', 588, 0.000897841515703065], + [1913, 'F', 'Amanda', 346, 0.000528321708219831], + [1913, 'F', 'Linda', 238, 0.000363412042070288], + [1913, 'F', 'Deborah', 42, 6.41315368359332e-05], + [1913, 'F', 'Jessica', 25, 3.81735338309126e-05], + [1914, 'F', 'Helen', 23221, 0.0291498453442597], + [1914, 'F', 'Dorothy', 18782, 0.0235774684662971], + [1914, 'F', 'Betty', 2933, 0.00368186109102595], + [1914, 'F', 'Patricia', 656, 0.000823491604402667], + [1914, 'F', 'Amanda', 375, 0.000470745962882622], + [1914, 'F', 'Linda', 219, 0.000274915642323451], + [1914, 'F', 'Deborah', 62, 7.78299991965936e-05], + [1914, 'F', 'Jessica', 42, 5.27235478428537e-05], + [1915, 'F', 'Helen', 30866, 0.0301460519864594], + [1915, 'F', 'Dorothy', 25154, 0.0245672841206311], + [1915, 'F', 'Betty', 4182, 0.00408445504462428], + [1915, 'F', 'Patricia', 895, 0.000874124166652017], + [1915, 'F', 'Amanda', 412, 0.000402390119173889], + [1915, 'F', 'Linda', 290, 0.000283235763496184], + [1915, 'F', 'Deborah', 106, 0.000103527554933088], + [1915, 'F', 'Jessica', 55, 5.37171275596211e-05], + [1916, 'F', 'Helen', 32661, 0.0300826741628504], + [1916, 'F', 'Dorothy', 27415, 0.0252508040836026], + [1916, 'F', 'Betty', 5136, 0.00473055370320565], + [1916, 'F', 'Patricia', 1078, 0.000992900485213335], + [1916, 'F', 'Amanda', 421, 0.000387765402852332], + [1916, 'F', 'Linda', 297, 0.000273554215313878], + [1916, 'F', 'Deborah', 90, 8.28952167617813e-05], + [1916, 'F', 'Jessica', 53, 4.8816072093049e-05], + [1917, 'F', 'Helen', 34249, 0.0304787212268021], + [1917, 'F', 'Dorothy', 28853, 0.0256767363589279], + [1917, 'F', 'Betty', 6639, 0.00590815002554058], + [1917, 'F', 'Patricia', 1441, 0.00128236845711763], + [1917, 'F', 'Amanda', 445, 0.000396012465938478], + [1917, 'F', 'Linda', 291, 0.000258965455254151], + [1917, 'F', 'Deborah', 89, 7.92024931876957e-05], + [1917, 'F', 'Jessica', 55, 4.89453609586883e-05], + [1917, 'F', 'Ashley', 5, 4.44957826897167e-06], + [1918, 'F', 'Helen', 36150, 0.030065795437817], + [1918, 'F', 'Dorothy', 32034, 0.026642536405395], + [1918, 'F', 'Betty', 8802, 0.00732058454892574], + [1918, 'F', 'Patricia', 1760, 0.0014637842315507], + [1918, 'F', 'Amanda', 397, 0.000330183147685017], + [1918, 'F', 'Linda', 322, 0.00026780597872689], + [1918, 'F', 'Deborah', 92, 7.65159939219687e-05], + [1918, 'F', 'Jessica', 56, 4.65749528220679e-05], + [1919, 'F', 'Helen', 33705, 0.0286936534286809], + [1919, 'F', 'Dorothy', 31734, 0.0270157068062827], + [1919, 'F', 'Betty', 10107, 0.00860426510024262], + [1919, 'F', 'Patricia', 2144, 0.00182522453496786], + [1919, 'F', 'Amanda', 379, 0.000322649299791427], + [1919, 'F', 'Linda', 282, 0.000240071510662751], + [1919, 'F', 'Deborah', 70, 5.95922189588388e-05], + [1919, 'F', 'Jessica', 40, 3.40526965479079e-05], + [1920, 'F', 'Dorothy', 36645, 0.0294564957018998], + [1920, 'F', 'Helen', 35098, 0.0282129645557451], + [1920, 'F', 'Betty', 14017, 0.011267340708242], + [1920, 'F', 'Patricia', 2502, 0.00201119258414936], + [1920, 'F', 'Amanda', 379, 0.000304653073298404], + [1920, 'F', 'Linda', 349, 0.000280538054303807], + [1920, 'F', 'Deborah', 82, 6.59143852518974e-05], + [1920, 'F', 'Jessica', 43, 3.45648605589218e-05], + [1921, 'F', 'Dorothy', 39083, 0.0305412051909812], + [1921, 'F', 'Helen', 34819, 0.0272091247740648], + [1921, 'F', 'Betty', 17637, 0.013782341067813], + [1921, 'F', 'Patricia', 3382, 0.00264284614681315], + [1921, 'F', 'Amanda', 392, 0.000306326342268112], + [1921, 'F', 'Linda', 367, 0.000286790223501013], + [1921, 'F', 'Deborah', 94, 7.34558065642922e-05], + [1921, 'F', 'Jessica', 48, 3.75093480328301e-05], + [1922, 'F', 'Dorothy', 37711, 0.0302285073477132], + [1922, 'F', 'Helen', 32507, 0.0260570679205567], + [1922, 'F', 'Betty', 20893, 0.0167474796217489], + [1922, 'F', 'Patricia', 3902, 0.00312777798708008], + [1922, 'F', 'Linda', 365, 0.000292577899867819], + [1922, 'F', 'Amanda', 341, 0.000273339900972401], + [1922, 'F', 'Deborah', 71, 5.69124133989456e-05], + [1922, 'F', 'Jessica', 40, 3.20633314923637e-05], + [1923, 'F', 'Dorothy', 39045, 0.0311757435229189], + [1923, 'F', 'Helen', 31492, 0.0251449997444938], + [1923, 'F', 'Betty', 25990, 0.020751890745567], + [1923, 'F', 'Patricia', 4800, 0.00383259236547601], + [1923, 'F', 'Linda', 423, 0.000337747202207573], + [1923, 'F', 'Amanda', 362, 0.000289041340896316], + [1923, 'F', 'Deborah', 118, 9.42178956512852e-05], + [1923, 'F', 'Jessica', 52, 4.15197506259901e-05], + [1924, 'F', 'Dorothy', 39996, 0.0308678753677503], + [1924, 'F', 'Helen', 31193, 0.0240739483034863], + [1924, 'F', 'Betty', 30602, 0.0236178298330807], + [1924, 'F', 'Patricia', 6958, 0.00537000392061223], + [1924, 'F', 'Linda', 454, 0.000350385423966363], + [1924, 'F', 'Amanda', 341, 0.000263174955005572], + [1924, 'F', 'Deborah', 125, 9.64717576999898e-05], + [1924, 'F', 'Jessica', 41, 3.16427365255967e-05], + [1925, 'F', 'Dorothy', 38572, 0.030538871901736], + [1925, 'F', 'Betty', 32817, 0.0259824266099572], + [1925, 'F', 'Helen', 29168, 0.023093379021825], + [1925, 'F', 'Patricia', 8095, 0.00640910940694163], + [1925, 'F', 'Linda', 438, 0.000346780718992024], + [1925, 'F', 'Amanda', 310, 0.000245438408419012], + [1925, 'F', 'Deborah', 82, 6.49224177108356e-05], + [1925, 'F', 'Jessica', 34, 2.69190512459562e-05], + [1926, 'F', 'Dorothy', 36614, 0.0297646484033633], + [1926, 'F', 'Betty', 32959, 0.026793386320163], + [1926, 'F', 'Helen', 26884, 0.0218548316948713], + [1926, 'F', 'Patricia', 8590, 0.0069830755936224], + [1926, 'F', 'Linda', 479, 0.000389393854405719], + [1926, 'F', 'Amanda', 310, 0.000252008548780319], + [1926, 'F', 'Deborah', 116, 9.42999730919904e-05], + [1926, 'F', 'Jessica', 35, 2.84525780881006e-05], + [1927, 'F', 'Dorothy', 35987, 0.0291075004772119], + [1927, 'F', 'Betty', 35422, 0.0286505094035013], + [1927, 'F', 'Helen', 25316, 0.0204764354372717], + [1927, 'F', 'Patricia', 10553, 0.00853562265640418], + [1927, 'F', 'Linda', 516, 0.000417358219530423], + [1927, 'F', 'Amanda', 234, 0.000189267099554494], + [1927, 'F', 'Deborah', 91, 7.360387204897e-05], + [1927, 'F', 'Jessica', 39, 3.15445165924157e-05], + [1928, 'F', 'Betty', 36078, 0.0301810713703117], + [1928, 'F', 'Dorothy', 33728, 0.0282151775369442], + [1928, 'F', 'Helen', 22936, 0.0191871238136667], + [1928, 'F', 'Patricia', 12332, 0.0103163415970587], + [1928, 'F', 'Linda', 554, 0.000463449014334294], + [1928, 'F', 'Amanda', 247, 0.000206627990145434], + [1928, 'F', 'Deborah', 130, 0.000108751573760755], + [1928, 'F', 'Jessica', 36, 3.01158204260552e-05], + [1929, 'F', 'Betty', 36669, 0.0316800016587745], + [1929, 'F', 'Dorothy', 31477, 0.0271943988713422], + [1929, 'F', 'Helen', 20983, 0.0181281593391166], + [1929, 'F', 'Patricia', 13626, 0.0117721154818092], + [1929, 'F', 'Linda', 509, 0.000439748039060684], + [1929, 'F', 'Amanda', 209, 0.000180564518985625], + [1929, 'F', 'Deborah', 161, 0.000139095155773615], + [1929, 'F', 'Jessica', 42, 3.62856928105083e-05], + [1930, 'F', 'Betty', 38239, 0.0327853532062582], + [1930, 'F', 'Dorothy', 30404, 0.0260677810320111], + [1930, 'F', 'Helen', 19914, 0.0170738650003772], + [1930, 'F', 'Patricia', 15749, 0.0135028773672261], + [1930, 'F', 'Linda', 493, 0.000422688332087274], + [1930, 'F', 'Amanda', 196, 0.00016804647685417], + [1930, 'F', 'Deborah', 165, 0.000141467697351725], + [1930, 'F', 'Jessica', 38, 3.25804393900942e-05], + [1931, 'F', 'Betty', 36102, 0.0327140362625423], + [1931, 'F', 'Dorothy', 26521, 0.0240321576566086], + [1931, 'F', 'Helen', 17657, 0.0159999927507537], + [1931, 'F', 'Patricia', 16468, 0.0149225735186845], + [1931, 'F', 'Linda', 534, 0.000483887190853626], + [1931, 'F', 'Amanda', 209, 0.00018938655971612], + [1931, 'F', 'Deborah', 158, 0.000143172614522234], + [1931, 'F', 'Jessica', 39, 3.53400757365008e-05], + [1932, 'F', 'Betty', 34411, 0.0311083227035339], + [1932, 'F', 'Dorothy', 24968, 0.0225716370132177], + [1932, 'F', 'Patricia', 17991, 0.0162642711272349], + [1932, 'F', 'Helen', 16375, 0.0148033705579718], + [1932, 'F', 'Linda', 774, 0.000699713515228713], + [1932, 'F', 'Amanda', 213, 0.00019255682008232], + [1932, 'F', 'Deborah', 208, 0.000188036706934848], + [1932, 'F', 'Jessica', 44, 3.97769956977563e-05], + [1933, 'F', 'Betty', 31526, 0.0301434985810775], + [1933, 'F', 'Dorothy', 22050, 0.0210830471265862], + [1933, 'F', 'Patricia', 18625, 0.017808242754316], + [1933, 'F', 'Helen', 14645, 0.0140027766516488], + [1933, 'F', 'Linda', 786, 0.000751531747913687], + [1933, 'F', 'Deborah', 243, 0.000232343784660338], + [1933, 'F', 'Amanda', 199, 0.000190273305133363], + [1933, 'F', 'Jessica', 43, 4.11143322649981e-05], + [1934, 'F', 'Betty', 31078, 0.0287181174191951], + [1934, 'F', 'Dorothy', 21280, 0.0196641205573226], + [1934, 'F', 'Patricia', 20847, 0.0192640000591402], + [1934, 'F', 'Helen', 14099, 0.0130284039350419], + [1934, 'F', 'Linda', 1001, 0.000924989881479318], + [1934, 'F', 'Deborah', 280, 0.000258738428385823], + [1934, 'F', 'Amanda', 189, 0.000174648439160431], + [1934, 'F', 'Jessica', 46, 4.25070275205281e-05], + [1935, 'F', 'Betty', 28673, 0.0263859454097216], + [1935, 'F', 'Patricia', 22876, 0.0210513335609385], + [1935, 'F', 'Dorothy', 19400, 0.0178525909722944], + [1935, 'F', 'Helen', 12778, 0.0117587838888649], + [1935, 'F', 'Linda', 1197, 0.00110152326772353], + [1935, 'F', 'Deborah', 279, 0.00025674602480774], + [1935, 'F', 'Amanda', 211, 0.000194169932739903], + [1935, 'F', 'Jessica', 47, 4.32511224586515e-05], + [1936, 'F', 'Betty', 25863, 0.0240043659489396], + [1936, 'F', 'Patricia', 23912, 0.022193573776091], + [1936, 'F', 'Dorothy', 17668, 0.0163982963146528], + [1936, 'F', 'Helen', 12232, 0.0113529522594992], + [1936, 'F', 'Linda', 2439, 0.0022637222499116], + [1936, 'F', 'Deborah', 299, 0.00027751248574152], + [1936, 'F', 'Amanda', 192, 0.000178201997533016], + [1936, 'F', 'Jessica', 43, 3.99098223641651e-05], + [1937, 'F', 'Patricia', 26837, 0.0243591174914203], + [1937, 'F', 'Betty', 25328, 0.0229894447152324], + [1937, 'F', 'Dorothy', 16571, 0.0150409858013312], + [1937, 'F', 'Helen', 11452, 0.0103946273246542], + [1937, 'F', 'Linda', 4380, 0.00397559096070428], + [1937, 'F', 'Deborah', 323, 0.000293177141622713], + [1937, 'F', 'Amanda', 176, 0.00015974977376346], + [1937, 'F', 'Jessica', 72, 6.53521801759607e-05], + [1938, 'F', 'Patricia', 27555, 0.0241429070846355], + [1938, 'F', 'Betty', 25502, 0.0223441268906687], + [1938, 'F', 'Dorothy', 16348, 0.0143236525138676], + [1938, 'F', 'Helen', 10833, 0.00949156641073696], + [1938, 'F', 'Linda', 7047, 0.00617438091908643], + [1938, 'F', 'Deborah', 410, 0.000359230335862841], + [1938, 'F', 'Amanda', 192, 0.000168224937769916], + [1938, 'F', 'Jessica', 50, 4.38085775442489e-05], + [1938, 'F', 'Ashley', 7, 6.13320085619484e-06], + [1939, 'F', 'Patricia', 29704, 0.0261941652197148], + [1939, 'F', 'Betty', 23639, 0.0208458076901709], + [1939, 'F', 'Dorothy', 15170, 0.0133775076212993], + [1939, 'F', 'Linda', 10714, 0.00944803010247859], + [1939, 'F', 'Helen', 10417, 0.00918612372386778], + [1939, 'F', 'Deborah', 443, 0.000390654968769648], + [1939, 'F', 'Amanda', 185, 0.000163140336845113], + [1939, 'F', 'Jessica', 77, 6.79016537139118e-05], + [1940, 'F', 'Patricia', 32661, 0.027650413304301], + [1940, 'F', 'Betty', 22074, 0.0186875852937491], + [1940, 'F', 'Linda', 18368, 0.0155501298666116], + [1940, 'F', 'Dorothy', 14874, 0.0125921511125861], + [1940, 'F', 'Helen', 10201, 0.00863604501139508], + [1940, 'F', 'Deborah', 469, 0.000397049809856317], + [1940, 'F', 'Amanda', 218, 0.000184556201596326], + [1940, 'F', 'Jessica', 61, 5.16418729237427e-05], + [1941, 'F', 'Patricia', 36901, 0.0296201340816562], + [1941, 'F', 'Linda', 23715, 0.0190358385882897], + [1941, 'F', 'Betty', 20900, 0.0167762608684484], + [1941, 'F', 'Dorothy', 14561, 0.0116879968662908], + [1941, 'F', 'Helen', 9889, 0.00793782027407113], + [1941, 'F', 'Deborah', 608, 0.000488036679809409], + [1941, 'F', 'Amanda', 223, 0.000179000295390622], + [1941, 'F', 'Jessica', 81, 6.50180445140824e-05], + [1941, 'F', 'Ashley', 6, 4.81615144548759e-06], + [1942, 'F', 'Patricia', 39454, 0.0283767212206867], + [1942, 'F', 'Linda', 31611, 0.0227357564380576], + [1942, 'F', 'Betty', 21654, 0.0155743276046218], + [1942, 'F', 'Dorothy', 15032, 0.0108115494852071], + [1942, 'F', 'Helen', 10013, 0.00720170602683468], + [1942, 'F', 'Deborah', 676, 0.000486203263171901], + [1942, 'F', 'Amanda', 295, 0.000212174500940401], + [1942, 'F', 'Jessica', 127, 9.13429207438335e-05], + [1942, 'F', 'Ashley', 8, 5.7538847712651e-06], + [1943, 'F', 'Patricia', 39620, 0.0276053892520138], + [1943, 'F', 'Linda', 38437, 0.0267811293962558], + [1943, 'F', 'Betty', 21595, 0.0150464003255234], + [1943, 'F', 'Dorothy', 14785, 0.0103015063122419], + [1943, 'F', 'Helen', 9799, 0.00682749140031507], + [1943, 'F', 'Deborah', 788, 0.000549042067909815], + [1943, 'F', 'Amanda', 284, 0.000197878105693385], + [1943, 'F', 'Jessica', 121, 8.43072210876746e-05], + [1943, 'F', 'Ashley', 10, 6.96753893286567e-06], + [1944, 'F', 'Linda', 38411, 0.0281104982403037], + [1944, 'F', 'Patricia', 36872, 0.0269842048141543], + [1944, 'F', 'Betty', 19757, 0.0144588558937201], + [1944, 'F', 'Dorothy', 13378, 0.00979048307669114], + [1944, 'F', 'Helen', 8693, 0.00636183804647003], + [1944, 'F', 'Deborah', 1293, 0.000946262118265933], + [1944, 'F', 'Amanda', 238, 0.000174176631204402], + [1944, 'F', 'Jessica', 124, 9.07474885266633e-05], + [1944, 'F', 'Ashley', 12, 8.78201501870935e-06], + [1945, 'F', 'Linda', 41464, 0.0308041820109342], + [1945, 'F', 'Patricia', 35840, 0.0266260342290151], + [1945, 'F', 'Betty', 18383, 0.0136569862508924], + [1945, 'F', 'Dorothy', 12328, 0.00915864257743577], + [1945, 'F', 'Helen', 8300, 0.00616618538227749], + [1945, 'F', 'Deborah', 1464, 0.00108762595176557], + [1945, 'F', 'Amanda', 280, 0.00020801589241418], + [1945, 'F', 'Jessica', 132, 9.80646349952565e-05], + [1945, 'F', 'Ashley', 10, 7.42913901479216e-06], + [1946, 'F', 'Linda', 52708, 0.0326804234293612], + [1946, 'F', 'Patricia', 46295, 0.028704185373421], + [1946, 'F', 'Betty', 19714, 0.012223227356121], + [1946, 'F', 'Dorothy', 12796, 0.00793387527893499], + [1946, 'F', 'Helen', 8852, 0.00548848577439298], + [1946, 'F', 'Deborah', 2470, 0.00153146857916297], + [1946, 'F', 'Amanda', 274, 0.000169887607567067], + [1946, 'F', 'Jessica', 240, 0.000148806663562394], + [1946, 'F', 'Ashley', 7, 4.34019435390317e-06], + [1947, 'F', 'Linda', 99680, 0.0548360886157353], + [1947, 'F', 'Patricia', 51274, 0.0282069182151205], + [1947, 'F', 'Betty', 18962, 0.0104313996020423], + [1947, 'F', 'Dorothy', 12751, 0.00701459636776927], + [1947, 'F', 'Helen', 8978, 0.00493898880008098], + [1947, 'F', 'Deborah', 5838, 0.00321160799898338], + [1947, 'F', 'Jessica', 430, 0.000236552147921009], + [1947, 'F', 'Amanda', 310, 0.000170537595012821], + [1947, 'F', 'Ashley', 11, 6.05133401658396e-06], + [1948, 'F', 'Linda', 96211, 0.0552115905834257], + [1948, 'F', 'Patricia', 46135, 0.0264750052651604], + [1948, 'F', 'Betty', 16622, 0.00953869161195395], + [1948, 'F', 'Dorothy', 11326, 0.00649953201762667], + [1948, 'F', 'Deborah', 11246, 0.00645362326242535], + [1948, 'F', 'Helen', 8305, 0.00476590264933688], + [1948, 'F', 'Jessica', 482, 0.000276600250087944], + [1948, 'F', 'Amanda', 306, 0.000175600988645043], + [1948, 'F', 'Ashley', 13, 7.46017272021426e-06], + [1949, 'F', 'Linda', 91010, 0.0518428093664536], + [1949, 'F', 'Patricia', 46337, 0.0263953440019049], + [1949, 'F', 'Deborah', 19208, 0.0109416183090962], + [1949, 'F', 'Betty', 14946, 0.00851381857807951], + [1949, 'F', 'Dorothy', 10406, 0.00592765931510072], + [1949, 'F', 'Helen', 7709, 0.00439134399962632], + [1949, 'F', 'Jessica', 406, 0.000231273273297222], + [1949, 'F', 'Amanda', 333, 0.000189689655192056], + [1949, 'F', 'Ashley', 11, 6.26602464598385e-06], + [1950, 'F', 'Linda', 80439, 0.0457319621154536], + [1950, 'F', 'Patricia', 47952, 0.0272621371145866], + [1950, 'F', 'Deborah', 29073, 0.0165288645381293], + [1950, 'F', 'Betty', 13614, 0.00773996360272735], + [1950, 'F', 'Dorothy', 9555, 0.00543230147084324], + [1950, 'F', 'Helen', 7060, 0.0040138198204242], + [1950, 'F', 'Jessica', 402, 0.000228548947281945], + [1950, 'F', 'Amanda', 379, 0.000215472763730988], + [1950, 'F', 'Ashley', 15, 8.52794579410241e-06], + [1951, 'F', 'Linda', 73947, 0.0400434945769865], + [1951, 'F', 'Patricia', 56433, 0.0305593807654547], + [1951, 'F', 'Deborah', 42045, 0.0227680464317606], + [1951, 'F', 'Betty', 12820, 0.00694223701403664], + [1951, 'F', 'Dorothy', 9082, 0.00491804965378165], + [1951, 'F', 'Helen', 6945, 0.00376082964605963], + [1951, 'F', 'Jessica', 466, 0.000252346524847198], + [1951, 'F', 'Amanda', 409, 0.000221480104425974], + [1951, 'F', 'Ashley', 15, 8.12274221611151e-06], + [1952, 'F', 'Linda', 67092, 0.0352717589878795], + [1952, 'F', 'Patricia', 53090, 0.0279105956696256], + [1952, 'F', 'Deborah', 49809, 0.0261857008797962], + [1952, 'F', 'Betty', 12125, 0.00637438260490131], + [1952, 'F', 'Dorothy', 8608, 0.00452541735777241], + [1952, 'F', 'Helen', 6470, 0.00340142313020301], + [1952, 'F', 'Jessica', 452, 0.000237626469065187], + [1952, 'F', 'Amanda', 418, 0.000219751911657629], + [1952, 'F', 'Ashley', 24, 1.26173346406294e-05], + [1953, 'F', 'Linda', 61264, 0.0317575840515387], + [1953, 'F', 'Deborah', 52196, 0.0270569805620611], + [1953, 'F', 'Patricia', 51007, 0.0264406354419697], + [1953, 'F', 'Betty', 11367, 0.00589234228770306], + [1953, 'F', 'Dorothy', 8154, 0.00422681085721217], + [1953, 'F', 'Helen', 6120, 0.00317244081998265], + [1953, 'F', 'Jessica', 495, 0.000256594478086832], + [1953, 'F', 'Amanda', 428, 0.000221863508325584], + [1953, 'F', 'Ashley', 15, 7.7755902450555e-06], + [1954, 'F', 'Linda', 55371, 0.0278157891564086], + [1954, 'F', 'Deborah', 54674, 0.0274656491003862], + [1954, 'F', 'Patricia', 49133, 0.0246821110079613], + [1954, 'F', 'Betty', 10615, 0.00533247732378461], + [1954, 'F', 'Dorothy', 7791, 0.00391383239091907], + [1954, 'F', 'Helen', 5940, 0.00298397694802455], + [1954, 'F', 'Amanda', 428, 0.000215007093224664], + [1954, 'F', 'Jessica', 424, 0.000212997681138453], + [1954, 'F', 'Ashley', 21, 1.0549413452612e-05], + [1955, 'F', 'Deborah', 52314, 0.026099932497594], + [1955, 'F', 'Linda', 51279, 0.0255835615426869], + [1955, 'F', 'Patricia', 46210, 0.0230545911364801], + [1955, 'F', 'Betty', 9928, 0.00495316989402671], + [1955, 'F', 'Dorothy', 7241, 0.00361260104780897], + [1955, 'F', 'Helen', 5596, 0.00279189552044455], + [1955, 'F', 'Amanda', 452, 0.000225506929099524], + [1955, 'F', 'Jessica', 386, 0.000192578926177912], + [1955, 'F', 'Ashley', 8, 3.9912730814075e-06], + [1956, 'F', 'Linda', 48067, 0.0233410866641092], + [1956, 'F', 'Deborah', 47829, 0.0232255150947153], + [1956, 'F', 'Patricia', 43332, 0.0210417951469653], + [1956, 'F', 'Betty', 9213, 0.00447378516313558], + [1956, 'F', 'Dorothy', 6862, 0.00333215171924849], + [1956, 'F', 'Helen', 5279, 0.00256345510433005], + [1956, 'F', 'Amanda', 643, 0.000312237475295363], + [1956, 'F', 'Jessica', 406, 0.00019715150073082], + [1956, 'F', 'Ashley', 25, 1.21398707346564e-05], + [1957, 'F', 'Linda', 44495, 0.021213187408344], + [1957, 'F', 'Deborah', 40065, 0.0191011653784763], + [1957, 'F', 'Patricia', 39277, 0.0187254829045404], + [1957, 'F', 'Betty', 8474, 0.00404001685803589], + [1957, 'F', 'Dorothy', 6401, 0.00305170496911585], + [1957, 'F', 'Helen', 5015, 0.0023909233588683], + [1957, 'F', 'Amanda', 667, 0.000317995190501527], + [1957, 'F', 'Jessica', 476, 0.000226935098468856], + [1957, 'F', 'Ashley', 27, 1.28723690307964e-05], + [1958, 'F', 'Linda', 41898, 0.0202894802981679], + [1958, 'F', 'Patricia', 37932, 0.0183689094150104], + [1958, 'F', 'Deborah', 32936, 0.015949551842581], + [1958, 'F', 'Betty', 7709, 0.00373315202679308], + [1958, 'F', 'Dorothy', 5539, 0.00268231016687078], + [1958, 'F', 'Helen', 4763, 0.0023065252436912], + [1958, 'F', 'Amanda', 796, 0.00038547010161205], + [1958, 'F', 'Jessica', 529, 0.000256172969538661], + [1958, 'F', 'Ashley', 38, 1.84018390216808e-05], + [1959, 'F', 'Linda', 40409, 0.0194416392387311], + [1959, 'F', 'Patricia', 35221, 0.0169455808267303], + [1959, 'F', 'Deborah', 29552, 0.0142181029667396], + [1959, 'F', 'Betty', 7317, 0.00352036611422691], + [1959, 'F', 'Dorothy', 5238, 0.00252011448767535], + [1959, 'F', 'Helen', 4378, 0.00210634998607153], + [1959, 'F', 'Amanda', 858, 0.000412802258576833], + [1959, 'F', 'Jessica', 523, 0.000251626551556741], + [1959, 'F', 'Ashley', 37, 1.78014959992341e-05], + [1960, 'F', 'Linda', 37314, 0.0179400268278259], + [1960, 'F', 'Patricia', 32107, 0.0154365771925017], + [1960, 'F', 'Deborah', 25269, 0.012148966551759], + [1960, 'F', 'Betty', 6503, 0.00312654752804181], + [1960, 'F', 'Dorothy', 5077, 0.00244094753188809], + [1960, 'F', 'Helen', 4069, 0.00195631583755223], + [1960, 'F', 'Amanda', 977, 0.000469727346593395], + [1960, 'F', 'Jessica', 560, 0.000269239830186593], + [1960, 'F', 'Ashley', 57, 2.74047684297068e-05], + [1961, 'F', 'Linda', 35574, 0.0171339811436622], + [1961, 'F', 'Patricia', 28867, 0.0139035990800612], + [1961, 'F', 'Deborah', 24092, 0.0116037520018302], + [1961, 'F', 'Betty', 5580, 0.00268756998880179], + [1961, 'F', 'Dorothy', 4726, 0.00227624655323965], + [1961, 'F', 'Helen', 3855, 0.00185673518043565], + [1961, 'F', 'Amanda', 1057, 0.0005090970390974], + [1961, 'F', 'Jessica', 669, 0.000322219412635914], + [1961, 'F', 'Ashley', 80, 3.85314693735024e-05], + [1962, 'F', 'Linda', 31462, 0.015521322454956], + [1962, 'F', 'Patricia', 26538, 0.0130921383036559], + [1962, 'F', 'Deborah', 22893, 0.0112939302956363], + [1962, 'F', 'Betty', 4765, 0.00235074380197906], + [1962, 'F', 'Dorothy', 4075, 0.00201034228605765], + [1962, 'F', 'Helen', 3587, 0.00176959454726105], + [1962, 'F', 'Amanda', 948, 0.000467682082744208], + [1962, 'F', 'Jessica', 867, 0.000427721904788216], + [1962, 'F', 'Ashley', 95, 4.6866875380485e-05], + [1963, 'F', 'Linda', 27715, 0.0139419183153997], + [1963, 'F', 'Patricia', 25363, 0.0127587542570263], + [1963, 'F', 'Deborah', 21062, 0.0105951536553833], + [1963, 'F', 'Betty', 4154, 0.00208965284799461], + [1963, 'F', 'Dorothy', 3791, 0.00190704717061809], + [1963, 'F', 'Helen', 3340, 0.00168017345024121], + [1963, 'F', 'Jessica', 1121, 0.000563914502311496], + [1963, 'F', 'Amanda', 1035, 0.000520652551197501], + [1963, 'F', 'Ashley', 108, 5.4328961864087e-05], + [1964, 'F', 'Patricia', 26087, 0.013328857510441], + [1964, 'F', 'Linda', 23633, 0.0120750139741731], + [1964, 'F', 'Deborah', 19306, 0.00986418227839823], + [1964, 'F', 'Betty', 4067, 0.00207798763732755], + [1964, 'F', 'Dorothy', 3535, 0.00180616825619692], + [1964, 'F', 'Helen', 3095, 0.00158135523420918], + [1964, 'F', 'Amanda', 1275, 0.000651446825078097], + [1964, 'F', 'Jessica', 1172, 0.000598820140385513], + [1964, 'F', 'Ashley', 180, 9.19689635404372e-05], + [1965, 'F', 'Patricia', 23551, 0.0128881183708359], + [1965, 'F', 'Linda', 19339, 0.0105831311270687], + [1965, 'F', 'Deborah', 17083, 0.00934855106488003], + [1965, 'F', 'Betty', 3565, 0.00195092106458452], + [1965, 'F', 'Dorothy', 2960, 0.00161983908868728], + [1965, 'F', 'Helen', 2804, 0.00153446919076998], + [1965, 'F', 'Amanda', 1650, 0.000902950843356088], + [1965, 'F', 'Jessica', 1529, 0.000836734448176641], + [1965, 'F', 'Ashley', 218, 0.000119298959910077], + [1966, 'F', 'Patricia', 20115, 0.0114579150183275], + [1966, 'F', 'Deborah', 16250, 0.00925633204314305], + [1966, 'F', 'Linda', 15560, 0.00886329394408036], + [1966, 'F', 'Betty', 2948, 0.00167924103773451], + [1966, 'F', 'Dorothy', 2667, 0.00151917769594231], + [1966, 'F', 'Helen', 2449, 0.00139500044145584], + [1966, 'F', 'Amanda', 2329, 0.00132664598944493], + [1966, 'F', 'Jessica', 1665, 0.000948418021651273], + [1966, 'F', 'Ashley', 263, 0.000149810173990561], + [1967, 'F', 'Patricia', 17746, 0.0103375520052381], + [1967, 'F', 'Deborah', 14007, 0.00815947768158289], + [1967, 'F', 'Linda', 13199, 0.00768879459693101], + [1967, 'F', 'Amanda', 2663, 0.00155127358221284], + [1967, 'F', 'Betty', 2543, 0.00148137015379919], + [1967, 'F', 'Dorothy', 2316, 0.00134913616838338], + [1967, 'F', 'Helen', 2153, 0.00125418401145484], + [1967, 'F', 'Jessica', 1761, 0.00102583281197026], + [1967, 'F', 'Ashley', 386, 0.000224856028063896], + [1968, 'F', 'Patricia', 15806, 0.00924608652923696], + [1968, 'F', 'Deborah', 12286, 0.0071869808362777], + [1968, 'F', 'Linda', 11368, 0.00664997543112525], + [1968, 'F', 'Amanda', 2430, 0.00142148489599176], + [1968, 'F', 'Betty', 2134, 0.00124833282635655], + [1968, 'F', 'Dorothy', 2084, 0.0012190841659452], + [1968, 'F', 'Helen', 1881, 0.00110033460467511], + [1968, 'F', 'Jessica', 1841, 0.00107693567634602], + [1968, 'F', 'Ashley', 544, 0.000318225425275522], + [1969, 'F', 'Patricia', 14957, 0.00848518199146773], + [1969, 'F', 'Deborah', 11186, 0.00634587455750204], + [1969, 'F', 'Linda', 10248, 0.00581374239811201], + [1969, 'F', 'Amanda', 2817, 0.00159809839339203], + [1969, 'F', 'Jessica', 2492, 0.00141372424434964], + [1969, 'F', 'Betty', 2133, 0.00121006172279205], + [1969, 'F', 'Helen', 1857, 0.00105348552237451], + [1969, 'F', 'Dorothy', 1778, 0.00100866842153036], + [1969, 'F', 'Ashley', 643, 0.000364777162566942], + [1970, 'F', 'Patricia', 13404, 0.00731676961673752], + [1970, 'F', 'Deborah', 9853, 0.00537840428481907], + [1970, 'F', 'Linda', 8734, 0.00476758175414693], + [1970, 'F', 'Jessica', 4023, 0.00219601344137086], + [1970, 'F', 'Amanda', 3550, 0.00193781946727978], + [1970, 'F', 'Betty', 1967, 0.0010737157442646], + [1970, 'F', 'Dorothy', 1802, 0.000983648078883991], + [1970, 'F', 'Helen', 1715, 0.000936157855319669], + [1970, 'F', 'Ashley', 932, 0.000508745843240776], + [1971, 'F', 'Patricia', 11466, 0.006543190995437], + [1971, 'F', 'Deborah', 8675, 0.00495047809919902], + [1971, 'F', 'Linda', 7379, 0.00421090235089217], + [1971, 'F', 'Jessica', 5360, 0.00305873920596043], + [1971, 'F', 'Amanda', 4133, 0.00235853901832733], + [1971, 'F', 'Betty', 1763, 0.00100607410822915], + [1971, 'F', 'Dorothy', 1626, 0.000927893647181281], + [1971, 'F', 'Helen', 1441, 0.000822321491751676], + [1971, 'F', 'Ashley', 1164, 0.000664248588757079], + [1972, 'F', 'Patricia', 9602, 0.00595464005496972], + [1972, 'F', 'Deborah', 6279, 0.00389389553271765], + [1972, 'F', 'Jessica', 6208, 0.00384986518030119], + [1972, 'F', 'Linda', 5746, 0.00356335781668986], + [1972, 'F', 'Amanda', 4181, 0.00259282962610169], + [1972, 'F', 'Betty', 1366, 0.000847119174660346], + [1972, 'F', 'Dorothy', 1277, 0.0007919261976876], + [1972, 'F', 'Helen', 1245, 0.000772081531809759], + [1972, 'F', 'Ashley', 1176, 0.000729291471010664], + [1973, 'F', 'Patricia', 8477, 0.00545491634229101], + [1973, 'F', 'Jessica', 7226, 0.00464990273556622], + [1973, 'F', 'Amanda', 5627, 0.00362095249004029], + [1973, 'F', 'Deborah', 4984, 0.00320718450512899], + [1973, 'F', 'Linda', 4735, 0.00304695397909024], + [1973, 'F', 'Betty', 1323, 0.000851345325097441], + [1973, 'F', 'Ashley', 1253, 0.00080630059890181], + [1973, 'F', 'Dorothy', 1175, 0.000756107903998106], + [1973, 'F', 'Helen', 1133, 0.000729081068280726], + [1974, 'F', 'Jessica', 10653, 0.00680199571179919], + [1974, 'F', 'Patricia', 8040, 0.00513358166928241], + [1974, 'F', 'Amanda', 7476, 0.00477346474621335], + [1974, 'F', 'Deborah', 4345, 0.00277430501903384], + [1974, 'F', 'Linda', 4085, 0.00260829367151973], + [1974, 'F', 'Ashley', 1626, 0.00103820942714592], + [1974, 'F', 'Helen', 1140, 0.000727895908331088], + [1974, 'F', 'Betty', 1130, 0.000721510856503622], + [1974, 'F', 'Dorothy', 1100, 0.000702355701021225], + [1975, 'F', 'Jessica', 12930, 0.00828471748344498], + [1975, 'F', 'Amanda', 12653, 0.00810723358994813], + [1975, 'F', 'Patricia', 7056, 0.00452103376358761], + [1975, 'F', 'Linda', 3525, 0.00225859467356099], + [1975, 'F', 'Deborah', 3415, 0.00218811370502433], + [1975, 'F', 'Ashley', 1988, 0.00127378332228064], + [1975, 'F', 'Helen', 1057, 0.000677258034029493], + [1975, 'F', 'Betty', 1021, 0.000654191535235679], + [1975, 'F', 'Dorothy', 975, 0.000624717675665805], + [1976, 'F', 'Jessica', 18370, 0.0116864866171597], + [1976, 'F', 'Amanda', 15591, 0.00991856357366017], + [1976, 'F', 'Patricia', 6017, 0.00382784920933316], + [1976, 'F', 'Linda', 3141, 0.00199821744499176], + [1976, 'F', 'Deborah', 2994, 0.00190470010515929], + [1976, 'F', 'Ashley', 2292, 0.00145810709453076], + [1976, 'F', 'Dorothy', 983, 0.000625357449355907], + [1976, 'F', 'Helen', 942, 0.000599274381783586], + [1976, 'F', 'Betty', 908, 0.000577644520869953], + [1977, 'F', 'Jessica', 24843, 0.0151032385968816], + [1977, 'F', 'Amanda', 18280, 0.01111327945703], + [1977, 'F', 'Patricia', 5907, 0.00359114561010263], + [1977, 'F', 'Linda', 2909, 0.0017685191433534], + [1977, 'F', 'Ashley', 2706, 0.00164510581021461], + [1977, 'F', 'Deborah', 2677, 0.00162747533405193], + [1977, 'F', 'Helen', 992, 0.00060308387425458], + [1977, 'F', 'Dorothy', 934, 0.000567822921929212], + [1977, 'F', 'Betty', 807, 0.000490613595285732], + [1978, 'F', 'Jessica', 26105, 0.0158812818667457], + [1978, 'F', 'Amanda', 20522, 0.0124847985623197], + [1978, 'F', 'Patricia', 5498, 0.00334477256094111], + [1978, 'F', 'Ashley', 3484, 0.00211953212119295], + [1978, 'F', 'Linda', 2936, 0.00178614991613734], + [1978, 'F', 'Deborah', 2479, 0.00150812862469498], + [1978, 'F', 'Helen', 922, 0.000560909476389179], + [1978, 'F', 'Dorothy', 913, 0.00055543422119666], + [1978, 'F', 'Betty', 715, 0.000434978606961239], + [1979, 'F', 'Amanda', 31927, 0.018529201469011], + [1979, 'F', 'Jessica', 27777, 0.0161207012624023], + [1979, 'F', 'Patricia', 5651, 0.0032796228114568], + [1979, 'F', 'Ashley', 4450, 0.0025826086552792], + [1979, 'F', 'Linda', 2739, 0.00158961013636174], + [1979, 'F', 'Deborah', 2181, 0.00126576842183459], + [1979, 'F', 'Dorothy', 889, 0.000515941369560272], + [1979, 'F', 'Helen', 879, 0.000510137754604588], + [1979, 'F', 'Betty', 711, 0.000412637023349104], + [1980, 'F', 'Amanda', 35819, 0.0201204564808553], + [1980, 'F', 'Jessica', 33921, 0.0190543009097711], + [1980, 'F', 'Ashley', 7296, 0.00409835144711801], + [1980, 'F', 'Patricia', 5309, 0.00298220227970799], + [1980, 'F', 'Linda', 2805, 0.00157564087296683], + [1980, 'F', 'Deborah', 1938, 0.00108862460314072], + [1980, 'F', 'Helen', 909, 0.000510608753485509], + [1980, 'F', 'Dorothy', 895, 0.00050274459226571], + [1980, 'F', 'Betty', 658, 0.000369615577330544], + [1981, 'F', 'Jessica', 42527, 0.0237842499463097], + [1981, 'F', 'Amanda', 34373, 0.0192239288782304], + [1981, 'F', 'Ashley', 8877, 0.00496467624740497], + [1981, 'F', 'Patricia', 5285, 0.0029557636552366], + [1981, 'F', 'Linda', 2730, 0.00152681831197652], + [1981, 'F', 'Deborah', 1905, 0.00106541717374186], + [1981, 'F', 'Helen', 896, 0.000501109599828191], + [1981, 'F', 'Dorothy', 787, 0.00044014872217052], + [1981, 'F', 'Betty', 662, 0.000370239458801632], + [1982, 'F', 'Jessica', 45445, 0.0250562932675237], + [1982, 'F', 'Amanda', 34210, 0.0188618284229725], + [1982, 'F', 'Ashley', 14851, 0.00818816176292209], + [1982, 'F', 'Patricia', 5167, 0.00284884733883364], + [1982, 'F', 'Linda', 2787, 0.00153662425649881], + [1982, 'F', 'Deborah', 1842, 0.00101559450321881], + [1982, 'F', 'Helen', 875, 0.000482434956740747], + [1982, 'F', 'Dorothy', 828, 0.000456521307635815], + [1982, 'F', 'Betty', 635, 0.000350109940034713], + [1983, 'F', 'Jessica', 45278, 0.0253076258799791], + [1983, 'F', 'Amanda', 33754, 0.0188664164484477], + [1983, 'F', 'Ashley', 33290, 0.0186070688975773], + [1983, 'F', 'Patricia', 4922, 0.00275109621850031], + [1983, 'F', 'Linda', 2473, 0.0013822553734968], + [1983, 'F', 'Deborah', 1605, 0.000897096592989232], + [1983, 'F', 'Helen', 844, 0.000471744252014275], + [1983, 'F', 'Dorothy', 759, 0.000424234463600515], + [1983, 'F', 'Betty', 563, 0.000314682480905257], + [1984, 'F', 'Jessica', 45851, 0.025436304942746], + [1984, 'F', 'Ashley', 38759, 0.0215019463757801], + [1984, 'F', 'Amanda', 33906, 0.0188096956530664], + [1984, 'F', 'Patricia', 4475, 0.00248255140823075], + [1984, 'F', 'Linda', 2334, 0.00129481005291857], + [1984, 'F', 'Deborah', 1468, 0.000814387813917932], + [1984, 'F', 'Helen', 859, 0.00047653891836206], + [1984, 'F', 'Dorothy', 682, 0.000378346382215279], + [1984, 'F', 'Betty', 503, 0.000279044325886049], + [1985, 'F', 'Jessica', 48343, 0.0261934794528861], + [1985, 'F', 'Ashley', 47007, 0.0254696003276962], + [1985, 'F', 'Amanda', 39050, 0.0211582932924147], + [1985, 'F', 'Patricia', 4398, 0.00238294939564762], + [1985, 'F', 'Linda', 2113, 0.00114487768826817], + [1985, 'F', 'Deborah', 1401, 0.000759097795202892], + [1985, 'F', 'Helen', 809, 0.000438336985238501], + [1985, 'F', 'Dorothy', 719, 0.000389572672912833], + [1985, 'F', 'Betty', 502, 0.000271996497638724], + [1986, 'F', 'Jessica', 52667, 0.0285499155975875], + [1986, 'F', 'Ashley', 49674, 0.0269274594602799], + [1986, 'F', 'Amanda', 40522, 0.0219663105900363], + [1986, 'F', 'Patricia', 4246, 0.00230168685566591], + [1986, 'F', 'Linda', 1951, 0.00105760505308624], + [1986, 'F', 'Deborah', 1284, 0.000696035309155683], + [1986, 'F', 'Helen', 766, 0.000415236017767331], + [1986, 'F', 'Dorothy', 629, 0.000340970568114427], + [1986, 'F', 'Betty', 407, 0.000220628014662277], + [1987, 'F', 'Jessica', 55990, 0.0298840611579793], + [1987, 'F', 'Ashley', 54845, 0.029272929705472], + [1987, 'F', 'Amanda', 41786, 0.0223028287113293], + [1987, 'F', 'Patricia', 3913, 0.00208852172372161], + [1987, 'F', 'Linda', 1929, 0.00102958303221543], + [1987, 'F', 'Deborah', 1203, 0.000642088329577588], + [1987, 'F', 'Helen', 815, 0.000434997496762871], + [1987, 'F', 'Dorothy', 614, 0.000327715905536691], + [1987, 'F', 'Betty', 435, 0.000232176578026809], + [1988, 'F', 'Jessica', 51532, 0.0268079862120844], + [1988, 'F', 'Ashley', 49963, 0.025991760752821], + [1988, 'F', 'Amanda', 39451, 0.0205232062418098], + [1988, 'F', 'Patricia', 3798, 0.00197579623599892], + [1988, 'F', 'Linda', 1844, 0.000959286008210115], + [1988, 'F', 'Deborah', 1056, 0.000549352507955467], + [1988, 'F', 'Helen', 775, 0.000403170637940802], + [1988, 'F', 'Dorothy', 608, 0.000316293868216784], + [1988, 'F', 'Betty', 395, 0.000205486970305312], + [1989, 'F', 'Jessica', 47885, 0.0240412252916602], + [1989, 'F', 'Ashley', 47585, 0.0238906067767286], + [1989, 'F', 'Amanda', 36827, 0.0184894268312827], + [1989, 'F', 'Patricia', 3606, 0.00181043454947743], + [1989, 'F', 'Linda', 1844, 0.000925801805112695], + [1989, 'F', 'Deborah', 1076, 0.000540218406887885], + [1989, 'F', 'Helen', 857, 0.000430266890987842], + [1989, 'F', 'Dorothy', 620, 0.000311278264191904], + [1989, 'F', 'Betty', 399, 0.000200322624858983], + [1990, 'F', 'Jessica', 46470, 0.0226274308541356], + [1990, 'F', 'Ashley', 45553, 0.0221809201140185], + [1990, 'F', 'Amanda', 34405, 0.0167526739517223], + [1990, 'F', 'Patricia', 3578, 0.00174221965991171], + [1990, 'F', 'Linda', 1658, 0.000807322581367696], + [1990, 'F', 'Deborah', 1094, 0.000532696564545392], + [1990, 'F', 'Helen', 861, 0.000419242908659582], + [1990, 'F', 'Dorothy', 596, 0.000290207634798038], + [1990, 'F', 'Betty', 406, 0.00019769177806712], + [1991, 'F', 'Ashley', 43482, 0.0213883278618854], + [1991, 'F', 'Jessica', 43394, 0.0213450416089107], + [1991, 'F', 'Amanda', 28887, 0.0142092044281837], + [1991, 'F', 'Patricia', 3418, 0.00168127741667642], + [1991, 'F', 'Linda', 1608, 0.000790957895264976], + [1991, 'F', 'Deborah', 1014, 0.00049877568768575], + [1991, 'F', 'Helen', 773, 0.000380230381243673], + [1991, 'F', 'Dorothy', 498, 0.000244960840697735], + [1991, 'F', 'Betty', 345, 0.000169701787230359], + [1992, 'F', 'Ashley', 38452, 0.0191860354880783], + [1992, 'F', 'Jessica', 38352, 0.0191361394215848], + [1992, 'F', 'Amanda', 25034, 0.0124909812859813], + [1992, 'F', 'Patricia', 2951, 0.00147243292222301], + [1992, 'F', 'Linda', 1580, 0.000788357850597206], + [1992, 'F', 'Deborah', 919, 0.00045854485107521], + [1992, 'F', 'Helen', 827, 0.000412640469901196], + [1992, 'F', 'Dorothy', 508, 0.00025347201778695], + [1992, 'F', 'Betty', 296, 0.000147692356820742], + [1993, 'F', 'Jessica', 34987, 0.0177506267031079], + [1993, 'F', 'Ashley', 34847, 0.0176795978141367], + [1993, 'F', 'Amanda', 20809, 0.0105574296471538], + [1993, 'F', 'Patricia', 2660, 0.00134954889045265], + [1993, 'F', 'Linda', 1487, 0.000754428270715449], + [1993, 'F', 'Helen', 868, 0.000440379111621392], + [1993, 'F', 'Deborah', 797, 0.000404357317928858], + [1993, 'F', 'Dorothy', 476, 0.000241498222502053], + [1993, 'F', 'Betty', 292, 0.000148145968425629], + [1994, 'F', 'Jessica', 32117, 0.0164797639663909], + [1994, 'F', 'Ashley', 30278, 0.0155361426463986], + [1994, 'F', 'Amanda', 18715, 0.00960297607594125], + [1994, 'F', 'Patricia', 2363, 0.00121249438778783], + [1994, 'F', 'Linda', 1281, 0.000657302289782567], + [1994, 'F', 'Helen', 848, 0.000435122827272144], + [1994, 'F', 'Deborah', 740, 0.000379706240779937], + [1994, 'F', 'Dorothy', 442, 0.000226797511384773], + [1994, 'F', 'Betty', 275, 0.00014110704893849], + [1995, 'F', 'Jessica', 27935, 0.0145416403136851], + [1995, 'F', 'Ashley', 26603, 0.0138482640868074], + [1995, 'F', 'Amanda', 16345, 0.00850843425549248], + [1995, 'F', 'Patricia', 2160, 0.0011243938814233], + [1995, 'F', 'Linda', 1233, 0.000641841507312464], + [1995, 'F', 'Helen', 837, 0.000435702629051527], + [1995, 'F', 'Deborah', 660, 0.000343564797101562], + [1995, 'F', 'Dorothy', 376, 0.000195727823803314], + [1995, 'F', 'Betty', 234, 0.00012180933715419], + [1996, 'F', 'Jessica', 24192, 0.012621838409999], + [1996, 'F', 'Ashley', 23676, 0.0123526226105793], + [1996, 'F', 'Amanda', 13973, 0.00729021776219062], + [1996, 'F', 'Patricia', 1970, 0.00102782000941212], + [1996, 'F', 'Linda', 987, 0.000514953476796833], + [1996, 'F', 'Helen', 900, 0.000469562440848176], + [1996, 'F', 'Deborah', 633, 0.000330258916729884], + [1996, 'F', 'Dorothy', 350, 0.000182607615885402], + [1996, 'F', 'Betty', 217, 0.000113216721848949], + [1997, 'F', 'Jessica', 21043, 0.0110255841966801], + [1997, 'F', 'Ashley', 20895, 0.0109480388627872], + [1997, 'F', 'Amanda', 12239, 0.00641268473996901], + [1997, 'F', 'Patricia', 1781, 0.000933163781508686], + [1997, 'F', 'Linda', 1095, 0.00057373067981584], + [1997, 'F', 'Helen', 812, 0.000425451426493573], + [1997, 'F', 'Deborah', 638, 0.000334283263673522], + [1997, 'F', 'Dorothy', 315, 0.000165045812001817], + [1997, 'F', 'Betty', 189, 9.90274872010902e-05], + [1998, 'F', 'Ashley', 19871, 0.0102549361330773], + [1998, 'F', 'Jessica', 18233, 0.00940960447458096], + [1998, 'F', 'Amanda', 10908, 0.00562935148405249], + [1998, 'F', 'Patricia', 1704, 0.000879392641073107], + [1998, 'F', 'Linda', 970, 0.000500593228779879], + [1998, 'F', 'Helen', 832, 0.000429374810664803], + [1998, 'F', 'Deborah', 553, 0.00028538974795389], + [1998, 'F', 'Dorothy', 312, 0.000161015553999301], + [1998, 'F', 'Betty', 194, 0.000100118645755976], + [1999, 'F', 'Ashley', 18132, 0.00931837897619116], + [1999, 'F', 'Jessica', 16346, 0.0084005196748743], + [1999, 'F', 'Amanda', 9741, 0.00500608480074333], + [1999, 'F', 'Patricia', 1532, 0.000787323879964971], + [1999, 'F', 'Linda', 898, 0.000461499245566935], + [1999, 'F', 'Helen', 841, 0.000432205863610014], + [1999, 'F', 'Deborah', 524, 0.000269293546410995], + [1999, 'F', 'Dorothy', 335, 0.000172162858869625], + [1999, 'F', 'Betty', 182, 9.35332546694679e-05], + [2000, 'F', 'Ashley', 17997, 0.00902349055709788], + [2000, 'F', 'Jessica', 15705, 0.00787430789571719], + [2000, 'F', 'Amanda', 8550, 0.00428687249337039], + [2000, 'F', 'Patricia', 1392, 0.000697932925236442], + [2000, 'F', 'Helen', 890, 0.000446235850187093], + [2000, 'F', 'Linda', 849, 0.000425678917762744], + [2000, 'F', 'Deborah', 545, 0.00027325678466513], + [2000, 'F', 'Dorothy', 312, 0.000156433241863341], + [2000, 'F', 'Betty', 174, 8.72416156545553e-05], + [2001, 'F', 'Ashley', 16524, 0.00834726311913036], + [2001, 'F', 'Jessica', 13917, 0.00703031111286233], + [2001, 'F', 'Amanda', 6963, 0.00351742877623485], + [2001, 'F', 'Patricia', 1223, 0.000617810626645874], + [2001, 'F', 'Helen', 884, 0.000446561401434957], + [2001, 'F', 'Linda', 837, 0.000422818883485361], + [2001, 'F', 'Deborah', 489, 0.000247023218667075], + [2001, 'F', 'Dorothy', 317, 0.00016013570617068], + [2001, 'F', 'Betty', 153, 7.72894733252811e-05], + [2002, 'F', 'Ashley', 15339, 0.00777226488632702], + [2002, 'F', 'Jessica', 11913, 0.00603631211883524], + [2002, 'F', 'Amanda', 6132, 0.00310708183603607], + [2002, 'F', 'Patricia', 1113, 0.000563956634622985], + [2002, 'F', 'Helen', 875, 0.000443362134137567], + [2002, 'F', 'Linda', 769, 0.000389651978459187], + [2002, 'F', 'Deborah', 474, 0.000240175601807093], + [2002, 'F', 'Dorothy', 263, 0.000133261990032206], + [2002, 'F', 'Betty', 127, 6.43508468976811e-05], + [2003, 'F', 'Ashley', 14512, 0.00723815072032368], + [2003, 'F', 'Jessica', 10445, 0.00520965299571257], + [2003, 'F', 'Amanda', 5339, 0.00266293320671225], + [2003, 'F', 'Patricia', 1011, 0.000504256503462462], + [2003, 'F', 'Helen', 783, 0.000390536935916031], + [2003, 'F', 'Linda', 739, 0.000368591054459702], + [2003, 'F', 'Deborah', 421, 0.000209982183934418], + [2003, 'F', 'Dorothy', 291, 0.000145142079631628], + [2003, 'F', 'Betty', 142, 7.08253446999699e-05], + [2004, 'F', 'Ashley', 14370, 0.00712775344818093], + [2004, 'F', 'Jessica', 9469, 0.00469677782886745], + [2004, 'F', 'Amanda', 4677, 0.00231986798031609], + [2004, 'F', 'Patricia', 997, 0.000494528196787501], + [2004, 'F', 'Helen', 860, 0.000426573971150703], + [2004, 'F', 'Linda', 727, 0.000360603810496001], + [2004, 'F', 'Deborah', 427, 0.000211798936838779], + [2004, 'F', 'Dorothy', 288, 0.000142852678710933], + [2004, 'F', 'Betty', 136, 6.7458209391274e-05], + [2005, 'F', 'Ashley', 13270, 0.00654498034039816], + [2005, 'F', 'Jessica', 8108, 0.00399899778447237], + [2005, 'F', 'Amanda', 4088, 0.00201626824653713], + [2005, 'F', 'Helen', 960, 0.000473487650850206], + [2005, 'F', 'Patricia', 877, 0.000432550697703782], + [2005, 'F', 'Linda', 745, 0.000367446145711879], + [2005, 'F', 'Deborah', 425, 0.00020961692876181], + [2005, 'F', 'Dorothy', 234, 0.000115412614894738], + [2005, 'F', 'Betty', 132, 6.51045519919034e-05], + [2006, 'F', 'Ashley', 12340, 0.00590922303294464], + [2006, 'F', 'Jessica', 6809, 0.00326060774970179], + [2006, 'F', 'Amanda', 3355, 0.00160659994129086], + [2006, 'F', 'Helen', 948, 0.000453966242725406], + [2006, 'F', 'Patricia', 775, 0.000371122192101466], + [2006, 'F', 'Linda', 698, 0.000334249406563643], + [2006, 'F', 'Deborah', 423, 0.000202560886785704], + [2006, 'F', 'Dorothy', 265, 0.000126899846331469], + [2006, 'F', 'Betty', 135, 6.46470915273522e-05], + [2007, 'F', 'Ashley', 11423, 0.00540374075290008], + [2007, 'F', 'Jessica', 5704, 0.00269832244196289], + [2007, 'F', 'Amanda', 3038, 0.00143714999626284], + [2007, 'F', 'Helen', 931, 0.000440416934338613], + [2007, 'F', 'Patricia', 725, 0.000342967000424806], + [2007, 'F', 'Linda', 659, 0.000311745176937858], + [2007, 'F', 'Deborah', 371, 0.000175504492631177], + [2007, 'F', 'Dorothy', 262, 0.000123941178084551], + [2007, 'F', 'Betty', 134, 6.33897628371366e-05], + [2008, 'F', 'Ashley', 9402, 0.00452030531532519], + [2008, 'F', 'Jessica', 4732, 0.00227505687642191], + [2008, 'F', 'Amanda', 2439, 0.00117262546948289], + [2008, 'F', 'Helen', 884, 0.000425010625265632], + [2008, 'F', 'Patricia', 629, 0.000302411406439007], + [2008, 'F', 'Linda', 611, 0.000293757343933598], + [2008, 'F', 'Deborah', 355, 0.000170677343856673], + [2008, 'F', 'Dorothy', 242, 0.000116349062572718], + [2008, 'F', 'Betty', 137, 6.58670312911669e-05], + [2009, 'F', 'Ashley', 7811, 0.00386339097012116], + [2009, 'F', 'Jessica', 3793, 0.00187605197153624], + [2009, 'F', 'Amanda', 1952, 0.000965476785773462], + [2009, 'F', 'Helen', 826, 0.000408547041520942], + [2009, 'F', 'Patricia', 564, 0.000278959481135365], + [2009, 'F', 'Linda', 550, 0.000272034955007891], + [2009, 'F', 'Deborah', 346, 0.000171134717150419], + [2009, 'F', 'Dorothy', 226, 0.000111781636057788], + [2009, 'F', 'Betty', 148, 7.32021333475781e-05], + [2010, 'F', 'Ashley', 6306, 0.00322252105804575], + [2010, 'F', 'Jessica', 3195, 0.00163272356175962], + [2010, 'F', 'Amanda', 1655, 0.000845745694745594], + [2010, 'F', 'Helen', 703, 0.000359250286046014], + [2010, 'F', 'Patricia', 479, 0.000244780778116701], + [2010, 'F', 'Linda', 476, 0.00024324770434979], + [2010, 'F', 'Deborah', 354, 0.000180902704495432], + [2010, 'F', 'Dorothy', 240, 0.000122645901352835], + [2010, 'F', 'Betty', 132, 6.74552457440595e-05], + [2011, 'F', 'Ashley', 5398, 0.00279205644940212], + [2011, 'F', 'Jessica', 2620, 0.00135516633890952], + [2011, 'F', 'Amanda', 1409, 0.000728789836459354], + [2011, 'F', 'Helen', 729, 0.000377067275215663], + [2011, 'F', 'Linda', 488, 0.000252412661598414], + [2011, 'F', 'Patricia', 427, 0.000220861078898612], + [2011, 'F', 'Deborah', 332, 0.000171723368136626], + [2011, 'F', 'Dorothy', 276, 0.000142757980740086], + [2011, 'F', 'Betty', 167, 8.63789231289653e-05], + [2012, 'F', 'Ashley', 4696, 0.00242806420306393], + [2012, 'F', 'Jessica', 2327, 0.00120317406314518], + [2012, 'F', 'Amanda', 1228, 0.00063493672090343], + [2012, 'F', 'Helen', 772, 0.000399162173076098], + [2012, 'F', 'Linda', 448, 0.000231638152251414], + [2012, 'F', 'Patricia', 394, 0.000203717482113967], + [2012, 'F', 'Deborah', 336, 0.000173728614188561], + [2012, 'F', 'Dorothy', 277, 0.000143222696816165], + [2012, 'F', 'Betty', 140, 7.2386922578567e-05], + [2013, 'F', 'Ashley', 3936, 0.00204898297876106], + [2013, 'F', 'Jessica', 1946, 0.00101303884061713], + [2013, 'F', 'Amanda', 1064, 0.000553891740193539], + [2013, 'F', 'Helen', 738, 0.000384184308517699], + [2013, 'F', 'Linda', 441, 0.000229573550211796], + [2013, 'F', 'Patricia', 419, 0.000218120901448396], + [2013, 'F', 'Dorothy', 334, 0.000173872031226167], + [2013, 'F', 'Deborah', 329, 0.000171269156507213], + [2013, 'F', 'Betty', 174, 9.05800402196202e-05], + [2014, 'F', 'Ashley', 3547, 0.00182125980653672], + [2014, 'F', 'Jessica', 1790, 0.000919102073217006], + [2014, 'F', 'Amanda', 1048, 0.000538111157950515], + [2014, 'F', 'Helen', 801, 0.000411285341143476], + [2014, 'F', 'Linda', 470, 0.000241328477325136], + [2014, 'F', 'Dorothy', 382, 0.000196143570932344], + [2014, 'F', 'Patricia', 377, 0.000193576246705481], + [2014, 'F', 'Deborah', 369, 0.0001894685279425], + [2014, 'F', 'Betty', 193, 9.90987151569174e-05], + [2015, 'F', 'Ashley', 3409, 0.00176165787043521], + [2015, 'F', 'Jessica', 1577, 0.000814941173856356], + [2015, 'F', 'Amanda', 1013, 0.000523484723599549], + [2015, 'F', 'Helen', 757, 0.000391192434121282], + [2015, 'F', 'Linda', 423, 0.000218592337692605], + [2015, 'F', 'Dorothy', 395, 0.00020412286853092], + [2015, 'F', 'Deborah', 346, 0.00017880129749797], + [2015, 'F', 'Patricia', 346, 0.00017880129749797], + [2015, 'F', 'Betty', 186, 9.61186165740535e-05], +]; diff --git a/src/utils/domain.ts b/src/utils/domain.ts index 9ebb2aa2b0..160a8eded4 100644 --- a/src/utils/domain.ts +++ b/src/utils/domain.ts @@ -44,7 +44,7 @@ export function computeOrdinalDataDomain( : uniqueValues; } -function getPaddedRange(start: number, end: number, domainOptions?: YDomainRange,): [number, number] { +function getPaddedRange(start: number, end: number, domainOptions?: YDomainRange): [number, number] { if (!domainOptions?.padding) { return [start, end]; } diff --git a/src/utils/geometry.ts b/src/utils/geometry.ts index ced00b4c58..5a53d51e59 100644 --- a/src/utils/geometry.ts +++ b/src/utils/geometry.ts @@ -95,6 +95,7 @@ export interface LineGeometry { * Ranges of `[x0, x1]` pairs to clip from series */ clippedRanges: ClippedRanges; + hideClippedRanges?: boolean; } export interface AreaGeometry { @@ -115,6 +116,7 @@ export interface AreaGeometry { * Ranges of `[x0, x1]` pairs to clip from series */ clippedRanges: ClippedRanges; + hideClippedRanges?: boolean; } export interface BubbleGeometry { diff --git a/stories/area/14_stacked_band.tsx b/stories/area/14_stacked_band.tsx index c15440febd..69c75111ab 100644 --- a/stories/area/14_stacked_band.tsx +++ b/stories/area/14_stacked_band.tsx @@ -17,18 +17,17 @@ * under the License. */ -import { boolean } from '@storybook/addon-knobs'; import React from 'react'; import { AreaSeries, Axis, Chart, Position, ScaleType, Settings, timeFormatter } from '../../src'; import { KIBANA_METRICS } from '../../src/utils/data_samples/test_dataset_kibana'; +import { SB_SOURCE_PANEL } from '../utils/storybook'; const dateFormatter = timeFormatter('HH:mm'); export const Example = () => { const { data } = KIBANA_METRICS.metrics.kibana_os_load[0]; const data2 = KIBANA_METRICS.metrics.kibana_os_load[0].data.map((d) => [d[0], 20, 10]); - const fit = boolean('fit Y domain', false); return ( @@ -42,7 +41,6 @@ export const Example = () => { /> Number(d).toFixed(2)} @@ -54,7 +52,6 @@ export const Example = () => { yScaleType={ScaleType.Linear} xAccessor={0} yAccessors={[1]} - y0Accessors={[2]} data={data} stackAccessors={[0]} /> @@ -72,3 +69,10 @@ export const Example = () => { ); }; + +// storybook configuration +Example.story = { + parameters: { + options: { selectedPanel: SB_SOURCE_PANEL }, + }, +}; diff --git a/stories/area/16_test_stacked_with_missing.tsx b/stories/area/16_test_stacked_with_missing.tsx index 199b719d8c..53d3565bce 100644 --- a/stories/area/16_test_stacked_with_missing.tsx +++ b/stories/area/16_test_stacked_with_missing.tsx @@ -35,6 +35,9 @@ export const Example = () => ( curve={CurveType.CURVE_CATMULL_ROM} splitSeriesAccessors={['col-1-6']} stackAccessors={['col-1-6']} + areaSeriesStyle={{ + point: { visible: true }, + }} /> ); @@ -75,6 +78,11 @@ const data = [ 'col-1-6': 'ES-Air', 'col-2-5': 4, }, + { + 'col-0-3': 'YWG', + 'col-1-6': 'ES-Air', + 'col-2-5': 10, + }, { 'col-0-3': 'YWG', 'col-1-6': 'Logstash Airways', @@ -85,11 +93,6 @@ const data = [ 'col-1-6': 'Kibana Airlines', 'col-2-5': 19, }, - { - 'col-0-3': 'YWG', - 'col-1-6': 'JetBeats', - 'col-2-5': 17, - }, { 'col-0-3': 'YUL', 'col-1-6': 'Logstash Airways', diff --git a/stories/area/8_stacked_percentage.tsx b/stories/area/8_stacked_percentage.tsx index 6c072875ac..c7cfcd9d1b 100644 --- a/stories/area/8_stacked_percentage.tsx +++ b/stories/area/8_stacked_percentage.tsx @@ -20,7 +20,7 @@ import { boolean } from '@storybook/addon-knobs'; import React from 'react'; -import { AreaSeries, Axis, Chart, Position, ScaleType, Settings } from '../../src'; +import { AreaSeries, Axis, Chart, Position, ScaleType, Settings, StackMode } from '../../src'; export const Example = () => { const stackedAsPercentage = boolean('stacked as percentage', true); @@ -42,7 +42,7 @@ export const Example = () => { xAccessor="x" yAccessors={['y']} stackAccessors={['x']} - stackAsPercentage={stackedAsPercentage} + stackMode={stackedAsPercentage ? StackMode.Percentage : undefined} splitSeriesAccessors={['g']} data={[ { x: 0, y: 2, g: 'a' }, diff --git a/stories/area/8_stacked_percentage_zeros.tsx b/stories/area/8_stacked_percentage_zeros.tsx index 68bfe60239..5145f811cf 100644 --- a/stories/area/8_stacked_percentage_zeros.tsx +++ b/stories/area/8_stacked_percentage_zeros.tsx @@ -19,7 +19,7 @@ import React from 'react'; -import { AreaSeries, Axis, Chart, Position, ScaleType, Settings, niceTimeFormatter } from '../../src'; +import { AreaSeries, Axis, Chart, Position, ScaleType, Settings, niceTimeFormatter, StackMode } from '../../src'; export const Example = () => ( @@ -46,7 +46,7 @@ export const Example = () => ( yAccessors={[1]} data={DATA[0].data} stackAccessors={[0]} - stackAsPercentage + stackMode={StackMode.Percentage} /> ( yAccessors={[1]} data={DATA[1].data} stackAccessors={[0]} - stackAsPercentage + stackMode={StackMode.Percentage} /> ( xAccessor={0} yAccessors={[1]} data={DATA[2].data} - stackAsPercentage + stackMode={StackMode.Percentage} stackAccessors={[0]} /> diff --git a/stories/bar/12_stacked_as_percentage.tsx b/stories/bar/12_stacked_as_percentage.tsx index ff95d6031f..fa52864365 100644 --- a/stories/bar/12_stacked_as_percentage.tsx +++ b/stories/bar/12_stacked_as_percentage.tsx @@ -20,7 +20,7 @@ import { boolean } from '@storybook/addon-knobs'; import React from 'react'; -import { Axis, BarSeries, Chart, Position, ScaleType, Settings } from '../../src'; +import { Axis, BarSeries, Chart, Position, ScaleType, Settings, StackMode } from '../../src'; import { SB_SOURCE_PANEL } from '../utils/storybook'; export const Example = () => { @@ -44,7 +44,7 @@ export const Example = () => { xAccessor="x" yAccessors={['y']} stackAccessors={clusterBars ? [] : ['x']} - stackAsPercentage={clusterBars ? false : stackedAsPercentage} + stackMode={clusterBars ? undefined : StackMode.Percentage} splitSeriesAccessors={['g']} data={[ { x: 0, y: 2, g: 'a' }, diff --git a/stories/mixed/6_fitting.tsx b/stories/mixed/6_fitting.tsx index 72f2bd6eb7..2cefac6709 100644 --- a/stories/mixed/6_fitting.tsx +++ b/stories/mixed/6_fitting.tsx @@ -108,7 +108,7 @@ export const Example = () => { }, SeriesTypes.Area, ); - const dataKey = select( + const dataKey = select( 'dataset', { 'Isolated Points': 'isolated', @@ -119,7 +119,6 @@ export const Example = () => { }, 'all', ); - // @ts-ignore const dataset = dataTypes[dataKey]; const fit = select( 'fitting function', @@ -162,12 +161,14 @@ export const Example = () => { 'none', ); const parsedEndValue: number | 'nearest' = Number.isNaN(Number(endValue)) ? 'nearest' : Number(endValue); - const value = number('Explicit valuve (using Fit.Explicit)', 5); + const value = number('Explicit value (using Fit.Explicit)', 5); const xScaleType = dataKey === 'ordinal' ? ScaleType.Ordinal : ScaleType.Linear; return ( { + const dataTypes: Record> = { + isolated: [ + { x: 0, y: 3 }, + { x: 1, y: 5 }, + { x: 2, y: null }, + { x: 3, y: 4 }, + { x: 4, y: null }, + { x: 5, y: 5 }, + { x: 6, y: null }, + { x: 7, y: 12 }, + { x: 8, y: null }, + { x: 9, y: 10 }, + { x: 10, y: 7 }, + ], + successive: [ + { x: 0, y: 3 }, + { x: 1, y: 5 }, + { x: 2, y: null }, + { x: 4, y: null }, + { x: 6, y: null }, + { x: 8, y: null }, + { x: 9, y: 10 }, + { x: 10, y: 7 }, + ], + endPoints: [ + { x: 0, y: null }, + { x: 1, y: 5 }, + { x: 3, y: 4 }, + { x: 5, y: 5 }, + { x: 7, y: 12 }, + { x: 9, y: 10 }, + { x: 10, y: null }, + ], + ordinal: [ + { x: 'a', y: null }, + { x: 'b', y: 3 }, + { x: 'c', y: 5 }, + { x: 'd', y: null }, + { x: 'e', y: 4 }, + { x: 'f', y: null }, + { x: 'g', y: 5 }, + { x: 'h', y: 6 }, + { x: 'i', y: null }, + { x: 'j', y: null }, + { x: 'k', y: null }, + { x: 'l', y: 12 }, + { x: 'm', y: null }, + ], + all: [ + { x: 0, y: null }, + { x: 1, y: 3 }, + { x: 2, y: 5 }, + { x: 3, y: null }, + { x: 4, y: 4 }, + { x: 5, y: null }, + { x: 6, y: 5 }, + { x: 7, y: 6 }, + { x: 8, y: null }, + { x: 9, y: null }, + { x: 10, y: null }, + { x: 11, y: 12 }, + { x: 12, y: null }, + ], + }; + + const stackMode = select( + 'stackMode', + { + Percentage: StackMode.Percentage, + Silhouette: StackMode.Silhouette, + Wiggle: StackMode.Wiggle, + None: 'none', + }, + 'none', + ); + + const dataKey = select( + 'dataset', + { + 'Isolated Points': 'isolated', + 'Successive null Points': 'successive', + 'null end points': 'endPoints', + 'Ordinal x values': 'ordinal', + 'All edge cases': 'all', + }, + 'all', + ); + + const dataset = dataTypes[dataKey]; + const fit = select( + 'fitting function', + { + None: Fit.None, + Carry: Fit.Carry, + Lookahead: Fit.Lookahead, + Nearest: Fit.Nearest, + Average: Fit.Average, + Linear: Fit.Linear, + Zero: Fit.Zero, + Explicit: Fit.Explicit, + }, + Fit.Average, + ); + const curve = select( + 'Curve', + { + 'Curve cardinal': CurveType.CURVE_CARDINAL, + 'Curve natural': CurveType.CURVE_NATURAL, + 'Curve monotone x': CurveType.CURVE_MONOTONE_X, + 'Curve monotone y': CurveType.CURVE_MONOTONE_Y, + 'Curve basis': CurveType.CURVE_BASIS, + 'Curve catmull rom': CurveType.CURVE_CATMULL_ROM, + 'Curve step': CurveType.CURVE_STEP, + 'Curve step after': CurveType.CURVE_STEP_AFTER, + 'Curve step before': CurveType.CURVE_STEP_BEFORE, + Linear: CurveType.LINEAR, + }, + 0, + ); + const endValue = select( + 'End value', + { + None: 'none', + nearest: 'nearest', + 0: 0, + 2: 2, + }, + 'none', + ); + const parsedEndValue: number | 'nearest' = Number.isNaN(Number(endValue)) ? 'nearest' : Number(endValue); + const value = number('Explicit value (using Fit.Explicit)', 5); + const xScaleType = dataKey === 'ordinal' ? ScaleType.Ordinal : ScaleType.Linear; + const rng = getRandomNumberGenerator(); + return ( + + + + + ({ + ...d, + y: rng(2, 10), + }))} + /> + + ({ + ...d, + y: rng(2, 10), + }))} + /> + + ); +}; + +// storybook configuration +Example.story = { + parameters: { + options: { selectedPanel: SB_KNOBS_PANEL }, + }, +}; diff --git a/stories/mixed/mixed.stories.tsx b/stories/mixed/mixed.stories.tsx index fe39ce4db1..f3695ff473 100644 --- a/stories/mixed/mixed.stories.tsx +++ b/stories/mixed/mixed.stories.tsx @@ -32,4 +32,5 @@ export { Example as areasAndBars } from './3_areas_and_bars'; export { Example as testBarLinesLinear } from './4_test_bar'; export { Example as testBarLinesTime } from './5_test_bar_time'; export { Example as fittingFunctionsNonStackedSeries } from './6_fitting'; +export { Example as fittingFunctionsStackedSeries } from './6_fitting_stacked'; export { Example as markSizeAccessor } from './7_marks'; diff --git a/stories/streamgraph/1_basic.tsx b/stories/streamgraph/1_basic.tsx new file mode 100644 index 0000000000..a68bfd6cc4 --- /dev/null +++ b/stories/streamgraph/1_basic.tsx @@ -0,0 +1,70 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { select } from '@storybook/addon-knobs'; +import React from 'react'; + +import { AreaSeries, Chart, ScaleType, StackMode, Axis, Position, CurveType } from '../../src'; +import { BABYNAME_DATA } from '../../src/utils/data_samples/babynames'; +import { SB_SOURCE_PANEL } from '../utils/storybook'; + +export const Example = () => { + const stackMode = select( + 'stackMode', + { + Silhouette: StackMode.Silhouette, + Wiggle: StackMode.Wiggle, + }, + StackMode.Silhouette, + ); + return ( + + + + + + + ); +}; + + +// storybook configuration +Example.story = { + parameters: { + options: { selectedPanel: SB_SOURCE_PANEL }, + }, +}; diff --git a/stories/streamgraph/streamgraph.stories.tsx b/stories/streamgraph/streamgraph.stories.tsx new file mode 100644 index 0000000000..778c02d7d6 --- /dev/null +++ b/stories/streamgraph/streamgraph.stories.tsx @@ -0,0 +1,29 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SB_KNOBS_PANEL } from '../utils/storybook'; + +export default { + title: 'Streamgraph', + parameters: { + options: { selectedPanel: SB_KNOBS_PANEL }, + }, +}; + +export { Example as basic } from './1_basic';