From d19ad598b22ae8b6bace465df3dc5a6a18090ef5 Mon Sep 17 00:00:00 2001 From: Aleksandr Lesnenko <alxnddr@users.noreply.github.com> Date: Mon, 3 Jun 2024 11:20:53 -0300 Subject: [PATCH] fix stacked data labels on ordinal charts (#43469) --- ...acked_Series_Labels_And_Totals_Ordinal.png | Bin 0 -> 26002 bytes .../ComboChart/ComboChart.stories.tsx | 7 + ...cked-series-labels-and-totals-ordinal.json | 397 ++++++++++++++++++ .../ComboChart/stories-data/index.ts | 2 + .../cartesian/chart-measurements/index.ts | 6 +- 5 files changed, 409 insertions(+), 3 deletions(-) create mode 100644 .loki/reference/chrome_laptop_static_viz_ComboChart_Bar_Stacked_Series_Labels_And_Totals_Ordinal.png create mode 100644 frontend/src/metabase/static-viz/components/ComboChart/stories-data/bar-stacked-series-labels-and-totals-ordinal.json diff --git a/.loki/reference/chrome_laptop_static_viz_ComboChart_Bar_Stacked_Series_Labels_And_Totals_Ordinal.png b/.loki/reference/chrome_laptop_static_viz_ComboChart_Bar_Stacked_Series_Labels_And_Totals_Ordinal.png new file mode 100644 index 0000000000000000000000000000000000000000..2505e16b55d68b5d849349cf4bff879b2c46e9cb GIT binary patch literal 26002 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 E13nQn_W%F@ literal 0 HcmV?d00001 diff --git a/frontend/src/metabase/static-viz/components/ComboChart/ComboChart.stories.tsx b/frontend/src/metabase/static-viz/components/ComboChart/ComboChart.stories.tsx index 46aa0924b95..a624f1c71a4 100644 --- a/frontend/src/metabase/static-viz/components/ComboChart/ComboChart.stories.tsx +++ b/frontend/src/metabase/static-viz/components/ComboChart/ComboChart.stories.tsx @@ -717,6 +717,13 @@ BarStackedSeriesLabelsAutoCompactness.args = { renderingContext, }; +export const BarStackedSeriesLabelsAndTotalsOrdinal = Template.bind({}); +BarStackedSeriesLabelsAndTotalsOrdinal.args = { + rawSeries: data.barStackedSeriesLabelsAndTotalsOrdinal as any, + dashcardSettings: {}, + renderingContext, +}; + export const Default = Template.bind({}); Default.args = { rawSeries: data.messedUpAxis as any, diff --git a/frontend/src/metabase/static-viz/components/ComboChart/stories-data/bar-stacked-series-labels-and-totals-ordinal.json b/frontend/src/metabase/static-viz/components/ComboChart/stories-data/bar-stacked-series-labels-and-totals-ordinal.json new file mode 100644 index 00000000000..2bbee8ba7c7 --- /dev/null +++ b/frontend/src/metabase/static-viz/components/ComboChart/stories-data/bar-stacked-series-labels-and-totals-ordinal.json @@ -0,0 +1,397 @@ +[ + { + "card": { + "cache_invalidated_at": null, + "description": null, + "archived": false, + "view_count": 1, + "collection_position": null, + "table_id": 5, + "result_metadata": [ + { + "description": "The date and time an order was submitted.", + "semantic_type": "type/CreationTimestamp", + "coercion_strategy": null, + "unit": "year", + "name": "CREATED_AT", + "settings": null, + "fk_target_field_id": null, + "field_ref": [ + "field", + 41, + { + "base-type": "type/DateTime", + "temporal-unit": "year" + } + ], + "effective_type": "type/DateTime", + "id": 41, + "visibility_type": "normal", + "display_name": "Created At", + "fingerprint": { + "global": { + "distinct-count": 10001, + "nil%": 0 + }, + "type": { + "type/DateTime": { + "earliest": "2022-04-30T18:56:13.352Z", + "latest": "2026-04-19T14:07:15.657Z" + } + } + }, + "base_type": "type/DateTime" + }, + { + "description": "The type of product, valid values include: Doohicky, Gadget, Gizmo and Widget", + "semantic_type": "type/Category", + "coercion_strategy": null, + "name": "CATEGORY", + "settings": null, + "fk_target_field_id": null, + "field_ref": [ + "field", + 58, + { + "base-type": "type/Text", + "source-field": 40 + } + ], + "effective_type": "type/Text", + "id": 58, + "visibility_type": "normal", + "display_name": "Product → Category", + "fingerprint": { + "global": { + "distinct-count": 4, + "nil%": 0 + }, + "type": { + "type/Text": { + "percent-json": 0, + "percent-url": 0, + "percent-email": 0, + "percent-state": 0, + "average-length": 6.375 + } + } + }, + "base_type": "type/Text" + }, + { + "display_name": "Count", + "semantic_type": "type/Quantity", + "field_ref": ["aggregation", 0], + "name": "count", + "base_type": "type/BigInteger", + "effective_type": "type/BigInteger", + "fingerprint": { + "global": { + "distinct-count": 20, + "nil%": 0 + }, + "type": { + "type/Number": { + "min": 158, + "q1": 471, + "q3": 1518, + "max": 1783, + "sd": 578.6497895509584, + "avg": 938 + } + } + } + } + ], + "initially_published_at": null, + "can_write": true, + "trashed_from_collection_id": null, + "database_id": 1, + "enable_embedding": false, + "collection_id": null, + "query_type": "query", + "name": "stacked data labels ordinal", + "last_query_start": null, + "dashboard_count": 0, + "last_used_at": null, + "type": "question", + "average_query_time": null, + "creator_id": 1, + "moderation_reviews": [], + "updated_at": "2024-05-31T19:16:25.49153Z", + "made_public_by_id": null, + "embedding_params": null, + "cache_ttl": null, + "dataset_query": { + "database": 1, + "type": "query", + "query": { + "source-table": 5, + "aggregation": [["count"]], + "breakout": [ + [ + "field", + 41, + { + "base-type": "type/DateTime", + "temporal-unit": "year" + } + ], + [ + "field", + 58, + { + "base-type": "type/Text", + "source-field": 40 + } + ] + ] + } + }, + "id": 361, + "parameter_mappings": [], + "display": "bar", + "entity_id": "zzhdqk1KK4M9N9B-vmf9f", + "collection_preview": true, + "visualization_settings": { + "stackable.stack_type": "stacked", + "graph.show_values": true, + "graph.label_value_frequency": "fit", + "graph.show_stack_values": "all", + "graph.x_axis.scale": "ordinal", + "graph.dimensions": ["CREATED_AT", "CATEGORY"], + "graph.metrics": ["count"] + }, + "collection": null, + "metabase_version": "v0.1.6-SNAPSHOT (295fd34)", + "parameters": [], + "created_at": "2024-05-31T19:14:03.754353Z", + "parameter_usage_count": 0, + "public_uuid": null + }, + "data": { + "rows": [ + ["2022-01-01T00:00:00-03:00", "Doohickey", 177], + ["2022-01-01T00:00:00-03:00", "Gadget", 199], + ["2022-01-01T00:00:00-03:00", "Gizmo", 158], + ["2022-01-01T00:00:00-03:00", "Widget", 210], + ["2023-01-01T00:00:00-03:00", "Doohickey", 805], + ["2023-01-01T00:00:00-03:00", "Gadget", 938], + ["2023-01-01T00:00:00-03:00", "Gizmo", 864], + ["2023-01-01T00:00:00-03:00", "Widget", 1003], + ["2024-01-01T00:00:00-03:00", "Doohickey", 1206], + ["2024-01-01T00:00:00-03:00", "Gadget", 1505], + ["2024-01-01T00:00:00-03:00", "Gizmo", 1592], + ["2024-01-01T00:00:00-03:00", "Widget", 1531], + ["2025-01-01T00:00:00-03:00", "Doohickey", 1352], + ["2025-01-01T00:00:00-03:00", "Gadget", 1783], + ["2025-01-01T00:00:00-03:00", "Gizmo", 1664], + ["2025-01-01T00:00:00-03:00", "Widget", 1779], + ["2026-01-01T00:00:00-03:00", "Doohickey", 436], + ["2026-01-01T00:00:00-03:00", "Gadget", 514], + ["2026-01-01T00:00:00-03:00", "Gizmo", 506], + ["2026-01-01T00:00:00-03:00", "Widget", 538] + ], + "cols": [ + { + "description": "The date and time an order was submitted.", + "semantic_type": "type/CreationTimestamp", + "table_id": 5, + "coercion_strategy": null, + "unit": "year", + "name": "CREATED_AT", + "settings": null, + "source": "breakout", + "fk_target_field_id": null, + "field_ref": [ + "field", + 41, + { + "base-type": "type/DateTime", + "temporal-unit": "year" + } + ], + "effective_type": "type/DateTime", + "nfc_path": null, + "parent_id": null, + "id": 41, + "position": 7, + "visibility_type": "normal", + "display_name": "Created At", + "fingerprint": { + "global": { + "distinct-count": 10001, + "nil%": 0 + }, + "type": { + "type/DateTime": { + "earliest": "2022-04-30T18:56:13.352Z", + "latest": "2026-04-19T14:07:15.657Z" + } + } + }, + "base_type": "type/DateTime" + }, + { + "description": "The type of product, valid values include: Doohicky, Gadget, Gizmo and Widget", + "semantic_type": "type/Category", + "table_id": 8, + "coercion_strategy": null, + "name": "CATEGORY", + "settings": null, + "source": "breakout", + "fk_target_field_id": null, + "fk_field_id": 40, + "field_ref": [ + "field", + 58, + { + "base-type": "type/Text", + "source-field": 40 + } + ], + "effective_type": "type/Text", + "nfc_path": null, + "parent_id": null, + "id": 58, + "position": 3, + "visibility_type": "normal", + "display_name": "Product → Category", + "fingerprint": { + "global": { + "distinct-count": 4, + "nil%": 0 + }, + "type": { + "type/Text": { + "percent-json": 0, + "percent-url": 0, + "percent-email": 0, + "percent-state": 0, + "average-length": 6.375 + } + } + }, + "base_type": "type/Text", + "source_alias": "PRODUCTS__via__PRODUCT_ID" + }, + { + "base_type": "type/BigInteger", + "name": "count", + "display_name": "Count", + "semantic_type": "type/Quantity", + "source": "aggregation", + "field_ref": ["aggregation", 0], + "aggregation_index": 0, + "effective_type": "type/BigInteger" + } + ], + "native_form": { + "query": "SELECT DATE_TRUNC('year', \"PUBLIC\".\"ORDERS\".\"CREATED_AT\") AS \"CREATED_AT\", \"PRODUCTS__via__PRODUCT_ID\".\"CATEGORY\" AS \"PRODUCTS__via__PRODUCT_ID__CATEGORY\", COUNT(*) AS \"count\" FROM \"PUBLIC\".\"ORDERS\" LEFT JOIN \"PUBLIC\".\"PRODUCTS\" AS \"PRODUCTS__via__PRODUCT_ID\" ON \"PUBLIC\".\"ORDERS\".\"PRODUCT_ID\" = \"PRODUCTS__via__PRODUCT_ID\".\"ID\" GROUP BY DATE_TRUNC('year', \"PUBLIC\".\"ORDERS\".\"CREATED_AT\"), \"PRODUCTS__via__PRODUCT_ID\".\"CATEGORY\" ORDER BY DATE_TRUNC('year', \"PUBLIC\".\"ORDERS\".\"CREATED_AT\") ASC, \"PRODUCTS__via__PRODUCT_ID\".\"CATEGORY\" ASC", + "params": null + }, + "format-rows?": true, + "results_timezone": "America/Montevideo", + "requested_timezone": "Etc/GMT", + "results_metadata": { + "columns": [ + { + "description": "The date and time an order was submitted.", + "semantic_type": "type/CreationTimestamp", + "coercion_strategy": null, + "unit": "year", + "name": "CREATED_AT", + "settings": null, + "fk_target_field_id": null, + "field_ref": [ + "field", + 41, + { + "base-type": "type/DateTime", + "temporal-unit": "year" + } + ], + "effective_type": "type/DateTime", + "id": 41, + "visibility_type": "normal", + "display_name": "Created At", + "fingerprint": { + "global": { + "distinct-count": 10001, + "nil%": 0 + }, + "type": { + "type/DateTime": { + "earliest": "2022-04-30T18:56:13.352Z", + "latest": "2026-04-19T14:07:15.657Z" + } + } + }, + "base_type": "type/DateTime" + }, + { + "description": "The type of product, valid values include: Doohicky, Gadget, Gizmo and Widget", + "semantic_type": "type/Category", + "coercion_strategy": null, + "name": "CATEGORY", + "settings": null, + "fk_target_field_id": null, + "field_ref": [ + "field", + 58, + { + "base-type": "type/Text", + "source-field": 40 + } + ], + "effective_type": "type/Text", + "id": 58, + "visibility_type": "normal", + "display_name": "Product → Category", + "fingerprint": { + "global": { + "distinct-count": 4, + "nil%": 0 + }, + "type": { + "type/Text": { + "percent-json": 0, + "percent-url": 0, + "percent-email": 0, + "percent-state": 0, + "average-length": 6.375 + } + } + }, + "base_type": "type/Text" + }, + { + "display_name": "Count", + "semantic_type": "type/Quantity", + "field_ref": ["aggregation", 0], + "name": "count", + "base_type": "type/BigInteger", + "effective_type": "type/BigInteger", + "fingerprint": { + "global": { + "distinct-count": 20, + "nil%": 0 + }, + "type": { + "type/Number": { + "min": 158, + "q1": 471, + "q3": 1518, + "max": 1783, + "sd": 578.6497895509584, + "avg": 938 + } + } + } + } + ] + }, + "insights": null + } + } +] diff --git a/frontend/src/metabase/static-viz/components/ComboChart/stories-data/index.ts b/frontend/src/metabase/static-viz/components/ComboChart/stories-data/index.ts index 3074c4fbb33..4df76591944 100644 --- a/frontend/src/metabase/static-viz/components/ComboChart/stories-data/index.ts +++ b/frontend/src/metabase/static-viz/components/ComboChart/stories-data/index.ts @@ -32,6 +32,7 @@ import barStackedNormalizedEmptySpace37880 from "./bar-stacked-normalized-empty- import barStackedNormalizedSeriesLabels from "./bar-stacked-normalized-series-labels.json"; import barStackedPowYAxisNegatives from "./bar-stacked-pow-y-axis-negatives.json"; import barStackedPowYAxis from "./bar-stacked-pow-y-axis.json"; +import barStackedSeriesLabelsAndTotalsOrdinal from "./bar-stacked-series-labels-and-totals-ordinal.json"; import barStackedSeriesLabelsAndTotals from "./bar-stacked-series-labels-and-totals.json"; import barStackedSeriesLabelsAutoCompactness from "./bar-stacked-series-labels-auto-compactness.json"; import barStackedSeriesLabelsNoTotals from "./bar-stacked-series-labels-no-totals.json"; @@ -198,4 +199,5 @@ export const data = { barStackedSeriesLabelsAndTotals, barStackedSeriesLabelsNoTotals, barStackedSeriesLabelsRotated, + barStackedSeriesLabelsAndTotalsOrdinal, }; diff --git a/frontend/src/metabase/visualizations/echarts/cartesian/chart-measurements/index.ts b/frontend/src/metabase/visualizations/echarts/cartesian/chart-measurements/index.ts index 05dea24eba4..0405feeaf91 100644 --- a/frontend/src/metabase/visualizations/echarts/cartesian/chart-measurements/index.ts +++ b/frontend/src/metabase/visualizations/echarts/cartesian/chart-measurements/index.ts @@ -543,10 +543,10 @@ const countFittingLabels = ( const seriesFitCounts = chartModel.transformedDataset.reduce( (fitCounts, datum, index) => { - const originalDatumIndex = datum[ORIGINAL_INDEX_DATA_KEY ?? index]; + const datumIndex = datum[ORIGINAL_INDEX_DATA_KEY] ?? index; const value = - originalDatumIndex != null - ? chartModel.dataset[originalDatumIndex][seriesKey] + datumIndex != null + ? chartModel.dataset[datumIndex][seriesKey] : null; // Nulls and zeros should not be considered because they can't have labels -- GitLab