From 64bdd88836210a4c4c997dc207859c3fbd773d80 Mon Sep 17 00:00:00 2001 From: Robert Monfera Date: Mon, 12 Apr 2021 20:15:02 +0200 Subject: [PATCH] feat: mosaic (#1113) --- api/charts.api.md | 5 +- ...r-slices-visually-looks-correct-1-snap.png | Bin 0 -> 24316 bytes ...e-mosaic-visually-looks-correct-1-snap.png | Bin 0 -> 52001 bytes .../layout/types/config_types.ts | 1 + .../layout/viewmodel/hierarchy_of_arrays.ts | 14 ++- .../layout/viewmodel/viewmodel.ts | 17 ++- .../renderer/dom/highlighter.tsx | 5 +- stories/mosaic/10_mosaic_simple.tsx | 111 ++++++++++++++++++ stories/mosaic/20_mosaic_with_other.tsx | 100 ++++++++++++++++ stories/mosaic/mosaic.stories.tsx | 30 +++++ 10 files changed, 270 insertions(+), 13 deletions(-) create mode 100644 integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-mosaic-alpha-other-slices-visually-looks-correct-1-snap.png create mode 100644 integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-mosaic-alpha-simple-mosaic-visually-looks-correct-1-snap.png create mode 100644 stories/mosaic/10_mosaic_simple.tsx create mode 100644 stories/mosaic/20_mosaic_with_other.tsx create mode 100644 stories/mosaic/mosaic.stories.tsx diff --git a/api/charts.api.md b/api/charts.api.md index 3352d7c837..5b94e93bb9 100644 --- a/api/charts.api.md +++ b/api/charts.api.md @@ -1388,6 +1388,7 @@ export const PartitionLayout: Readonly<{ treemap: "treemap"; icicle: "icicle"; flame: "flame"; + mosaic: "mosaic"; }>; // @public (undocumented) @@ -2188,8 +2189,8 @@ export type YDomainRange = YDomainBase & DomainRange & LogScaleOptions; // src/chart_types/heatmap/layout/types/config_types.ts:31:13 - (ae-forgotten-export) The symbol "SizeRatio" needs to be exported by the entry point index.d.ts // src/chart_types/heatmap/layout/types/config_types.ts:63:5 - (ae-forgotten-export) The symbol "TextAlign" needs to be exported by the entry point index.d.ts // src/chart_types/heatmap/layout/types/config_types.ts:64:5 - (ae-forgotten-export) The symbol "TextBaseline" needs to be exported by the entry point index.d.ts -// src/chart_types/partition_chart/layout/types/config_types.ts:148:5 - (ae-forgotten-export) The symbol "TimeMs" needs to be exported by the entry point index.d.ts -// src/chart_types/partition_chart/layout/types/config_types.ts:149:5 - (ae-forgotten-export) The symbol "AnimKeyframe" needs to be exported by the entry point index.d.ts +// src/chart_types/partition_chart/layout/types/config_types.ts:149:5 - (ae-forgotten-export) The symbol "TimeMs" needs to be exported by the entry point index.d.ts +// src/chart_types/partition_chart/layout/types/config_types.ts:150:5 - (ae-forgotten-export) The symbol "AnimKeyframe" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-mosaic-alpha-other-slices-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-mosaic-alpha-other-slices-visually-looks-correct-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..046a394514c0fd8dc521545e613cee8a2c400bc3 GIT binary patch literal 24316 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 literal 0 HcmV?d00001 diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-mosaic-alpha-simple-mosaic-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-mosaic-alpha-simple-mosaic-visually-looks-correct-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebee939a73678c5ef333402de1b81eecbe20792 GIT binary patch literal 52001 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 MOyz0u6O(uU0|MCXVgLXD literal 0 HcmV?d00001 diff --git a/src/chart_types/partition_chart/layout/types/config_types.ts b/src/chart_types/partition_chart/layout/types/config_types.ts index be9abbf696..25ce2804f2 100644 --- a/src/chart_types/partition_chart/layout/types/config_types.ts +++ b/src/chart_types/partition_chart/layout/types/config_types.ts @@ -30,6 +30,7 @@ export const PartitionLayout = Object.freeze({ treemap: 'treemap' as const, icicle: 'icicle' as const, flame: 'flame' as const, + mosaic: 'mosaic' as const, }); /** @public */ diff --git a/src/chart_types/partition_chart/layout/viewmodel/hierarchy_of_arrays.ts b/src/chart_types/partition_chart/layout/viewmodel/hierarchy_of_arrays.ts index 088a6f5ec2..9e5f5043db 100644 --- a/src/chart_types/partition_chart/layout/viewmodel/hierarchy_of_arrays.ts +++ b/src/chart_types/partition_chart/layout/viewmodel/hierarchy_of_arrays.ts @@ -35,7 +35,7 @@ import { NodeSorter, Sorter, } from '../utils/group_by_rollup'; -import { isSunburst, isTreemap } from './viewmodel'; +import { isMosaic, isSunburst, isTreemap } from './viewmodel'; function aggregateComparator(accessor: (v: any) => any, sorter: Sorter): NodeSorter { return (a, b) => sorter(accessor(a), accessor(b)); @@ -50,6 +50,7 @@ const childOrders = { }; const descendingValueNodes = aggregateComparator(mapEntryValue, childOrders.descending); +const ascendingValueNodes = aggregateComparator(mapEntryValue, childOrders.ascending); /** * @internal @@ -78,8 +79,15 @@ export function getHierarchyOfArrays( return mapsToArrays(groupByRollup(groupByRollupAccessors, valueAccessor, aggregator, facts), sortSpecs); } -const sorter = (layout: PartitionLayout) => ({ sortPredicate }: Layer) => - sortPredicate || (isTreemap(layout) || isSunburst(layout) ? descendingValueNodes : null); +const sorter = (layout: PartitionLayout) => ({ sortPredicate }: Layer, i: number) => + sortPredicate || + (isTreemap(layout) || isSunburst(layout) + ? descendingValueNodes + : isMosaic(layout) + ? i === 2 + ? ascendingValueNodes + : descendingValueNodes + : null); /** @internal */ export function partitionTree( diff --git a/src/chart_types/partition_chart/layout/viewmodel/viewmodel.ts b/src/chart_types/partition_chart/layout/viewmodel/viewmodel.ts index 24e7fba21d..b1d7c293a0 100644 --- a/src/chart_types/partition_chart/layout/viewmodel/viewmodel.ts +++ b/src/chart_types/partition_chart/layout/viewmodel/viewmodel.ts @@ -60,7 +60,7 @@ import { pathAccessor, } from '../utils/group_by_rollup'; import { sunburst } from '../utils/sunburst'; -import { getTopPadding, treemap } from '../utils/treemap'; +import { getTopPadding, LayerLayout, treemap } from '../utils/treemap'; import { fillTextLayout, getRectangleRowGeometry, @@ -70,6 +70,9 @@ import { } from './fill_text_layout'; import { linkTextLayout } from './link_text_layout'; +/** @internal */ +export const isMosaic = (p: PartitionLayout | undefined) => p === PartitionLayout.mosaic; + /** @internal */ export const isTreemap = (p: PartitionLayout | undefined) => p === PartitionLayout.treemap; @@ -236,7 +239,8 @@ const rawChildNodes = ( return sunburst(tree, sunburstAreaAccessor, { x0: 0, y0: -1 }, clockwiseSectors, specialFirstInnermostSector); case PartitionLayout.treemap: - const treemapInnerArea = isTreemap(partitionLayout) ? width * height : 1; // assuming 1 x 1 unit square + case PartitionLayout.mosaic: + const treemapInnerArea = width * height; // assuming 1 x 1 unit square const treemapValueToAreaScale = treemapInnerArea / totalValue; const treemapAreaAccessor = (e: ArrayEntry) => treemapValueToAreaScale * mapEntryValue(e); return treemap( @@ -250,7 +254,7 @@ const rawChildNodes = ( width, height, }, - [], + isMosaic(partitionLayout) ? [LayerLayout.vertical, LayerLayout.horizontal] : [], ); case PartitionLayout.icicle: @@ -313,6 +317,7 @@ export function shapeViewModel( const { marginLeftPx, marginTopPx, panelInnerWidth, panelInnerHeight } = panel; const treemapLayout = isTreemap(partitionLayout); + const mosaicLayout = isMosaic(partitionLayout); const sunburstLayout = isSunburst(partitionLayout); const icicleLayout = isIcicle(partitionLayout); const flameLayout = isFlame(partitionLayout); @@ -400,7 +405,7 @@ export function shapeViewModel( : simpleLinear ? () => [] // no multirow layout needed for simpleLinear partitions : fillTextLayout( - rectangleConstruction(treeHeight, treemapLayout ? topGroove : null), + rectangleConstruction(treeHeight, treemapLayout || mosaicLayout ? topGroove : null), getRectangleRowGeometry, () => 0, ); @@ -414,7 +419,7 @@ export function shapeViewModel( layers, textFillOrigins, !sunburstLayout, - !treemapLayout, + !(treemapLayout || mosaicLayout), ); // whiskers (ie. just lines, no text) for fill text outside the outer radius @@ -424,7 +429,7 @@ export function shapeViewModel( const currentY = [-height, -height, -height, -height]; const nodesWithoutRoom = - fillOutside || treemapLayout || icicleLayout || flameLayout + fillOutside || treemapLayout || mosaicLayout || icicleLayout || flameLayout ? [] // outsideFillNodes and linkLabels are in inherent conflict due to very likely overlaps : quadViewModel.filter((n: ShapeTreeNode) => { const id = nodeId(n); diff --git a/src/chart_types/partition_chart/renderer/dom/highlighter.tsx b/src/chart_types/partition_chart/renderer/dom/highlighter.tsx index 4d42bba231..9eb8f31e04 100644 --- a/src/chart_types/partition_chart/renderer/dom/highlighter.tsx +++ b/src/chart_types/partition_chart/renderer/dom/highlighter.tsx @@ -30,7 +30,7 @@ import { QuadViewModel, ShapeViewModel, } from '../../layout/types/viewmodel_types'; -import { isSunburst, isTreemap } from '../../layout/viewmodel/viewmodel'; +import { isSunburst, isTreemap, isMosaic } from '../../layout/viewmodel/viewmodel'; import { ContinuousDomainFocus, IndexedContinuousDomainFocus } from '../canvas/partition'; interface HighlightSet extends PartitionSmallMultiplesModel { @@ -123,7 +123,8 @@ function renderGeometries( ) { const maxDepth = geoms.reduce((acc, geom) => Math.max(acc, geom.depth), 0); // we should render only the deepest geometries of the tree to avoid overlaying highlighted geometries - const highlightedGeoms = isTreemap(partitionLayout) ? geoms.filter((g) => g.depth >= maxDepth) : geoms; + const highlightedGeoms = + isTreemap(partitionLayout) || isMosaic(partitionLayout) ? geoms.filter((g) => g.depth >= maxDepth) : geoms; const renderGeom = isSunburst(partitionLayout) ? renderSector : renderRectangles; return highlightedGeoms.map((geometry, index) => renderGeom( diff --git a/stories/mosaic/10_mosaic_simple.tsx b/stories/mosaic/10_mosaic_simple.tsx new file mode 100644 index 0000000000..8a0bf240d7 --- /dev/null +++ b/stories/mosaic/10_mosaic_simple.tsx @@ -0,0 +1,111 @@ +/* + * 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 { boolean } from '@storybook/addon-knobs'; +import React from 'react'; + +import { + AdditiveNumber, + ArrayEntry, + Chart, + Datum, + Partition, + PartitionLayout, + Settings, + ShapeTreeNode, +} from '../../src'; +import { config } from '../../src/chart_types/partition_chart/layout/config'; +import { mocks } from '../../src/mocks/hierarchical'; +import { keepDistinct } from '../../src/utils/common'; +import { countryLookup, colorBrewerCategoricalPastel12B, regionLookup } from '../utils/utils'; + +const productLookup: Record = { + '3': { label: 'Firefox', position: 1 }, + '5': { label: 'Edge (Chromium)', position: 4 }, + '6': { label: 'Safari', position: 2 }, + '7': { label: 'Chrome', position: 0 }, + '8': { label: 'Brave', position: 3 }, +}; + +const data = mocks.sunburst + .map((d) => (d.dest === 'chn' ? { ...d, dest: 'zaf' } : d)) + .filter( + (d: any) => + ['eu', 'na', 'as', 'af'].includes(countryLookup[d.dest].continentCountry.slice(0, 2)) && + ['3', '5', '6', '7', '8'].includes(d.sitc1), + ); + +const productPalette = colorBrewerCategoricalPastel12B.slice(2); + +const productToColor = new Map( + data + .map((d) => d.sitc1) + .filter(keepDistinct) + .sort() + .map((sitc1, i) => [sitc1, `rgba(${productPalette[i % productPalette.length].join(',')}, 0.7)`]), +); + +export const Example = () => { + return ( + + + d.exportVal as AdditiveNumber} + valueFormatter={(d: number) => `${config.fillLabel.valueFormatter(Math.round(d / 1000000000))}`} + layers={[ + { + groupByRollup: (d: Datum) => countryLookup[d.dest].continentCountry.slice(0, 2), + nodeLabel: (name: any) => regionLookup[name].regionName, + fillLabel: { + fontWeight: 400, + }, + shape: { + fillColor: () => 'white', + }, + }, + { + groupByRollup: (d: Datum) => d.sitc1, + nodeLabel: (d: any) => String(productLookup[d]?.label), + shape: { + fillColor: (d: ShapeTreeNode) => productToColor.get(d.dataName)!, + }, + sortPredicate: ([name1]: ArrayEntry, [name2]: ArrayEntry) => { + const position1 = Number(productLookup[name1]?.position); + const position2 = Number(productLookup[name2]?.position); + return position2 - position1; + }, + fillLabel: { + fontWeight: 200, + minFontSize: 6, + maxFontSize: 16, + maximizeFontSize: true, + fontFamily: 'Helvetica Neue', + valueFormatter: () => '', + }, + }, + ]} + config={{ + partitionLayout: PartitionLayout.mosaic, + }} + /> + + ); +}; diff --git a/stories/mosaic/20_mosaic_with_other.tsx b/stories/mosaic/20_mosaic_with_other.tsx new file mode 100644 index 0000000000..a6d099c35d --- /dev/null +++ b/stories/mosaic/20_mosaic_with_other.tsx @@ -0,0 +1,100 @@ +/* + * 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 React from 'react'; + +import { + AdditiveNumber, + ArrayEntry, + Chart, + Datum, + MODEL_KEY, + Partition, + PartitionLayout, + ShapeTreeNode, +} from '../../src'; +import { config } from '../../src/chart_types/partition_chart/layout/config'; +import { countryLookup } from '../utils/utils'; + +const categoricalColors = ['rgb(110,110,110)', 'rgb(123,123,123)', 'darkgrey', 'lightgrey']; + +const data = [ + { region: 'Americas', dest: 'usa', other: false, exportVal: 553359100104 }, + { region: 'Americas', dest: 'Other', other: true, exportVal: 753359100104 }, + { region: 'Asia', dest: 'chn', other: false, exportVal: 392617281424 }, + { region: 'Asia', dest: 'jpn', other: false, exportVal: 177490158520 }, + { region: 'Asia', dest: 'kor', other: false, exportVal: 177421375512 }, + { region: 'Asia', dest: 'Other', other: true, exportVal: 277421375512 }, + { region: 'Europe', dest: 'deu', other: false, exportVal: 253250650864 }, + { region: 'Europe', dest: 'smr', other: false, exportVal: 135443006088 }, + { region: 'Europe', dest: 'Other', other: true, exportVal: 205443006088 }, + { region: 'Africa', dest: 'Other', other: true, exportVal: 305443006088 }, +]; + +export const Example = () => { + return ( + + d.exportVal as AdditiveNumber} + valueFormatter={(d: number) => `${config.fillLabel.valueFormatter(Math.round(d / 1000000000))}`} + layers={[ + { + groupByRollup: (d: Datum) => d.region, + nodeLabel: (d) => String(d).toUpperCase(), + fillLabel: { + valueFormatter: () => ``, + fontWeight: 600, + }, + shape: { + fillColor: () => 'white', + }, + }, + { + groupByRollup: (d: Datum) => d.dest, + nodeLabel: (d: any) => countryLookup[d]?.name ?? d, + sortPredicate: ([name1, node1]: ArrayEntry, [name2, node2]: ArrayEntry) => { + if (name1 === 'Other' && name2 !== 'Other') return -1; + if (name2 === 'Other' && name1 !== 'Other') return 1; + + // otherwise, use the increasing value order + return node1.value - node2.value; + }, + fillLabel: { + fontWeight: 100, + maxFontSize: 16, + valueFont: { + fontFamily: 'Menlo', + fontStyle: 'normal', + fontWeight: 100, + }, + }, + shape: { + fillColor: (d: ShapeTreeNode) => categoricalColors.slice(0)[d[MODEL_KEY].sortIndex], + }, + }, + ]} + config={{ + partitionLayout: PartitionLayout.mosaic, + }} + /> + + ); +}; diff --git a/stories/mosaic/mosaic.stories.tsx b/stories/mosaic/mosaic.stories.tsx new file mode 100644 index 0000000000..6c5a18652f --- /dev/null +++ b/stories/mosaic/mosaic.stories.tsx @@ -0,0 +1,30 @@ +/* + * 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_SOURCE_PANEL } from '../utils/storybook'; + +export default { + title: 'Mosaic (@alpha)', + parameters: { + options: { selectedPanel: SB_SOURCE_PANEL }, + }, +}; + +export { Example as simpleMosaic } from './10_mosaic_simple'; +export { Example as otherSlices } from './20_mosaic_with_other';