From cd3b1149cba579ee311222f0f43d74b3f6fb277b Mon Sep 17 00:00:00 2001 From: Alex Rudy Date: Sun, 29 Sep 2019 12:00:47 -0700 Subject: [PATCH 1/3] Handle xunits for bins in axes.hist --- lib/matplotlib/axes/_axes.py | 3 +++ lib/matplotlib/tests/test_axes.py | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index b2e93f8846f7..a75c6523a54d 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -6575,6 +6575,9 @@ def hist(self, x, bins=None, range=None, density=False, weights=None, if bin_range is not None: bin_range = self.convert_xunits(bin_range) + if not cbook.is_scalar_or_string(bins): + bins = self.convert_xunits(bins) + # We need to do to 'weights' what was done to 'x' if weights is not None: w = cbook._reshape_2D(weights, 'weights') diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index c952eac2191c..57a3af86e5dd 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1752,6 +1752,20 @@ def test_hist_datetime_datasets(): ax.hist(data, stacked=True) ax.hist(data, stacked=False) +@pytest.mark.parametrize("bins_preprocess", [lambda bins: None, mpl.dates.date2num, lambda bins: bins], + ids=['None', 'date2num', 'datetime.datetime']) +def test_hist_datetime_datasets_bins(bins_preprocess): + data = [[datetime.datetime(2019, 1, 5), datetime.datetime(2019, 1, 11), + datetime.datetime(2019, 2, 1), datetime.datetime(2019, 3, 1)], + [datetime.datetime(2019, 1, 11), datetime.datetime(2019, 2, 5), + datetime.datetime(2019, 2, 18), datetime.datetime(2019, 3, 1)]] + + date_edges = [datetime.datetime(2019, 1, 1), datetime.datetime(2019, 2, 1), + datetime.datetime(2019, 3, 1),] + + fig, ax = plt.subplots() + ax.hist(data, bins=bins_preprocess(date_edges), stacked=True) + ax.hist(data, bins=bins_preprocess(date_edges), stacked=False) @pytest.mark.parametrize('data, expected_number_of_hists', [([], 1), From 0e25db2cdfa8163e397c055c2d4be52c4842ddec Mon Sep 17 00:00:00 2001 From: Alex Rudy Date: Sun, 29 Sep 2019 12:10:37 -0700 Subject: [PATCH 2/3] Add datetime64 check --- lib/matplotlib/tests/test_axes.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 57a3af86e5dd..d7e9ecaf4853 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1752,21 +1752,28 @@ def test_hist_datetime_datasets(): ax.hist(data, stacked=True) ax.hist(data, stacked=False) -@pytest.mark.parametrize("bins_preprocess", [lambda bins: None, mpl.dates.date2num, lambda bins: bins], - ids=['None', 'date2num', 'datetime.datetime']) + +@pytest.mark.parametrize("bins_preprocess", + [lambda bins: None, + mpl.dates.date2num, + lambda bins: bins, + lambda bins: np.asarray(bins).astype('datetime64')], + ids=['None', 'date2num', 'datetime.datetime', + 'np.datetime64']) def test_hist_datetime_datasets_bins(bins_preprocess): - data = [[datetime.datetime(2019, 1, 5), datetime.datetime(2019, 1, 11), + data = [[datetime.datetime(2019, 1, 5), datetime.datetime(2019, 1, 11), datetime.datetime(2019, 2, 1), datetime.datetime(2019, 3, 1)], - [datetime.datetime(2019, 1, 11), datetime.datetime(2019, 2, 5), + [datetime.datetime(2019, 1, 11), datetime.datetime(2019, 2, 5), datetime.datetime(2019, 2, 18), datetime.datetime(2019, 3, 1)]] - date_edges = [datetime.datetime(2019, 1, 1), datetime.datetime(2019, 2, 1), - datetime.datetime(2019, 3, 1),] - + date_edges = [datetime.datetime(2019, 1, 1), datetime.datetime(2019, 2, 1), + datetime.datetime(2019, 3, 1)] + fig, ax = plt.subplots() ax.hist(data, bins=bins_preprocess(date_edges), stacked=True) ax.hist(data, bins=bins_preprocess(date_edges), stacked=False) + @pytest.mark.parametrize('data, expected_number_of_hists', [([], 1), ([[]], 1), From db32b26fad1c7a9592b8d9bd2e2c0fd127cd5f40 Mon Sep 17 00:00:00 2001 From: Alex Rudy Date: Tue, 1 Oct 2019 11:06:18 -0700 Subject: [PATCH 3/3] Assert that bins are correct --- lib/matplotlib/tests/test_axes.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index d7e9ecaf4853..9a0a63ae17ec 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1754,11 +1754,10 @@ def test_hist_datetime_datasets(): @pytest.mark.parametrize("bins_preprocess", - [lambda bins: None, - mpl.dates.date2num, + [mpl.dates.date2num, lambda bins: bins, lambda bins: np.asarray(bins).astype('datetime64')], - ids=['None', 'date2num', 'datetime.datetime', + ids=['date2num', 'datetime.datetime', 'np.datetime64']) def test_hist_datetime_datasets_bins(bins_preprocess): data = [[datetime.datetime(2019, 1, 5), datetime.datetime(2019, 1, 11), @@ -1770,8 +1769,11 @@ def test_hist_datetime_datasets_bins(bins_preprocess): datetime.datetime(2019, 3, 1)] fig, ax = plt.subplots() - ax.hist(data, bins=bins_preprocess(date_edges), stacked=True) - ax.hist(data, bins=bins_preprocess(date_edges), stacked=False) + _, bins, _ = ax.hist(data, bins=bins_preprocess(date_edges), stacked=True) + np.testing.assert_allclose(bins, mpl.dates.date2num(date_edges)) + + _, bins, _ = ax.hist(data, bins=bins_preprocess(date_edges), stacked=False) + np.testing.assert_allclose(bins, mpl.dates.date2num(date_edges)) @pytest.mark.parametrize('data, expected_number_of_hists',