The Axes.hist method doesn't handle the bottom kwarg properly when given log=True and histtype='step' or histtype='stepfilled'. As the example below shows, the method sets a minimum value to prevent issues with zeros on a log scale, but that supercedes a non-zero bottom kwarg:
importnumpyfrommatplotlibimportpyplotfig=pyplot.figure()
ax=fig.gca()
ax.hist(numpy.random.random(1000), bins=100, log=True, bottom=1e-2, histtype='stepfilled')
ax.set_ylim(1e-2, 1e3)
ax.set_title('Bottom should be 1e-2, but instead is 1/base')
I can correct the issue with the following edit:
diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py
index 4d10e86..2392a6d 100644
--- a/lib/matplotlib/axes/_axes.py+++ b/lib/matplotlib/axes/_axes.py@@ -5779,7 +5779,9 @@ class Axes(_AxesBase):
logbase = self.yaxis._scale.base
# Setting a minimum of 0 results in problems for log plots
- if normed or weights is not None:+ if np.min(bottom) > 0:+ minimum = np.min(bottom)+ elif normed or weights is not None:
# For normed data, set to log base * minimum data value
# (gives 1 full tick-label unit for the lowest filled bin)
ndata = np.array(n)
which uses the bottom value to set the minimum if it's nonzero. If this is confirmed as a bug, I can open a PR.
Activity
tacaswell commented on Jul 8, 2015
Can you please create a PR with that diff? That is the easiest way for us to review and merge the change.
test_hist_log_bottom: new test to check matplotlib#4606