From 2f04f4655342de082c5d237ae28e8c3c39cce976 Mon Sep 17 00:00:00 2001 From: "Albert Y. Shih" Date: Tue, 18 Aug 2026 16:37:39 -0400 Subject: [PATCH 1/3] Skip drawing a Collection if offsets is an empty list --- lib/matplotlib/collections.py | 2 +- lib/matplotlib/tests/test_axes.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 703a77ee593a..d0452a193fa7 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -359,7 +359,7 @@ def _prepare_points(self): @artist.allow_rasterization def draw(self, renderer): - if not self.get_visible(): + if not self.get_visible() or len(self.get_offsets()) == 0: return renderer.open_group(self.__class__.__name__, self.get_gid()) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index fb3cae3474f1..5ecca195ec24 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -3217,6 +3217,24 @@ def test_scatter_singular_plural_arguments(self): facecolors=["#ffffff", "#000000", "#f0f0f0"], facecolor="#ffffff") + @pytest.mark.parametrize('edgecolor, facecolor, linestyle', + [('red', 'blue', 'solid'), + ('red', 'blue', 'dashed'), + ('red', 'none', 'solid'), + ('none', 'blue', 'solid')]) + @check_figures_equal() + def test_empty_scatter(self, fig_test, fig_ref, edgecolor, facecolor, linestyle): + # Verify that a spurious marker is not plotted in the bottom-left corner + # https://github.com/matplotlib/matplotlib/issues/32219 + ax_test = fig_test.subplots() + ax_test.scatter([], [], ec=edgecolor, fc=facecolor, ls=linestyle, clip_on=False) + ax_test.set_xlim(0, 1) + ax_test.set_ylim(0, 1) + + ax_ref = fig_ref.subplots() + ax_ref.set_xlim(0, 1) + ax_ref.set_ylim(0, 1) + def _params(c=None, xsize=2, *, edgecolors=None, **kwargs): return (c, edgecolors, kwargs, xsize) From 07cd7fc068161700592e6729471f8b7f82ea957b Mon Sep 17 00:00:00 2001 From: "Albert Y. Shih" Date: Thu, 20 Aug 2026 08:08:20 -0400 Subject: [PATCH 2/3] Still open/close the group (for SVG) for an empty Collection --- lib/matplotlib/collections.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index d0452a193fa7..3b9cc0fb6936 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -359,10 +359,15 @@ def _prepare_points(self): @artist.allow_rasterization def draw(self, renderer): - if not self.get_visible() or len(self.get_offsets()) == 0: + if not self.get_visible(): return renderer.open_group(self.__class__.__name__, self.get_gid()) + # Bail if the collection does not have any offsets (e.g., an empty scatter plot) + if len(self.get_offsets()) == 0: + renderer.close_group(self.__class__.__name__) + return + self.update_scalarmappable() transform, offset_trf, offsets, paths = self._prepare_points() From 886fc82c6268190c2b0af6d5a14cd02510fb5ef2 Mon Sep 17 00:00:00 2001 From: "Albert Y. Shih" Date: Thu, 20 Aug 2026 16:01:19 -0400 Subject: [PATCH 3/3] Update lib/matplotlib/collections.py Co-authored-by: Elliott Sales de Andrade --- lib/matplotlib/collections.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 3b9cc0fb6936..7d1a687f465d 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -366,6 +366,7 @@ def draw(self, renderer): # Bail if the collection does not have any offsets (e.g., an empty scatter plot) if len(self.get_offsets()) == 0: renderer.close_group(self.__class__.__name__) + self.stale = False return self.update_scalarmappable()