diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 636868f876e1..9d609aa9891b 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -6573,6 +6573,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 d5df04cff226..4679ebc93949 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1754,6 +1754,29 @@ def test_hist_datetime_datasets(): ax.hist(data, stacked=False) +@pytest.mark.parametrize("bins_preprocess", + [mpl.dates.date2num, + lambda bins: bins, + lambda bins: np.asarray(bins).astype('datetime64')], + 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), + 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() + _, 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', [([], 1), ([[]], 1),