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..9a0a63ae17ec 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1753,6 +1753,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),