From 38a17d681a16a8499694a26854971ca24df13f49 Mon Sep 17 00:00:00 2001 From: Augusto Borges Date: Thu, 5 Oct 2023 20:34:31 +0200 Subject: [PATCH] Warning issued if handles and labels have a len mismatch when __len__ exists for both New check for the no len case. Now artists are stored --- lib/matplotlib/legend.py | 6 ++++++ lib/matplotlib/tests/test_legend.py | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/matplotlib/legend.py b/lib/matplotlib/legend.py index 14249cb73442..58e5dfcfe3b8 100644 --- a/lib/matplotlib/legend.py +++ b/lib/matplotlib/legend.py @@ -1337,6 +1337,12 @@ def _parse_legend_args(axs, *args, handles=None, labels=None, **kwargs): _api.warn_external("You have mixed positional and keyword arguments, " "some input may be discarded.") + if (hasattr(handles, "__len__") and + hasattr(labels, "__len__") and + len(handles) != len(labels)): + _api.warn_external(f"Mismatched number of handles and labels: " + f"len(handles) = {len(handles)} " + f"len(labels) = {len(labels)}") # if got both handles and labels as kwargs, make same length if handles and labels: handles, labels = zip(*zip(handles, labels)) diff --git a/lib/matplotlib/tests/test_legend.py b/lib/matplotlib/tests/test_legend.py index 1549354ba56b..3a35b4051c71 100644 --- a/lib/matplotlib/tests/test_legend.py +++ b/lib/matplotlib/tests/test_legend.py @@ -1357,3 +1357,21 @@ def test_loc_validation_string_value(): ax.legend(loc='upper center') with pytest.raises(ValueError, match="'wrong' is not a valid value for"): ax.legend(loc='wrong') + + +def test_legend_handle_label_mismatch(): + pl1, = plt.plot(range(10)) + pl2, = plt.plot(range(10)) + with pytest.warns(UserWarning, match="number of handles and labels"): + legend = plt.legend(handles=[pl1, pl2], labels=["pl1", "pl2", "pl3"]) + assert len(legend.legend_handles) == 2 + assert len(legend.get_texts()) == 2 + + +def test_legend_handle_label_mismatch_no_len(): + pl1, = plt.plot(range(10)) + pl2, = plt.plot(range(10)) + legend = plt.legend(handles=iter([pl1, pl2]), + labels=iter(["pl1", "pl2", "pl3"])) + assert len(legend.legend_handles) == 2 + assert len(legend.get_texts()) == 2