diff --git a/doc/users/whats_new/cbook.rst b/doc/users/whats_new/cbook.rst new file mode 100644 index 000000000000..c5296b7cbbc0 --- /dev/null +++ b/doc/users/whats_new/cbook.rst @@ -0,0 +1,18 @@ +cbook.is_sequence_of_strings recognizes string objects +`````````````````````````````````````````````````````` + +This is primarily how pandas stores a sequence of strings. + + import pandas as pd + import matplotlib.cbook as cbook + + a = np.array(['a', 'b', 'c']) + print(cbook.is_sequence_of_strings(a)) # True + + a = np.array(['a', 'b', 'c'], dtype=object) + print(cbook.is_sequence_of_strings(a)) # True + + s = pd.Series(['a', 'b', 'c']) + print(cbook.is_sequence_of_strings(s)) # True + +Previously, the last two prints returned false. diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 33e9b876138c..de4f28b79e2a 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -783,8 +783,12 @@ def is_sequence_of_strings(obj): """ if not iterable(obj): return False - if is_string_like(obj): - return False + if is_string_like(obj) and not isinstance(obj, np.ndarray): + try: + obj = obj.values + except AttributeError: + # not pandas + return False for o in obj: if not is_string_like(o): return False diff --git a/lib/matplotlib/tests/test_cbook.py b/lib/matplotlib/tests/test_cbook.py index 0965a3d18066..a5d63bf9d759 100644 --- a/lib/matplotlib/tests/test_cbook.py +++ b/lib/matplotlib/tests/test_cbook.py @@ -26,6 +26,23 @@ def test_is_string_like(): assert cbook.is_string_like("hello world") assert_equal(cbook.is_string_like(10), False) + y = ['a', 'b', 'c'] + assert_equal(cbook.is_string_like(y), False) + + y = np.array(y) + assert_equal(cbook.is_string_like(y), False) + + y = np.array(y, dtype=object) + assert cbook.is_string_like(y) + + +def test_is_sequence_of_strings(): + y = ['a', 'b', 'c'] + assert cbook.is_sequence_of_strings(y) + + y = np.array(y, dtype=object) + assert cbook.is_sequence_of_strings(y) + def test_restrict_dict(): d = {'foo': 'bar', 1: 2}