From 0f65cde6e714475995f126a0613730bc3694f92d Mon Sep 17 00:00:00 2001
From: Ryan Laurie <30528226+iethree@users.noreply.github.com>
Date: Tue, 15 Aug 2023 16:42:29 -0600
Subject: [PATCH] Round small y-axis values to zero with no min/max difference
 on the Y scale (#33179)

* Round small values to zero with no min/max difference on the Y scale

* dont show nulls as zero
---
 frontend/src/metabase/visualizations/lib/apply_axis.js    | 8 ++++++--
 .../metabase/visualizations/lib/apply_axis.unit.spec.js   | 6 ++++++
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/frontend/src/metabase/visualizations/lib/apply_axis.js b/frontend/src/metabase/visualizations/lib/apply_axis.js
index adb76d687b9..f4344a0562c 100644
--- a/frontend/src/metabase/visualizations/lib/apply_axis.js
+++ b/frontend/src/metabase/visualizations/lib/apply_axis.js
@@ -352,7 +352,10 @@ export function applyChartOrdinalXAxis(
 // The tolerance is arbitrarily set to one millionth of the yExtent.
 const TOLERANCE_TO_Y_EXTENT = 1e6;
 export function maybeRoundValueToZero(value, [yMin, yMax]) {
-  const tolerance = Math.abs(yMax - yMin) / TOLERANCE_TO_Y_EXTENT;
+  const tolerance =
+    yMin !== yMax
+      ? Math.abs(yMax - yMin) / TOLERANCE_TO_Y_EXTENT
+      : 1 / TOLERANCE_TO_Y_EXTENT;
   return Math.abs(value) < tolerance ? 0 : value;
 }
 
@@ -490,7 +493,8 @@ export function getYValueFormatter(chart, series, yExtent) {
     const metricColumn = series[seriesIndex].data.cols[1];
     const columnSettings = chart.settings.column(metricColumn);
     const columnExtent = options.extent ?? yExtent;
-    const roundedValue = maybeRoundValueToZero(value, columnExtent);
+    const roundedValue =
+      value === null ? "" : maybeRoundValueToZero(value, columnExtent);
     return formatValue(roundedValue, { ...columnSettings, ...options });
   };
 }
diff --git a/frontend/src/metabase/visualizations/lib/apply_axis.unit.spec.js b/frontend/src/metabase/visualizations/lib/apply_axis.unit.spec.js
index 331940989e6..d07be26bba9 100644
--- a/frontend/src/metabase/visualizations/lib/apply_axis.unit.spec.js
+++ b/frontend/src/metabase/visualizations/lib/apply_axis.unit.spec.js
@@ -61,5 +61,11 @@ describe("visualization.lib.apply_axis", () => {
 
       expect(value).toBe(0.0000000000018);
     });
+
+    it("should work on single-value charts (where minExtent === maxExtent)", () => {
+      const value = maybeRoundValueToZero(0.0000000000018, [0.00001, 0.00001]);
+
+      expect(value).toBe(0);
+    });
   });
 });
-- 
GitLab