diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py
index dc7f0c433fb4..5b8c1303344a 100644
--- a/lib/matplotlib/axes/_axes.py
+++ b/lib/matplotlib/axes/_axes.py
@@ -5228,11 +5228,6 @@ def reduce_C_function(C: array) -> float
                 vmin = vmax = None
             bins = None
 
-        # autoscale the norm with current accum values if it hasn't been set
-        if norm is not None:
-            if norm.vmin is None and norm.vmax is None:
-                norm.autoscale(accum)
-
         if bins is not None:
             if not np.iterable(bins):
                 minimum, maximum = min(accum), max(accum)
@@ -5248,6 +5243,11 @@ def reduce_C_function(C: array) -> float
         collection._internal_update(kwargs)
         collection._scale_norm(norm, vmin, vmax)
 
+        # autoscale the norm with current accum values if it hasn't been set
+        if norm is not None:
+            if collection.norm.vmin is None and collection.norm.vmax is None:
+                collection.norm.autoscale()
+
         corners = ((xmin, ymin), (xmax, ymax))
         self.update_datalim(corners)
         self._request_autoscale_view(tight=True)
diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py
index deb83a26033c..59890a52477c 100644
--- a/lib/matplotlib/tests/test_axes.py
+++ b/lib/matplotlib/tests/test_axes.py
@@ -977,6 +977,15 @@ def test_hexbin_bad_extents():
         ax.hexbin(x, y, extent=(0, 1, 1, 0))
 
 
+def test_hexbin_string_norm():
+    fig, ax = plt.subplots()
+    hex = ax.hexbin(np.random.rand(10), np.random.rand(10), norm="log", vmin=2, vmax=5)
+    assert isinstance(hex, matplotlib.collections.PolyCollection)
+    assert isinstance(hex.norm, matplotlib.colors.LogNorm)
+    assert hex.norm.vmin == 2
+    assert hex.norm.vmax == 5
+
+
 @image_comparison(['hexbin_empty.png'], remove_text=True)
 def test_hexbin_empty():
     # From #3886: creating hexbin from empty dataset raises ValueError