From b76263cf16ec8efb310177ab39feb518129eb35a Mon Sep 17 00:00:00 2001 From: Larry Bradley Date: Mon, 23 Sep 2013 11:20:57 -0400 Subject: [PATCH 1/8] Fixed issues with errorbar limits --- examples/statistics/errorbar_lims.py | 52 +++++++++ lib/matplotlib/axes/_axes.py | 168 ++++++++++++++------------- 2 files changed, 137 insertions(+), 83 deletions(-) create mode 100644 examples/statistics/errorbar_lims.py diff --git a/examples/statistics/errorbar_lims.py b/examples/statistics/errorbar_lims.py new file mode 100644 index 000000000000..cbf0d90c3403 --- /dev/null +++ b/examples/statistics/errorbar_lims.py @@ -0,0 +1,52 @@ +""" +Demo of the errorbar function, includig upper and lower limits +""" +import numpy as np +import matplotlib.pyplot as plt + +# example data +x = np.arange(0.5, 5.5, 0.5) +y = np.exp(-x) +xerr = 0.1 +yerr = 0.2 +ls = 'dotted' + +fig = plt.figure() +ax = fig.add_subplot(1, 1, 1) + +# standard error bars +plt.errorbar(x, y, xerr=xerr, yerr=yerr, ls=ls, color='blue') + +# including upper limits +uplims = np.zeros(x.shape) +uplims[[1, 5, 9]] = True +plt.errorbar(x, y+0.5, xerr=xerr, yerr=yerr, uplims=uplims, ls=ls, + color='green') + +# including lower limits +lolims = np.zeros(x.shape) +lolims[[2, 4, 8]] = True +plt.errorbar(x, y+1.0, xerr=xerr, yerr=yerr, lolims=lolims, ls=ls, + color='red') + +# including upper and lower limits +plt.errorbar(x, y+1.5, marker='o', ms=8, xerr=xerr, yerr=yerr, + lolims=lolims, uplims=uplims, ls=ls, color='magenta') + +# including xlower and xupper limits +xerr = 0.2 +yerr = np.zeros(x.shape) + 0.2 +yerr[[3, 6]] = 0.3 +xlolims = lolims +xuplims = uplims +lolims = np.zeros(x.shape) +uplims = np.zeros(x.shape) +lolims[[6]] = True +uplims[[3]] = True +plt.errorbar(x, y+2.1, marker='o', ms=8, xerr=xerr, yerr=yerr, + xlolims=xlolims, xuplims=xuplims, uplims=uplims, lolims=lolims, + ls='none', mec='blue', capsize=0, color='cyan') + +ax.set_xlim((0, 5.5)) +plt.show() + diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 6b8ad4549ad8..470ed87bf1ea 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2727,29 +2727,28 @@ def xywhere(xs, ys, mask): ys = [thisy for thisy, b in zip(ys, mask) if b] return xs, ys + plot_kw = {'label': '_nolegend_'} if capsize > 0: - plot_kw = { - 'ms': 2 * capsize, - 'label': '_nolegend_'} - if capthick is not None: - # 'mew' has higher priority, I believe, - # if both 'mew' and 'markeredgewidth' exists. - # So, save capthick to markeredgewidth so that - # explicitly setting mew or markeredgewidth will - # over-write capthick. - plot_kw['markeredgewidth'] = capthick - # For backwards-compat, allow explicit setting of - # 'mew' or 'markeredgewidth' to over-ride capthick. - if 'markeredgewidth' in kwargs: - plot_kw['markeredgewidth'] = kwargs['markeredgewidth'] - if 'mew' in kwargs: - plot_kw['mew'] = kwargs['mew'] - if 'transform' in kwargs: - plot_kw['transform'] = kwargs['transform'] - if 'alpha' in kwargs: - plot_kw['alpha'] = kwargs['alpha'] - if 'zorder' in kwargs: - plot_kw['zorder'] = kwargs['zorder'] + plot_kw['ms'] = 2 * capsize + if capthick is not None: + # 'mew' has higher priority, I believe, + # if both 'mew' and 'markeredgewidth' exists. + # So, save capthick to markeredgewidth so that + # explicitly setting mew or markeredgewidth will + # over-write capthick. + plot_kw['markeredgewidth'] = capthick + # For backwards-compat, allow explicit setting of + # 'mew' or 'markeredgewidth' to over-ride capthick. + if 'markeredgewidth' in kwargs: + plot_kw['markeredgewidth'] = kwargs['markeredgewidth'] + if 'mew' in kwargs: + plot_kw['mew'] = kwargs['mew'] + if 'transform' in kwargs: + plot_kw['transform'] = kwargs['transform'] + if 'alpha' in kwargs: + plot_kw['alpha'] = kwargs['alpha'] + if 'zorder' in kwargs: + plot_kw['zorder'] = kwargs['zorder'] if xerr is not None: if (iterable(xerr) and len(xerr) == 2 and @@ -2766,38 +2765,38 @@ def xywhere(xs, ys, mask): right = [thisx + thiserr for (thisx, thiserr) in cbook.safezip(x, xerr)] - yo, _ = xywhere(y, right, everymask) - lo, ro = xywhere(left, right, everymask) - barcols.append(self.hlines(yo, lo, ro, **lines_kw)) - if capsize > 0: - if xlolims.any(): - # can't use numpy logical indexing since left and - # y are lists - leftlo, ylo = xywhere(left, y, xlolims & everymask) - - caplines.extend( - self.plot(leftlo, ylo, ls='None', - marker=mlines.CARETLEFT, **plot_kw)) - xlolims = ~xlolims - leftlo, ylo = xywhere(left, y, xlolims & everymask) - caplines.extend(self.plot(leftlo, ylo, 'k|', **plot_kw)) - else: - - leftlo, ylo = xywhere(left, y, everymask) - caplines.extend(self.plot(leftlo, ylo, 'k|', **plot_kw)) - - if xuplims.any(): - - rightup, yup = xywhere(right, y, xuplims & everymask) - caplines.extend( - self.plot(rightup, yup, ls='None', - marker=mlines.CARETRIGHT, **plot_kw)) - xuplims = ~xuplims - rightup, yup = xywhere(right, y, xuplims & everymask) - caplines.extend(self.plot(rightup, yup, 'k|', **plot_kw)) - else: - rightup, yup = xywhere(right, y, everymask) - caplines.extend(self.plot(rightup, yup, 'k|', **plot_kw)) + noxlims = ~(xlolims | xuplims) + if noxlims.any(): + yo, _ = xywhere(y, right, noxlims & everymask) + lo, ro = xywhere(left, right, noxlims & everymask) + barcols.append(self.hlines(yo, lo, ro, **lines_kw)) + if capsize > 0: + caplines.extend(self.plot(lo, yo, 'k|', **plot_kw)) + caplines.extend(self.plot(ro, yo, 'k|', **plot_kw)) + + if xlolims.any(): + yo, _ = xywhere(y, right, xlolims & everymask) + lo, ro = xywhere(x, right, xlolims & everymask) + barcols.append(self.hlines(yo, lo, ro, **lines_kw)) + rightup, yup = xywhere(right, y, xlolims & everymask) + caplines.extend( + self.plot(rightup, yup, ls='None', + marker=mlines.CARETRIGHT, **plot_kw)) + if capsize > 0: + xlo, ylo = xywhere(x, y, xlolims & everymask) + caplines.extend(self.plot(xlo, ylo, 'k|', **plot_kw)) + + if xuplims.any(): + yo, _ = xywhere(y, right, xuplims & everymask) + lo, ro = xywhere(left, x, xuplims & everymask) + barcols.append(self.hlines(yo, lo, ro, **lines_kw)) + leftlo, ylo = xywhere(left, y, xuplims & everymask) + caplines.extend( + self.plot(leftlo, ylo, ls='None', + marker=mlines.CARETLEFT, **plot_kw)) + if capsize > 0: + xup, yup = xywhere(x, y, xuplims & everymask) + caplines.extend(self.plot(xup, yup, 'k|', **plot_kw)) if yerr is not None: if (iterable(yerr) and len(yerr) == 2 and @@ -2814,35 +2813,38 @@ def xywhere(xs, ys, mask): upper = [thisy + thiserr for (thisy, thiserr) in cbook.safezip(y, yerr)] - xo, _ = xywhere(x, lower, everymask) - lo, uo = xywhere(lower, upper, everymask) - barcols.append(self.vlines(xo, lo, uo, **lines_kw)) - if capsize > 0: - - if lolims.any(): - xlo, lowerlo = xywhere(x, lower, lolims & everymask) - caplines.extend( - self.plot(xlo, lowerlo, ls='None', - marker=mlines.CARETDOWN, **plot_kw)) - lolims = ~lolims - xlo, lowerlo = xywhere(x, lower, lolims & everymask) - caplines.extend(self.plot(xlo, lowerlo, 'k_', **plot_kw)) - else: - xlo, lowerlo = xywhere(x, lower, everymask) - caplines.extend(self.plot(xlo, lowerlo, 'k_', **plot_kw)) - - if uplims.any(): - xup, upperup = xywhere(x, upper, uplims & everymask) - - caplines.extend( - self.plot(xup, upperup, ls='None', - marker=mlines.CARETUP, **plot_kw)) - uplims = ~uplims - xup, upperup = xywhere(x, upper, uplims & everymask) - caplines.extend(self.plot(xup, upperup, 'k_', **plot_kw)) - else: - xup, upperup = xywhere(x, upper, everymask) - caplines.extend(self.plot(xup, upperup, 'k_', **plot_kw)) + noylims = ~(lolims | uplims) + if noylims.any(): + xo, _ = xywhere(x, lower, noylims & everymask) + lo, uo = xywhere(lower, upper, noylims & everymask) + barcols.append(self.vlines(xo, lo, uo, **lines_kw)) + if capsize > 0: + caplines.extend(self.plot(xo, lo, 'k_', **plot_kw)) + caplines.extend(self.plot(xo, uo, 'k_', **plot_kw)) + + if lolims.any(): + xo, _ = xywhere(x, lower, lolims & everymask) + lo, uo = xywhere(y, upper, lolims & everymask) + barcols.append(self.vlines(xo, lo, uo, **lines_kw)) + xup, upperup = xywhere(x, upper, lolims & everymask) + caplines.extend( + self.plot(xup, upperup, ls='None', + marker=mlines.CARETUP, **plot_kw)) + if capsize > 0: + xlo, ylo = xywhere(x, y, lolims & everymask) + caplines.extend(self.plot(xlo, ylo, 'k_', **plot_kw)) + + if uplims.any(): + xo, _ = xywhere(x, lower, uplims & everymask) + lo, uo = xywhere(lower, y, uplims & everymask) + barcols.append(self.vlines(xo, lo, uo, **lines_kw)) + xlo, lowerlo = xywhere(x, lower, uplims & everymask) + caplines.extend( + self.plot(xlo, lowerlo, ls='None', + marker=mlines.CARETDOWN, **plot_kw)) + if capsize > 0: + xup, yup = xywhere(x, y, uplims & everymask) + caplines.extend(self.plot(xup, yup, 'k_', **plot_kw)) if not barsabove and fmt is not None: l0, = self.plot(x, y, fmt, **kwargs) From 2be7e7f11cd4a48c354929daffbe87ca9812368e Mon Sep 17 00:00:00 2001 From: Larry Bradley Date: Mon, 30 Sep 2013 21:42:28 -0400 Subject: [PATCH 2/8] Condensed setting values in lines_kw and plot_kw in the errorbar function --- lib/matplotlib/axes/_axes.py | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 470ed87bf1ea..cbbe17dd60f1 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2682,16 +2682,12 @@ def errorbar(self, x, y, yerr=None, xerr=None, if elinewidth: lines_kw['linewidth'] = elinewidth else: - if 'linewidth' in kwargs: - lines_kw['linewidth'] = kwargs['linewidth'] - if 'lw' in kwargs: - lines_kw['lw'] = kwargs['lw'] - if 'transform' in kwargs: - lines_kw['transform'] = kwargs['transform'] - if 'alpha' in kwargs: - lines_kw['alpha'] = kwargs['alpha'] - if 'zorder' in kwargs: - lines_kw['zorder'] = kwargs['zorder'] + for key in ('linewidth', 'lw'): + if key in kwargs: + lines_kw[key] = kwargs[key] + for key in ('transform', 'alpha', 'zorder'): + if key in kwargs: + lines_kw[key] = kwargs[key] # arrays fine here, they are booleans and hence not units if not iterable(lolims): @@ -2739,16 +2735,9 @@ def xywhere(xs, ys, mask): plot_kw['markeredgewidth'] = capthick # For backwards-compat, allow explicit setting of # 'mew' or 'markeredgewidth' to over-ride capthick. - if 'markeredgewidth' in kwargs: - plot_kw['markeredgewidth'] = kwargs['markeredgewidth'] - if 'mew' in kwargs: - plot_kw['mew'] = kwargs['mew'] - if 'transform' in kwargs: - plot_kw['transform'] = kwargs['transform'] - if 'alpha' in kwargs: - plot_kw['alpha'] = kwargs['alpha'] - if 'zorder' in kwargs: - plot_kw['zorder'] = kwargs['zorder'] + for key in ('markeredgewidth', 'mew', 'transform', 'alpha', 'zorder'): + if key in kwargs: + plot_kw[key] = kwargs[key] if xerr is not None: if (iterable(xerr) and len(xerr) == 2 and From f5c787f18a06c760075e71a3adbfebd5e80fe81d Mon Sep 17 00:00:00 2001 From: Larry Bradley Date: Fri, 14 Feb 2014 17:26:22 -0500 Subject: [PATCH 3/8] added errorbar limit test --- .../{errorbar_lims.py => errorbar_limits.py} | 1 + .../test_axes/errorbar_limits.pdf | Bin 0 -> 39894 bytes .../test_axes/errorbar_limits.png | Bin 0 -> 37822 bytes .../test_axes/errorbar_limits.svg | 2027 +++++++++++++++++ lib/matplotlib/tests/test_axes.py | 49 + 5 files changed, 2077 insertions(+) rename examples/statistics/{errorbar_lims.py => errorbar_limits.py} (96%) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/errorbar_limits.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/errorbar_limits.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/errorbar_limits.svg diff --git a/examples/statistics/errorbar_lims.py b/examples/statistics/errorbar_limits.py similarity index 96% rename from examples/statistics/errorbar_lims.py rename to examples/statistics/errorbar_limits.py index cbf0d90c3403..7a2a8b4830f4 100644 --- a/examples/statistics/errorbar_lims.py +++ b/examples/statistics/errorbar_limits.py @@ -48,5 +48,6 @@ ls='none', mec='blue', capsize=0, color='cyan') ax.set_xlim((0, 5.5)) +ax.set_title('Errorbar upper and lower limits') plt.show() diff --git a/lib/matplotlib/tests/baseline_images/test_axes/errorbar_limits.pdf b/lib/matplotlib/tests/baseline_images/test_axes/errorbar_limits.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9393432690ffe006cfae39b33bb51de98cd6d9d2 GIT binary patch literal 39894 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 W(k~*Cw90W2*e=$sTleVaVf}xWr8YhQ literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/errorbar_limits.png b/lib/matplotlib/tests/baseline_images/test_axes/errorbar_limits.png new file mode 100644 index 0000000000000000000000000000000000000000..4029304663d3c956ad6c1076e65d0199d453d51c GIT binary patch literal 37822 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index aca809fa742b..daf4649e9162 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1504,6 +1504,55 @@ def test_errorbar(): fig.suptitle('Variable errorbars') +@image_comparison(baseline_images=['errorbar_limits']) +def test_errorbar_limits(): + x = np.arange(0.5, 5.5, 0.5) + y = np.exp(-x) + xerr = 0.1 + yerr = 0.2 + ls = 'dotted' + + fig = plt.figure() + ax = fig.add_subplot(1, 1, 1) + + # standard error bars + plt.errorbar(x, y, xerr=xerr, yerr=yerr, ls=ls, color='blue') + + # including upper limits + uplims = np.zeros(x.shape) + uplims[[1, 5, 9]] = True + plt.errorbar(x, y+0.5, xerr=xerr, yerr=yerr, uplims=uplims, ls=ls, + color='green') + + # including lower limits + lolims = np.zeros(x.shape) + lolims[[2, 4, 8]] = True + plt.errorbar(x, y+1.0, xerr=xerr, yerr=yerr, lolims=lolims, ls=ls, + color='red') + + # including upper and lower limits + plt.errorbar(x, y+1.5, marker='o', ms=8, xerr=xerr, yerr=yerr, + lolims=lolims, uplims=uplims, ls=ls, color='magenta') + + # including xlower and xupper limits + xerr = 0.2 + yerr = np.zeros(x.shape) + 0.2 + yerr[[3, 6]] = 0.3 + xlolims = lolims + xuplims = uplims + lolims = np.zeros(x.shape) + uplims = np.zeros(x.shape) + lolims[[6]] = True + uplims[[3]] = True + plt.errorbar(x, y+2.1, marker='o', ms=8, xerr=xerr, yerr=yerr, + xlolims=xlolims, xuplims=xuplims, uplims=uplims, + lolims=lolims, ls='none', mec='blue', capsize=0, + color='cyan') + ax.set_xlim((0, 5.5)) + ax.set_title('Errorbar upper and lower limits') + + +>>>>>>> added errorbar limit test @image_comparison(baseline_images=['hist_stacked_stepfilled']) def test_hist_stacked_stepfilled(): # make some data From 8039d12a631c5fb7499d47d1044f87c45c754550 Mon Sep 17 00:00:00 2001 From: Larry Bradley Date: Tue, 25 Feb 2014 13:56:02 -0500 Subject: [PATCH 4/8] added comments; fixed typo --- examples/statistics/errorbar_limits.py | 2 +- lib/matplotlib/axes/_axes.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/statistics/errorbar_limits.py b/examples/statistics/errorbar_limits.py index 7a2a8b4830f4..ae335e9deab0 100644 --- a/examples/statistics/errorbar_limits.py +++ b/examples/statistics/errorbar_limits.py @@ -1,5 +1,5 @@ """ -Demo of the errorbar function, includig upper and lower limits +Demo of the errorbar function, including upper and lower limits """ import numpy as np import matplotlib.pyplot as plt diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index cbbe17dd60f1..0b96b0abfde6 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2754,6 +2754,8 @@ def xywhere(xs, ys, mask): right = [thisx + thiserr for (thisx, thiserr) in cbook.safezip(x, xerr)] + # select points without upper/lower limits in x + # draw normal errorbars for these points noxlims = ~(xlolims | xuplims) if noxlims.any(): yo, _ = xywhere(y, right, noxlims & everymask) @@ -2802,6 +2804,8 @@ def xywhere(xs, ys, mask): upper = [thisy + thiserr for (thisy, thiserr) in cbook.safezip(y, yerr)] + # select points without upper/lower limits in y + # draw normal errorbars for these points noylims = ~(lolims | uplims) if noylims.any(): xo, _ = xywhere(x, lower, noylims & everymask) From 263b070b989de2abd9e3cbd5b0e627d114ad40b8 Mon Sep 17 00:00:00 2001 From: Larry Bradley Date: Tue, 25 Feb 2014 14:11:09 -0500 Subject: [PATCH 5/8] removed extra space; pep8 --- lib/matplotlib/axes/_axes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 0b96b0abfde6..924c4db185a9 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2725,7 +2725,7 @@ def xywhere(xs, ys, mask): plot_kw = {'label': '_nolegend_'} if capsize > 0: - plot_kw['ms'] = 2 * capsize + plot_kw['ms'] = 2. * capsize if capthick is not None: # 'mew' has higher priority, I believe, # if both 'mew' and 'markeredgewidth' exists. From 1b063023045f06111d3dd966bcf0e26defd885d9 Mon Sep 17 00:00:00 2001 From: Larry Bradley Date: Tue, 18 Mar 2014 14:25:58 -0400 Subject: [PATCH 6/8] fixes direction of arrowhead plot symbol for inverted x or y axes --- lib/matplotlib/axes/_axes.py | 40 ++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 924c4db185a9..13d3f3f26a2f 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2602,7 +2602,9 @@ def errorbar(self, x, y, yerr=None, xerr=None, These arguments can be used to indicate that a value gives only upper/lower limits. In that case a caret symbol is used to indicate this. lims-arguments may be of the same - type as *xerr* and *yerr*. + type as *xerr* and *yerr*. To use limits with inverted + axes, :meth:`set_xlim` or :meth:`set_ylim` must be called + before :meth:`errorbar`. *errorevery*: positive integer subsamples the errorbars. e.g., if everyerror=5, errorbars for @@ -2754,7 +2756,7 @@ def xywhere(xs, ys, mask): right = [thisx + thiserr for (thisx, thiserr) in cbook.safezip(x, xerr)] - # select points without upper/lower limits in x + # select points without upper/lower limits in x and # draw normal errorbars for these points noxlims = ~(xlolims | xuplims) if noxlims.any(): @@ -2770,9 +2772,13 @@ def xywhere(xs, ys, mask): lo, ro = xywhere(x, right, xlolims & everymask) barcols.append(self.hlines(yo, lo, ro, **lines_kw)) rightup, yup = xywhere(right, y, xlolims & everymask) + if self.xaxis_inverted(): + marker = mlines.CARETLEFT + else: + marker = mlines.CARETRIGHT caplines.extend( - self.plot(rightup, yup, ls='None', - marker=mlines.CARETRIGHT, **plot_kw)) + self.plot(rightup, yup, ls='None', marker=marker, + **plot_kw)) if capsize > 0: xlo, ylo = xywhere(x, y, xlolims & everymask) caplines.extend(self.plot(xlo, ylo, 'k|', **plot_kw)) @@ -2782,9 +2788,13 @@ def xywhere(xs, ys, mask): lo, ro = xywhere(left, x, xuplims & everymask) barcols.append(self.hlines(yo, lo, ro, **lines_kw)) leftlo, ylo = xywhere(left, y, xuplims & everymask) + if self.xaxis_inverted(): + marker = mlines.CARETRIGHT + else: + marker = mlines.CARETLEFT caplines.extend( - self.plot(leftlo, ylo, ls='None', - marker=mlines.CARETLEFT, **plot_kw)) + self.plot(leftlo, ylo, ls='None', marker=marker, + **plot_kw)) if capsize > 0: xup, yup = xywhere(x, y, xuplims & everymask) caplines.extend(self.plot(xup, yup, 'k|', **plot_kw)) @@ -2804,7 +2814,7 @@ def xywhere(xs, ys, mask): upper = [thisy + thiserr for (thisy, thiserr) in cbook.safezip(y, yerr)] - # select points without upper/lower limits in y + # select points without upper/lower limits in y and # draw normal errorbars for these points noylims = ~(lolims | uplims) if noylims.any(): @@ -2820,9 +2830,13 @@ def xywhere(xs, ys, mask): lo, uo = xywhere(y, upper, lolims & everymask) barcols.append(self.vlines(xo, lo, uo, **lines_kw)) xup, upperup = xywhere(x, upper, lolims & everymask) + if self.yaxis_inverted(): + marker = mlines.CARETDOWN + else: + marker = mlines.CARETUP caplines.extend( - self.plot(xup, upperup, ls='None', - marker=mlines.CARETUP, **plot_kw)) + self.plot(xup, upperup, ls='None', marker=marker, + **plot_kw)) if capsize > 0: xlo, ylo = xywhere(x, y, lolims & everymask) caplines.extend(self.plot(xlo, ylo, 'k_', **plot_kw)) @@ -2832,9 +2846,13 @@ def xywhere(xs, ys, mask): lo, uo = xywhere(lower, y, uplims & everymask) barcols.append(self.vlines(xo, lo, uo, **lines_kw)) xlo, lowerlo = xywhere(x, lower, uplims & everymask) + if self.yaxis_inverted(): + marker = mlines.CARETUP + else: + marker = mlines.CARETDOWN caplines.extend( - self.plot(xlo, lowerlo, ls='None', - marker=mlines.CARETDOWN, **plot_kw)) + self.plot(xlo, lowerlo, ls='None', marker=marker, + **plot_kw)) if capsize > 0: xup, yup = xywhere(x, y, uplims & everymask) caplines.extend(self.plot(xup, yup, 'k_', **plot_kw)) From af6a89b761cf22ef505ee35be0da768c55bca105 Mon Sep 17 00:00:00 2001 From: Larry Bradley Date: Tue, 18 Mar 2014 14:26:18 -0400 Subject: [PATCH 7/8] updated api_changes and whats_new --- doc/api/api_changes.rst | 4 ++++ doc/users/whats_new.rst | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/doc/api/api_changes.rst b/doc/api/api_changes.rst index dce5a356694f..03bd2bf1c98f 100644 --- a/doc/api/api_changes.rst +++ b/doc/api/api_changes.rst @@ -47,6 +47,10 @@ original location: - mstream -> `from matplotlib import stream as mstream` - mtable -> `from matplotlib import table as mtable` +* The :func:`~matplotlib.pyplot.errorbar` method has been changed such that + the upper and lower limits (*lolims*, *uplims*, *xlolims*, *xuplims*) now + point in the correct direction. + * The Sphinx extensions `ipython_directive` and `ipython_console_highlighting` have been moved to the IPython project itself. While they remain in matplotlib for this release, diff --git a/doc/users/whats_new.rst b/doc/users/whats_new.rst index 341ac381c617..068b8e34d6bf 100644 --- a/doc/users/whats_new.rst +++ b/doc/users/whats_new.rst @@ -139,6 +139,11 @@ specify wedgeprops = {'linewidth':3} to specify the width of the borders of the wedges in the pie. For more properties that the user can specify, look at the docs for the wedge and text objects. +Fixed the direction of errorbar upper/lower limits +`````````````````````````````````````````````````` +Larry Bradley fixed the :func:`~matplotlib.pyplot.errorbar` method such +that the upper and lower limits (*lolims*, *uplims*, *xlolims*, +*xuplims*) now point in the correct direction. Date handling ------------- From 7cc983d14e0b8969ade31ba8c2dfd0d16895526b Mon Sep 17 00:00:00 2001 From: Larry Bradley Date: Wed, 26 Mar 2014 09:05:19 -0400 Subject: [PATCH 8/8] removed rebase marker in test_axes --- lib/matplotlib/tests/test_axes.py | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index daf4649e9162..2d52aaa22548 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1552,7 +1552,6 @@ def test_errorbar_limits(): ax.set_title('Errorbar upper and lower limits') ->>>>>>> added errorbar limit test @image_comparison(baseline_images=['hist_stacked_stepfilled']) def test_hist_stacked_stepfilled(): # make some data