From 66cbdf60046f6f1b6911988dce1073f33361181a Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Tue, 3 Jan 2017 17:05:05 +0100 Subject: [PATCH 01/35] add minimal errorbar3d method to Axes3D --- lib/mpl_toolkits/mplot3d/axes3d.py | 106 +++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index cfd645c880a3..be97ba20ba29 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2770,6 +2770,112 @@ def permutation_matrices(n): return polygons + def errorbar3d(self, x, y, z, zerr=None, yerr=None, xerr=None, + ecolor=None, + # FIXME: doesn't work + elinewidth=None, + + # TODO: sneak these in + #capsize=None, fmt='', + #barsabove=False, lolims=False, uplims=False, + #xlolims=False, xuplims=False, errorevery=1, capthick=None, + + **kwargs): + # TODO: minimal example + # TODO: double-check the docstring + """ + Draws error bars on an Axis3D instance. + + Parameters + ---------- + x : scalar + y : scalar + z : scalar + + xerr/yerr/zerr : scalar or array-like, shape(n,1) or shape(2,n). + If a scalar number, len(N) array-like object, or an Nx1 + array-like object, errorbars are drawn at +/-value relative + to the data. Default is None. + + If a sequence of shape 2xN, errorbars are drawn at -row1 + and +row2 relative to the data. + + ecolor : mpl color, optional, default: None + A matplotlib color arg which gives the color the errorbar lines; + if None, use the color of the line connecting the markers. + + elinewidth : scalar, optional, default: None + The linewidth of the errorbar lines. If None, use the linewidth. + + Keyword arguments are passed to + :func:`~mpl_toolkits.mplot3d.art3d.Line3DCollection` + """ + had_data = self.has_data() + + if not cbook.iterable(x): + x = [x] + if not cbook.iterable(y): + y = [y] + if not cbook.iterable(z): + z = [z] + + ecolors = [] + if ecolor is None: + ecolor = [self._get_patches_for_fill.get_next_color()] + + # FIXME: doesn't work + if len(ecolor) == len(x): + for c in ecolor: + ecolors.extend([c] * 6) + else: + # a single color specified, or face colors specified explicitly + ecolors = list(mcolors.to_rgba_array(ecolor)) + if len(ecolors) < len(x): + ecolors *= (6 * len(x)) + + # FIXME: doesn't work + elinewidth = kwargs.get('elinewidth', None) + + def unpack_errs(data, err): + lefts = [coord - dcoord for coord, dcoord in zip(data, err)] + rights = [coord + dcoord for coord, dcoord in zip(data, err)] + return lefts, rights + + lines, coorderrs = [], [] + for data, err, shift in zip([x, y, z], + [xerr, yerr, zerr], + range(3)): + if err is None: + continue + + if not cbook.iterable(err): + err = [err] * len(data) + + # TODO: placeholder for future work on limits functionality + nolims = np.ones_like(err, dtype=bool) + + if nolims.any(): + rolling_mask=np.roll([1.,0.,0.], shift) + if err is not None: + err = np.atleast_1d(err) + coorderr = [unpack_errs(coord, err*rolling_mask[i]) + for i, coord in enumerate([x, y, z])] + line = art3d.Line3DCollection(segments=np.array(coorderr).T, + linewidths=elinewidth, + colors=ecolors, **kwargs) + self.add_collection(line) + lines.append(line) + coorderrs.append(coorderr) + + coorderrs = np.array(coorderrs) + minx, maxx = (coorderrs[:,0,:,:].min(), coorderrs[:,1,:,:].max()) + miny, maxy = (coorderrs[:,1,:,:].min(), coorderrs[:,1,:,:].max()) + minz, maxz = (coorderrs[:,2,:,:].min(), coorderrs[:,2,:,:].max()) + self.auto_scale_xyz((minx, maxx), (miny, maxy), (minz, maxz), had_data) + + # TODO: return one list instead of three maybe? + return lines + docstring.interpd.update(Axes3D=artist.kwdoc(Axes3D)) docstring.dedent_interpd(Axes3D.__init__) From d8e4d578f001cbea2990cf3ed49a42bee86370d4 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Tue, 3 Jan 2017 17:26:04 +0100 Subject: [PATCH 02/35] for now it's wiser to rely on LineCollection styling --- lib/mpl_toolkits/mplot3d/axes3d.py | 32 +----------------------------- 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index be97ba20ba29..7c847c4707b6 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2771,17 +2771,12 @@ def permutation_matrices(n): return polygons def errorbar3d(self, x, y, z, zerr=None, yerr=None, xerr=None, - ecolor=None, - # FIXME: doesn't work - elinewidth=None, - # TODO: sneak these in #capsize=None, fmt='', #barsabove=False, lolims=False, uplims=False, #xlolims=False, xuplims=False, errorevery=1, capthick=None, **kwargs): - # TODO: minimal example # TODO: double-check the docstring """ Draws error bars on an Axis3D instance. @@ -2800,13 +2795,6 @@ def errorbar3d(self, x, y, z, zerr=None, yerr=None, xerr=None, If a sequence of shape 2xN, errorbars are drawn at -row1 and +row2 relative to the data. - ecolor : mpl color, optional, default: None - A matplotlib color arg which gives the color the errorbar lines; - if None, use the color of the line connecting the markers. - - elinewidth : scalar, optional, default: None - The linewidth of the errorbar lines. If None, use the linewidth. - Keyword arguments are passed to :func:`~mpl_toolkits.mplot3d.art3d.Line3DCollection` """ @@ -2819,23 +2807,6 @@ def errorbar3d(self, x, y, z, zerr=None, yerr=None, xerr=None, if not cbook.iterable(z): z = [z] - ecolors = [] - if ecolor is None: - ecolor = [self._get_patches_for_fill.get_next_color()] - - # FIXME: doesn't work - if len(ecolor) == len(x): - for c in ecolor: - ecolors.extend([c] * 6) - else: - # a single color specified, or face colors specified explicitly - ecolors = list(mcolors.to_rgba_array(ecolor)) - if len(ecolors) < len(x): - ecolors *= (6 * len(x)) - - # FIXME: doesn't work - elinewidth = kwargs.get('elinewidth', None) - def unpack_errs(data, err): lefts = [coord - dcoord for coord, dcoord in zip(data, err)] rights = [coord + dcoord for coord, dcoord in zip(data, err)] @@ -2861,8 +2832,7 @@ def unpack_errs(data, err): coorderr = [unpack_errs(coord, err*rolling_mask[i]) for i, coord in enumerate([x, y, z])] line = art3d.Line3DCollection(segments=np.array(coorderr).T, - linewidths=elinewidth, - colors=ecolors, **kwargs) + **kwargs) self.add_collection(line) lines.append(line) coorderrs.append(coorderr) From 2d32dfe9f7f4ac572ac335066d309a56fb1090d2 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Tue, 3 Jan 2017 17:32:25 +0100 Subject: [PATCH 03/35] type in autorange --- lib/mpl_toolkits/mplot3d/axes3d.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 7c847c4707b6..6043ffd4c100 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2838,7 +2838,7 @@ def unpack_errs(data, err): coorderrs.append(coorderr) coorderrs = np.array(coorderrs) - minx, maxx = (coorderrs[:,0,:,:].min(), coorderrs[:,1,:,:].max()) + minx, maxx = (coorderrs[:,0,:,:].min(), coorderrs[:,0,:,:].max()) miny, maxy = (coorderrs[:,1,:,:].min(), coorderrs[:,1,:,:].max()) minz, maxz = (coorderrs[:,2,:,:].min(), coorderrs[:,2,:,:].max()) self.auto_scale_xyz((minx, maxx), (miny, maxy), (minz, maxz), had_data) From 8e661932e6951a889a509e08729d8534df819fd8 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Wed, 4 Jan 2017 13:51:59 +0100 Subject: [PATCH 04/35] fix for auto-scaling NaN values --- lib/mpl_toolkits/mplot3d/axes3d.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 6043ffd4c100..59ab931ff445 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2807,6 +2807,7 @@ def errorbar3d(self, x, y, z, zerr=None, yerr=None, xerr=None, if not cbook.iterable(z): z = [z] + # TODO: currently, only a scalar number or len(N) objects are ok... def unpack_errs(data, err): lefts = [coord - dcoord for coord, dcoord in zip(data, err)] rights = [coord + dcoord for coord, dcoord in zip(data, err)] @@ -2825,6 +2826,11 @@ def unpack_errs(data, err): # TODO: placeholder for future work on limits functionality nolims = np.ones_like(err, dtype=bool) + # NOTE: care needs to be taken here - using numpy is fine, + # as long as the actual data plotted stays as lists. + # This is due to unit preservation issues + # (c.f. 2d errorbar case). + # FIXME: the above NOTE is violated below... if nolims.any(): rolling_mask=np.roll([1.,0.,0.], shift) if err is not None: @@ -2838,9 +2844,15 @@ def unpack_errs(data, err): coorderrs.append(coorderr) coorderrs = np.array(coorderrs) - minx, maxx = (coorderrs[:,0,:,:].min(), coorderrs[:,0,:,:].max()) - miny, maxy = (coorderrs[:,1,:,:].min(), coorderrs[:,1,:,:].max()) - minz, maxz = (coorderrs[:,2,:,:].min(), coorderrs[:,2,:,:].max()) + def digout_minmax(err_arr, coord_label): + """ For brevity """ + key = {'x': 0, 'y': 1, 'z': 2} + return (np.nanmin(err_arr[:, key[coord_label], :, :]), + np.nanmax(err_arr[:, key[coord_label], :, :]) ) + + minx, maxx = digout_minmax(coorderrs, 'x') + miny, maxy = digout_minmax(coorderrs, 'y') + minz, maxz = digout_minmax(coorderrs, 'z') self.auto_scale_xyz((minx, maxx), (miny, maxy), (minz, maxz), had_data) # TODO: return one list instead of three maybe? From d3779428cbf2c93925065434349ba2cce8fda9f1 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Thu, 5 Jan 2017 17:25:06 +0100 Subject: [PATCH 05/35] add caplines --- lib/mpl_toolkits/mplot3d/axes3d.py | 156 +++++++++++++++++++++++------ 1 file changed, 124 insertions(+), 32 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 59ab931ff445..545c7459e1c5 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2772,11 +2772,18 @@ def permutation_matrices(n): def errorbar3d(self, x, y, z, zerr=None, yerr=None, xerr=None, # TODO: sneak these in - #capsize=None, fmt='', - #barsabove=False, lolims=False, uplims=False, - #xlolims=False, xuplims=False, errorevery=1, capthick=None, + #fmt='', + #barsabove=False, + + errorevery=1, + capsize=None, capthick=None, + xlolims=False, xuplims=False, + ylolims=False, yuplims=False, + zlolims=False, zuplims=False, **kwargs): + # TODO: write up a jupyter notebook using this as a template: + # http://matplotlib.org/examples/pylab_examples/errorbar_limits.html # TODO: double-check the docstring """ Draws error bars on an Axis3D instance. @@ -2795,6 +2802,25 @@ def errorbar3d(self, x, y, z, zerr=None, yerr=None, xerr=None, If a sequence of shape 2xN, errorbars are drawn at -row1 and +row2 relative to the data. + capsize : scalar, optional, default: None + The length of the error bar caps in points; if None, it will + take the value from ``errorbar.capsize`` + :data:`rcParam`. + + capthick : scalar, optional, default: None + An alias kwarg to markeredgewidth (a.k.a. - mew). This + setting is a more sensible name for the property that + controls the thickness of the error bar cap in points. For + backwards compatibility, if mew or markeredgewidth are given, + then they will over-ride capthick. This may change in future + releases. + + errorevery : positive integer, optional, default:1 + subsamples the errorbars. e.g., if errorevery=5, errorbars for + every 5-th datapoint will be plotted. The data plot itself still + shows all data points. + + Keyword arguments are passed to :func:`~mpl_toolkits.mplot3d.art3d.Line3DCollection` """ @@ -2807,56 +2833,122 @@ def errorbar3d(self, x, y, z, zerr=None, yerr=None, xerr=None, if not cbook.iterable(z): z = [z] + everymask = np.arange(len(x)) % errorevery == 0 + + # TODO: fully adhere to the styling rules in 2d-errorbar later on... + eb_cap_style = {} + if capsize is None: + capsize = kwargs.pop('capsize', rcParams["errorbar.capsize"]) + if capsize > 0: + eb_cap_style['markersize'] = 2. * capsize + if capthick is not None: + eb_cap_style['markeredgewidth'] = capthick + + def _bool_asarray_helper(d, expected): + if not cbook.iterable(d): + return np.asarray([d] * expected, bool) + else: + return np.asarray(d, bool) + + def _mask_lists(xs, ys, zs, mask=None): + """ Applies a mask to three lists. """ + xs = [l for l, m in zip(xs, mask) if m] + ys = [l for l, m in zip(ys, mask) if m] + zs = [l for l, m in zip(zs, mask) if m] + return xs, ys, zs + + def _debug_floatlists(*args): + for l in args: + s = ("["+', '.join(['%.2f']*len(l))+"]") % tuple(l) + print(s) + print('\n') + # TODO: currently, only a scalar number or len(N) objects are ok... - def unpack_errs(data, err): - lefts = [coord - dcoord for coord, dcoord in zip(data, err)] - rights = [coord + dcoord for coord, dcoord in zip(data, err)] - return lefts, rights - - lines, coorderrs = [], [] - for data, err, shift in zip([x, y, z], - [xerr, yerr, zerr], - range(3)): + def _unpack_errs(data, err, lomask, himask): + lows = [d - e if m else d for d, e, m in zip(data, err, lomask)] + highs = [d + e if m else d for d, e, m in zip(data, err, himask)] + return lows, highs + + # TODO: things to init are barcaps and low-, high-limits + errlines, caplines = [], [] + coorderrs = [] # list of endpoint coordinates, used for auto-scaling + + for data, err, shift, lolims, uplims in zip([x, y, z], + [xerr, yerr, zerr], range(3), + [xlolims, ylolims, zlolims], + [xuplims, yuplims, zuplims]): if err is None: continue if not cbook.iterable(err): err = [err] * len(data) + lolims = _bool_asarray_helper(lolims, len(x)) + uplims = _bool_asarray_helper(uplims, len(x)) - # TODO: placeholder for future work on limits functionality - nolims = np.ones_like(err, dtype=bool) + nolims = ~(lolims | uplims) # NOTE: care needs to be taken here - using numpy is fine, # as long as the actual data plotted stays as lists. # This is due to unit preservation issues - # (c.f. 2d errorbar case). - # FIXME: the above NOTE is violated below... + # (c.f. the 2d errorbar case). + rolling_mask = np.roll([1.,0.,0.], shift) + # TODO: why is this here? + if err is not None: + err = np.atleast_1d(err) + + # a nested list structure that expands to (xl,xh),(yl,yh),(zl,zh), + # where x/y/z and l/h correspond to dimensions and low/high + # positions of errorbars in a dimension we're looping over + coorderr = [_unpack_errs(coord, err*rolling_mask[i], ~lolims, + ~uplims) for i, coord in enumerate([x, y, z])] + if nolims.any(): - rolling_mask=np.roll([1.,0.,0.], shift) - if err is not None: - err = np.atleast_1d(err) - coorderr = [unpack_errs(coord, err*rolling_mask[i]) - for i, coord in enumerate([x, y, z])] - line = art3d.Line3DCollection(segments=np.array(coorderr).T, - **kwargs) - self.add_collection(line) - lines.append(line) - coorderrs.append(coorderr) + if capsize > 0: + (xl, xh), (yl, yh), (zl, zh) = coorderr + lo_caps_xyz = _mask_lists(xl, yl, zl, nolims & everymask) + hi_caps_xyz = _mask_lists(xh, yh, zh, nolims & everymask) + #_debug_floatlists(*lo_caps_xyz) + #_debug_floatlists(*hi_caps_xyz) + + # NOTE on the caps in 3D plots: + # Using markers in interactive 3D plots is confusing to + # say the least, as the cap lines don't stay aligned with + # the coordinate axes! + # Nevertheless, let's stick to it for now for consistency. + # Setting '_' for z-caps and '|' for x- and y-caps: + capmarker = {0: '|', 1: '|', 2: '_'} + cap_lo = art3d.Line3D(*lo_caps_xyz, ls='', + marker=capmarker[shift], + **eb_cap_style) + cap_hi = art3d.Line3D(*hi_caps_xyz, ls='', + marker=capmarker[shift], + **eb_cap_style) + self.add_line(cap_lo) + self.add_line(cap_hi) + caplines.append(cap_lo) + caplines.append(cap_hi) + + errline = art3d.Line3DCollection(np.array(coorderr).T, **kwargs) + self.add_collection(errline) + errlines.append(errline) + coorderrs.append(coorderr) coorderrs = np.array(coorderrs) - def digout_minmax(err_arr, coord_label): - """ For brevity """ + def _digout_minmax(err_arr, coord_label): key = {'x': 0, 'y': 1, 'z': 2} return (np.nanmin(err_arr[:, key[coord_label], :, :]), np.nanmax(err_arr[:, key[coord_label], :, :]) ) - minx, maxx = digout_minmax(coorderrs, 'x') - miny, maxy = digout_minmax(coorderrs, 'y') - minz, maxz = digout_minmax(coorderrs, 'z') + minx, maxx = _digout_minmax(coorderrs, 'x') + miny, maxy = _digout_minmax(coorderrs, 'y') + minz, maxz = _digout_minmax(coorderrs, 'z') self.auto_scale_xyz((minx, maxx), (miny, maxy), (minz, maxz), had_data) # TODO: return one list instead of three maybe? - return lines + # TODO: make a container of sorts? There's going to be a whole bunch + # of artist objects bundled together here, with all the lines, + # caps, and upper/lower limit arrow indicators... + return errlines docstring.interpd.update(Axes3D=artist.kwdoc(Axes3D)) From 9b1de1fcab3c02d6f3e49ee0bb932ce8535752fd Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Thu, 5 Jan 2017 17:46:22 +0100 Subject: [PATCH 06/35] add barsabove option; refactor plotting kwargs --- lib/mpl_toolkits/mplot3d/axes3d.py | 51 ++++++++++++++++++------------ 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 545c7459e1c5..b37ee8617526 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2770,21 +2770,19 @@ def permutation_matrices(n): return polygons - def errorbar3d(self, x, y, z, zerr=None, yerr=None, xerr=None, - # TODO: sneak these in - #fmt='', - #barsabove=False, - - errorevery=1, - capsize=None, capthick=None, - xlolims=False, xuplims=False, - ylolims=False, yuplims=False, - zlolims=False, zuplims=False, - - **kwargs): - # TODO: write up a jupyter notebook using this as a template: + # NOTE: is it ok to redefine Axes.errorbar method? + # some methods seem to append '3d' to the end instead? + def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, + # TODO: sneak this kwarg in: + #fmt='', + barsabove=False, errorevery=1, + capsize=None, capthick=None, xlolims=False, xuplims=False, + ylolims=False, yuplims=False, zlolims=False, zuplims=False, + **kwargs): + # TODO: write up a proof of concept analogous to this one here: # http://matplotlib.org/examples/pylab_examples/errorbar_limits.html - # TODO: double-check the docstring + # TODO: triple-check the docstring: some data forms are probably not + # going to work despite being allowed in the docstring :C """ Draws error bars on an Axis3D instance. @@ -2815,13 +2813,16 @@ def errorbar3d(self, x, y, z, zerr=None, yerr=None, xerr=None, then they will over-ride capthick. This may change in future releases. + barsabove : bool, optional, default: False + if True , will plot the errorbars above the plot + symbols. Default is below. + errorevery : positive integer, optional, default:1 subsamples the errorbars. e.g., if errorevery=5, errorbars for every 5-th datapoint will be plotted. The data plot itself still shows all data points. - - Keyword arguments are passed to + Additional keyword arguments for styling errorbar lines are passed to :func:`~mpl_toolkits.mplot3d.art3d.Line3DCollection` """ had_data = self.has_data() @@ -2836,6 +2837,13 @@ def errorbar3d(self, x, y, z, zerr=None, yerr=None, xerr=None, everymask = np.arange(len(x)) % errorevery == 0 # TODO: fully adhere to the styling rules in 2d-errorbar later on... + plot_line_style = {} + plot_line_style.update(**kwargs) + if barsabove: + plot_line_style['zorder'] = kwargs['zorder'] - .1 + else: + plot_line_style['zorder'] = kwargs['zorder'] + .1 + eb_cap_style = {} if capsize is None: capsize = kwargs.pop('capsize', rcParams["errorbar.capsize"]) @@ -2873,7 +2881,7 @@ def _unpack_errs(data, err, lomask, himask): errlines, caplines = [], [] coorderrs = [] # list of endpoint coordinates, used for auto-scaling - for data, err, shift, lolims, uplims in zip([x, y, z], + for data, err, i_xyz, lolims, uplims in zip([x, y, z], [xerr, yerr, zerr], range(3), [xlolims, ylolims, zlolims], [xuplims, yuplims, zuplims]): @@ -2891,7 +2899,7 @@ def _unpack_errs(data, err, lomask, himask): # as long as the actual data plotted stays as lists. # This is due to unit preservation issues # (c.f. the 2d errorbar case). - rolling_mask = np.roll([1.,0.,0.], shift) + rolling_mask = np.roll([1.,0.,0.], i_xyz) # TODO: why is this here? if err is not None: err = np.atleast_1d(err) @@ -2918,17 +2926,18 @@ def _unpack_errs(data, err, lomask, himask): # Setting '_' for z-caps and '|' for x- and y-caps: capmarker = {0: '|', 1: '|', 2: '_'} cap_lo = art3d.Line3D(*lo_caps_xyz, ls='', - marker=capmarker[shift], + marker=capmarker[i_xyz], **eb_cap_style) cap_hi = art3d.Line3D(*hi_caps_xyz, ls='', - marker=capmarker[shift], + marker=capmarker[i_xyz], **eb_cap_style) self.add_line(cap_lo) self.add_line(cap_hi) caplines.append(cap_lo) caplines.append(cap_hi) - errline = art3d.Line3DCollection(np.array(coorderr).T, **kwargs) + errline = art3d.Line3DCollection(np.array(coorderr).T, + **plot_line_style) self.add_collection(errline) errlines.append(errline) coorderrs.append(coorderr) From c7fc68a76d4356425e98b82a234eeec078a06cb3 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Thu, 5 Jan 2017 17:59:19 +0100 Subject: [PATCH 07/35] fix for missing zorder in kwargs --- lib/mpl_toolkits/mplot3d/axes3d.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index b37ee8617526..08c9eb5c1794 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2839,6 +2839,8 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, # TODO: fully adhere to the styling rules in 2d-errorbar later on... plot_line_style = {} plot_line_style.update(**kwargs) + if 'zorder' not in kwargs.keys(): + kwargs['zorder'] = 2 if barsabove: plot_line_style['zorder'] = kwargs['zorder'] - .1 else: From ef5699cd10e7ed0afa9cb395ed3078bc9ee99c35 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Mon, 6 Feb 2017 14:11:54 +0100 Subject: [PATCH 08/35] add upper/lower limits --- lib/mpl_toolkits/mplot3d/axes3d.py | 50 +++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 08c9eb5c1794..91395373a1e2 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2770,7 +2770,7 @@ def permutation_matrices(n): return polygons - # NOTE: is it ok to redefine Axes.errorbar method? + # TODO: is it ok to redefine Axes.errorbar method? # some methods seem to append '3d' to the end instead? def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, # TODO: sneak this kwarg in: @@ -2778,6 +2778,7 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, barsabove=False, errorevery=1, capsize=None, capthick=None, xlolims=False, xuplims=False, ylolims=False, yuplims=False, zlolims=False, zuplims=False, + debug_kwargs = {}, **kwargs): # TODO: write up a proof of concept analogous to this one here: # http://matplotlib.org/examples/pylab_examples/errorbar_limits.html @@ -2867,7 +2868,16 @@ def _mask_lists(xs, ys, zs, mask=None): zs = [l for l, m in zip(zs, mask) if m] return xs, ys, zs - def _debug_floatlists(*args): + def _debug_floatlists(*args, **kwargs): + if 'crash' in kwargs: + crash = kwargs.pop('crash') + if crash: + raise RuntimeError('you asked for it!') + if 'set_trace' in kwargs: + set_trace = kwargs.pop('set_trace') + if set_trace: + import pdb + pdb.set_trace() for l in args: s = ("["+', '.join(['%.2f']*len(l))+"]") % tuple(l) print(s) @@ -2911,10 +2921,21 @@ def _unpack_errs(data, err, lomask, himask): # positions of errorbars in a dimension we're looping over coorderr = [_unpack_errs(coord, err*rolling_mask[i], ~lolims, ~uplims) for i, coord in enumerate([x, y, z])] + (xl, xh), (yl, yh), (zl, zh) = coorderr + + # define the markers used for errorbar caps and limits below + # the dicitonary key is the current ticking value of `i_xyz` + capmarker = {0: '|', 1: '|', 2: '_'} + limmarker = {0: {'lower': art3d.lines.CARETRIGHT, + 'upper': art3d.lines.CARETLEFT}, + 1: {'lower': art3d.lines.CARETRIGHT, + 'upper': art3d.lines.CARETLEFT}, + 2: {'lower': art3d.lines.CARETUP, + 'upper': art3d.lines.CARETDOWN}, + } if nolims.any(): if capsize > 0: - (xl, xh), (yl, yh), (zl, zh) = coorderr lo_caps_xyz = _mask_lists(xl, yl, zl, nolims & everymask) hi_caps_xyz = _mask_lists(xh, yh, zh, nolims & everymask) #_debug_floatlists(*lo_caps_xyz) @@ -2926,7 +2947,6 @@ def _unpack_errs(data, err, lomask, himask): # the coordinate axes! # Nevertheless, let's stick to it for now for consistency. # Setting '_' for z-caps and '|' for x- and y-caps: - capmarker = {0: '|', 1: '|', 2: '_'} cap_lo = art3d.Line3D(*lo_caps_xyz, ls='', marker=capmarker[i_xyz], **eb_cap_style) @@ -2938,6 +2958,28 @@ def _unpack_errs(data, err, lomask, himask): caplines.append(cap_lo) caplines.append(cap_hi) + if (lolims | uplims).any(): + # FIXME: using markers for limits isn't the best idea: for + # example, 180 deg rotation around z-axis would flip + # the markers around... However, this solution is + # spiritually close to that of 2d errorbar function + limits = [_unpack_errs(coord, err*rolling_mask[i], uplims, + lolims) for i, coord in enumerate([x, y, z])] + (xlo, xup), (ylo, yup), (zlo, zup) = limits + + lolims_xyz = _mask_lists(xup, yup, zup, lolims & everymask) + uplims_xyz = _mask_lists(xlo, ylo, zlo, uplims & everymask) + _debug_floatlists(*lolims_xyz, **debug_kwargs) + + lims_lo = art3d.Line3D(*lolims_xyz, ls='', + marker=limmarker[i_xyz]['lower'], + **eb_cap_style) + lims_up = art3d.Line3D(*uplims_xyz, ls='', + marker=limmarker[i_xyz]['upper'], + **eb_cap_style) + self.add_line(lims_lo) + self.add_line(lims_up) + errline = art3d.Line3DCollection(np.array(coorderr).T, **plot_line_style) self.add_collection(errline) From d4f67c21444a72a80ca96509555df6306c8e1d3e Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Mon, 6 Feb 2017 15:47:18 +0100 Subject: [PATCH 09/35] add extended formatting from the 2d case; clean-up --- lib/mpl_toolkits/mplot3d/axes3d.py | 109 ++++++++++++++++++++--------- 1 file changed, 75 insertions(+), 34 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 91395373a1e2..b17333aa719b 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -28,6 +28,8 @@ from matplotlib.axes._base import _axis_method_wrapper from matplotlib.transforms import Bbox from matplotlib.tri.triangulation import Triangulation +from matplotlib.colors import Normalize, LightSource +from matplotlib.axes._base import _process_plot_format from . import art3d from . import proj3d @@ -2770,20 +2772,12 @@ def permutation_matrices(n): return polygons - # TODO: is it ok to redefine Axes.errorbar method? - # some methods seem to append '3d' to the end instead? - def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, - # TODO: sneak this kwarg in: - #fmt='', - barsabove=False, errorevery=1, + def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', + barsabove=False, errorevery=1, ecolor=None, elinewidth=None, capsize=None, capthick=None, xlolims=False, xuplims=False, ylolims=False, yuplims=False, zlolims=False, zuplims=False, debug_kwargs = {}, **kwargs): - # TODO: write up a proof of concept analogous to this one here: - # http://matplotlib.org/examples/pylab_examples/errorbar_limits.html - # TODO: triple-check the docstring: some data forms are probably not - # going to work despite being allowed in the docstring :C """ Draws error bars on an Axis3D instance. @@ -2801,6 +2795,20 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, If a sequence of shape 2xN, errorbars are drawn at -row1 and +row2 relative to the data. + fmt : plot format string, optional, default: None + The plot format symbol. If fmt is 'none' (case-insensitive), + only the errorbars are plotted. This is used for adding + errorbars to a bar plot, for example. Default is '', + an empty plot format string; properties are + then identical to the defaults for :meth:`plot`. + + ecolor : mpl color, optional, default: None + A matplotlib color arg which gives the color the errorbar lines; + if None, use the color of the line connecting the markers. + + elinewidth : scalar, optional, default: None + The linewidth of the errorbar lines. If None, use the linewidth. + capsize : scalar, optional, default: None The length of the error bar caps in points; if None, it will take the value from ``errorbar.capsize`` @@ -2835,10 +2843,52 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, if not cbook.iterable(z): z = [z] + if fmt is None: + fmt = 'none' + msg = ('Use of None object as fmt keyword argument to ' + + 'suppress plotting of data values is deprecated ' + + 'since 1.4; use the string "none" instead.') + warnings.warn(msg) + + plot_line = (fmt.lower() != 'none') + label = kwargs.pop("label", None) + + fmt_style_kwargs = {k: v for k, v in + zip(('linestyle', 'marker', 'color'), + _process_plot_format(fmt)) if v is not None} + + if ('color' in kwargs or 'color' in fmt_style_kwargs or + ecolor is not None): + base_style = {} + if 'color' in kwargs: + base_style['color'] = kwargs.pop('color') + else: + base_style = six.next(self._get_lines.prop_cycler) + + base_style.update(fmt_style_kwargs) + if 'color' not in base_style: + base_style['color'] = 'C0' + if ecolor is None: + ecolor = base_style['color'] + + # make the style dict for the line collections (the bars) + eb_lines_style = dict(base_style) + eb_lines_style.pop('marker', None) + eb_lines_style.pop('linestyle', None) + eb_lines_style['color'] = ecolor + + if elinewidth: + eb_lines_style['linewidth'] = elinewidth + elif 'linewidth' in kwargs: + eb_lines_style['linewidth'] = kwargs['linewidth'] + + for key in ('transform', 'alpha', 'zorder', 'rasterized'): + if key in kwargs: + eb_lines_style[key] = kwargs[key] + everymask = np.arange(len(x)) % errorevery == 0 - # TODO: fully adhere to the styling rules in 2d-errorbar later on... - plot_line_style = {} + plot_line_style = dict(base_style) plot_line_style.update(**kwargs) if 'zorder' not in kwargs.keys(): kwargs['zorder'] = 2 @@ -2847,7 +2897,12 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, else: plot_line_style['zorder'] = kwargs['zorder'] + .1 - eb_cap_style = {} + # set up cap style dictionary + eb_cap_style = dict(base_style) + # eject any marker information from format string + eb_cap_style.pop('marker', None) + eb_cap_style.pop('ls', None) + eb_cap_style['linestyle'] = 'none' if capsize is None: capsize = kwargs.pop('capsize', rcParams["errorbar.capsize"]) if capsize > 0: @@ -2855,6 +2910,10 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, if capthick is not None: eb_cap_style['markeredgewidth'] = capthick + if plot_line: + data_line = art3d.Line3D(x, y, z, **plot_line_style) + self.add_line(data_line) + def _bool_asarray_helper(d, expected): if not cbook.iterable(d): return np.asarray([d] * expected, bool) @@ -2868,21 +2927,6 @@ def _mask_lists(xs, ys, zs, mask=None): zs = [l for l, m in zip(zs, mask) if m] return xs, ys, zs - def _debug_floatlists(*args, **kwargs): - if 'crash' in kwargs: - crash = kwargs.pop('crash') - if crash: - raise RuntimeError('you asked for it!') - if 'set_trace' in kwargs: - set_trace = kwargs.pop('set_trace') - if set_trace: - import pdb - pdb.set_trace() - for l in args: - s = ("["+', '.join(['%.2f']*len(l))+"]") % tuple(l) - print(s) - print('\n') - # TODO: currently, only a scalar number or len(N) objects are ok... def _unpack_errs(data, err, lomask, himask): lows = [d - e if m else d for d, e, m in zip(data, err, lomask)] @@ -2931,15 +2975,12 @@ def _unpack_errs(data, err, lomask, himask): 1: {'lower': art3d.lines.CARETRIGHT, 'upper': art3d.lines.CARETLEFT}, 2: {'lower': art3d.lines.CARETUP, - 'upper': art3d.lines.CARETDOWN}, - } + 'upper': art3d.lines.CARETDOWN}} if nolims.any(): if capsize > 0: lo_caps_xyz = _mask_lists(xl, yl, zl, nolims & everymask) hi_caps_xyz = _mask_lists(xh, yh, zh, nolims & everymask) - #_debug_floatlists(*lo_caps_xyz) - #_debug_floatlists(*hi_caps_xyz) # NOTE on the caps in 3D plots: # Using markers in interactive 3D plots is confusing to @@ -2969,7 +3010,6 @@ def _unpack_errs(data, err, lomask, himask): lolims_xyz = _mask_lists(xup, yup, zup, lolims & everymask) uplims_xyz = _mask_lists(xlo, ylo, zlo, uplims & everymask) - _debug_floatlists(*lolims_xyz, **debug_kwargs) lims_lo = art3d.Line3D(*lolims_xyz, ls='', marker=limmarker[i_xyz]['lower'], @@ -2981,7 +3021,8 @@ def _unpack_errs(data, err, lomask, himask): self.add_line(lims_up) errline = art3d.Line3DCollection(np.array(coorderr).T, - **plot_line_style) + label = label, + **eb_lines_style) self.add_collection(errline) errlines.append(errline) coorderrs.append(coorderr) From 3b3e5d46e6ecd6260f8966b18914aba300a13fc5 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Mon, 6 Feb 2017 17:05:30 +0100 Subject: [PATCH 10/35] pep8 edits --- lib/mpl_toolkits/mplot3d/axes3d.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index b17333aa719b..28448f05749b 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2776,7 +2776,6 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', barsabove=False, errorevery=1, ecolor=None, elinewidth=None, capsize=None, capthick=None, xlolims=False, xuplims=False, ylolims=False, yuplims=False, zlolims=False, zuplims=False, - debug_kwargs = {}, **kwargs): """ Draws error bars on an Axis3D instance. @@ -2929,13 +2928,14 @@ def _mask_lists(xs, ys, zs, mask=None): # TODO: currently, only a scalar number or len(N) objects are ok... def _unpack_errs(data, err, lomask, himask): - lows = [d - e if m else d for d, e, m in zip(data, err, lomask)] + lows = [d - e if m else d for d, e, m in zip(data, err, lomask)] highs = [d + e if m else d for d, e, m in zip(data, err, himask)] return lows, highs # TODO: things to init are barcaps and low-, high-limits - errlines, caplines = [], [] - coorderrs = [] # list of endpoint coordinates, used for auto-scaling + errlines, caplines = [], [] + # List of endpoint coordinates, used for auto-scaling + coorderrs = [] for data, err, i_xyz, lolims, uplims in zip([x, y, z], [xerr, yerr, zerr], range(3), @@ -3021,17 +3021,18 @@ def _unpack_errs(data, err, lomask, himask): self.add_line(lims_up) errline = art3d.Line3DCollection(np.array(coorderr).T, - label = label, + label=label, **eb_lines_style) self.add_collection(errline) errlines.append(errline) coorderrs.append(coorderr) coorderrs = np.array(coorderrs) + def _digout_minmax(err_arr, coord_label): key = {'x': 0, 'y': 1, 'z': 2} return (np.nanmin(err_arr[:, key[coord_label], :, :]), - np.nanmax(err_arr[:, key[coord_label], :, :]) ) + np.nanmax(err_arr[:, key[coord_label], :, :])) minx, maxx = _digout_minmax(coorderrs, 'x') miny, maxy = _digout_minmax(coorderrs, 'y') From 6889a3dbf27b837f86aa0b54854a2068837c213a Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Tue, 7 Feb 2017 17:52:43 +0100 Subject: [PATCH 11/35] fix errorevery; return a container of sorts --- lib/mpl_toolkits/mplot3d/axes3d.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 28448f05749b..c1b99dc5f68b 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2932,8 +2932,7 @@ def _unpack_errs(data, err, lomask, himask): highs = [d + e if m else d for d, e, m in zip(data, err, himask)] return lows, highs - # TODO: things to init are barcaps and low-, high-limits - errlines, caplines = [], [] + errlines, caplines, limmarks = [], [], [] # List of endpoint coordinates, used for auto-scaling coorderrs = [] @@ -2963,8 +2962,9 @@ def _unpack_errs(data, err, lomask, himask): # a nested list structure that expands to (xl,xh),(yl,yh),(zl,zh), # where x/y/z and l/h correspond to dimensions and low/high # positions of errorbars in a dimension we're looping over - coorderr = [_unpack_errs(coord, err*rolling_mask[i], ~lolims, - ~uplims) for i, coord in enumerate([x, y, z])] + coorderr = [_unpack_errs(coord, err*rolling_mask[i], + ~lolims & everymask, ~uplims & everymask) + for i, coord in enumerate([x, y, z])] (xl, xh), (yl, yh), (zl, zh) = coorderr # define the markers used for errorbar caps and limits below @@ -3019,6 +3019,8 @@ def _unpack_errs(data, err, lomask, himask): **eb_cap_style) self.add_line(lims_lo) self.add_line(lims_up) + limmarks.append(lims_lo) + limmarks.append(lims_up) errline = art3d.Line3DCollection(np.array(coorderr).T, label=label, @@ -3039,12 +3041,7 @@ def _digout_minmax(err_arr, coord_label): minz, maxz = _digout_minmax(coorderrs, 'z') self.auto_scale_xyz((minx, maxx), (miny, maxy), (minz, maxz), had_data) - # TODO: return one list instead of three maybe? - # TODO: make a container of sorts? There's going to be a whole bunch - # of artist objects bundled together here, with all the lines, - # caps, and upper/lower limit arrow indicators... - return errlines - + return errlines, caplines, limmarks docstring.interpd.update(Axes3D=artist.kwdoc(Axes3D)) docstring.dedent_interpd(Axes3D.__init__) From 20f0caf04731ceb322635e83bf7a50fa8eb7d2ce Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Tue, 7 Feb 2017 18:17:45 +0100 Subject: [PATCH 12/35] allow offsets for errorevery --- lib/mpl_toolkits/mplot3d/axes3d.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index c1b99dc5f68b..23ca9009ab2a 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2825,10 +2825,14 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', if True , will plot the errorbars above the plot symbols. Default is below. - errorevery : positive integer, optional, default:1 - subsamples the errorbars. e.g., if errorevery=5, errorbars for - every 5-th datapoint will be plotted. The data plot itself still - shows all data points. + errorevery: positive integer or tuple of integers + draws error bars on a subset of the data. errorevery=skip draws + error bars on the points (x[::skip], y[::skip]). + errorevery=(skip,shift) draws error bars on the points + (x[skip%%shift::skip], y[shift%%skip::skip]). e.g. errorevery=(6,3) + adds error bars to the data at (x[3], x[9], x[15], x[21], ...). + Used to avoid overlapping error bars when two series share x-axis + values. Additional keyword arguments for styling errorbar lines are passed to :func:`~mpl_toolkits.mplot3d.art3d.Line3DCollection` @@ -2885,7 +2889,18 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', if key in kwargs: eb_lines_style[key] = kwargs[key] - everymask = np.arange(len(x)) % errorevery == 0 + try: + errorevery, offset = errorevery + except TypeError: + offset = 0 + + int_msg = 'errorevery must be positive integer or tuple of integers' + if errorevery < 1 or int(errorevery) != errorevery: + raise ValueError(int_msg) + if int(offset) != offset: + raise ValueError(int_msg) + + everymask = (np.arange(len(x)) - offset) % errorevery == 0 plot_line_style = dict(base_style) plot_line_style.update(**kwargs) From cd635933955c10b6b10b9f3d21832d3e73dc8466 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Tue, 7 Feb 2017 22:06:54 +0100 Subject: [PATCH 13/35] arrrr pep8 again --- lib/mpl_toolkits/mplot3d/axes3d.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 23ca9009ab2a..2573f752f019 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -3058,6 +3058,7 @@ def _digout_minmax(err_arr, coord_label): return errlines, caplines, limmarks + docstring.interpd.update(Axes3D=artist.kwdoc(Axes3D)) docstring.dedent_interpd(Axes3D.__init__) From fb2d200cc335c437e855fe52c53fdfd1a9d3d48f Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Thu, 9 Feb 2017 17:29:50 +0100 Subject: [PATCH 14/35] docstring edits --- lib/mpl_toolkits/mplot3d/axes3d.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 2573f752f019..933501e393a2 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2825,14 +2825,21 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', if True , will plot the errorbars above the plot symbols. Default is below. + xlolims / ylolims / zlolims : bool, optional, default:None + These arguments can be used to indicate that a value gives + only lower limits. In that case a caret symbol is being + drawn to indicate this. lims-arguments may be of the same + type as *xerr* and *yerr*. + + xuplims / yuplims / zuplims : bool, optional, default:None + Same as above, but for controlling the upper limits. + errorevery: positive integer or tuple of integers draws error bars on a subset of the data. errorevery=skip draws - error bars on the points (x[::skip], y[::skip]). + error bars on the [::skip] intervals. If a tuple of integers, errorevery=(skip,shift) draws error bars on the points - (x[skip%%shift::skip], y[shift%%skip::skip]). e.g. errorevery=(6,3) + selected as [skip%%shift::skip]. e.g. errorevery=(6,3) adds error bars to the data at (x[3], x[9], x[15], x[21], ...). - Used to avoid overlapping error bars when two series share x-axis - values. Additional keyword arguments for styling errorbar lines are passed to :func:`~mpl_toolkits.mplot3d.art3d.Line3DCollection` From 74f5209b2393624126a5ddbe1174a8f9f9f0f03e Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Thu, 9 Feb 2017 17:32:09 +0100 Subject: [PATCH 15/35] add example; update what's new section --- doc/users/whats_new/errorbars_3d.rst | 7 +++++++ examples/mplot3d/errorbars_demo.py | 31 ++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 doc/users/whats_new/errorbars_3d.rst create mode 100644 examples/mplot3d/errorbars_demo.py diff --git a/doc/users/whats_new/errorbars_3d.rst b/doc/users/whats_new/errorbars_3d.rst new file mode 100644 index 000000000000..3286f4a37f07 --- /dev/null +++ b/doc/users/whats_new/errorbars_3d.rst @@ -0,0 +1,7 @@ +Errorbar method for mplot3d +------------------------ + +The errorbar function :meth:`matplotlib.axes._axes.Axes.errorbar` is ported +into the `mplot3d` framework in its entirety. Supports features such as custom +styling for error lines and cap marks, control over erorrbar spacing, upper and +lower limit marks. diff --git a/examples/mplot3d/errorbars_demo.py b/examples/mplot3d/errorbars_demo.py new file mode 100644 index 000000000000..56e8a7ce4ff4 --- /dev/null +++ b/examples/mplot3d/errorbars_demo.py @@ -0,0 +1,31 @@ +''' +An example of using errorbars in mplot3d +''' + +from mpl_toolkits.mplot3d import Axes3D +import matplotlib.pyplot as plt +import numpy as np + +fig = plt.figure() +ax = fig.gca(projection='3d') + +# setting up a parametric curve +t = np.arange(0, 2*np.pi+.1, 0.01) +x, y, z = np.sin(t), np.cos(3*t), np.sin(5*t) + +fig_zerr_kwargs = dict(zerr=0.2, capsize=2) +fig_xerr_kwargs = dict(xerr=0.2, errorevery=(2,2)) + +estep = 15 +zuplims = [True if (not i%estep and i//estep%3==0) + else False for i in range(t.size)] +zlolims = [True if (not i%estep and i//estep%3==2) + else False for i in range(t.size)] + +ax.errorbar(x, y, z, 0.2, zuplims=zuplims, zlolims=zlolims, errorevery=estep) + +ax.set_xlabel("X label") +ax.set_ylabel("Y label") +ax.set_zlabel("Z label") + +plt.show() From 82dec2b757e25de93cecb5d933bff0ee3d0b5fcb Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Thu, 9 Feb 2017 18:05:10 +0100 Subject: [PATCH 16/35] please just squash everything - I can't pep8 properly --- examples/mplot3d/errorbars_demo.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/mplot3d/errorbars_demo.py b/examples/mplot3d/errorbars_demo.py index 56e8a7ce4ff4..6dd6832c46f0 100644 --- a/examples/mplot3d/errorbars_demo.py +++ b/examples/mplot3d/errorbars_demo.py @@ -14,13 +14,13 @@ x, y, z = np.sin(t), np.cos(3*t), np.sin(5*t) fig_zerr_kwargs = dict(zerr=0.2, capsize=2) -fig_xerr_kwargs = dict(xerr=0.2, errorevery=(2,2)) +fig_xerr_kwargs = dict(xerr=0.2, errorevery=(2, 2)) estep = 15 -zuplims = [True if (not i%estep and i//estep%3==0) - else False for i in range(t.size)] -zlolims = [True if (not i%estep and i//estep%3==2) - else False for i in range(t.size)] +zuplims = [True if (not i % estep and i // estep % 3 == 0) + else False for i in range(t.size)] +zlolims = [True if (not i % estep and i // estep % 3 == 2) + else False for i in range(t.size)] ax.errorbar(x, y, z, 0.2, zuplims=zuplims, zlolims=zlolims, errorevery=estep) @@ -29,3 +29,4 @@ ax.set_zlabel("Z label") plt.show() + From c570c69a5cca312c44d0df5bb35c301c5fce99d2 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Thu, 9 Feb 2017 18:33:51 +0100 Subject: [PATCH 17/35] vim adds a newline behind the scenes already --- examples/mplot3d/errorbars_demo.py | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/mplot3d/errorbars_demo.py b/examples/mplot3d/errorbars_demo.py index 6dd6832c46f0..06ccf12035ef 100644 --- a/examples/mplot3d/errorbars_demo.py +++ b/examples/mplot3d/errorbars_demo.py @@ -29,4 +29,3 @@ ax.set_zlabel("Z label") plt.show() - From c30c276a7a95fe83045410a4e434fd3d3c93f900 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Thu, 16 Apr 2020 15:00:45 +0200 Subject: [PATCH 18/35] rebase against current master + fix dropped deprecations --- lib/mpl_toolkits/mplot3d/axes3d.py | 47 ++++++++++++++++-------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 933501e393a2..7daadb81156b 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -12,6 +12,7 @@ from collections import defaultdict from functools import reduce +import logging import math import textwrap @@ -25,16 +26,16 @@ import matplotlib.docstring as docstring import matplotlib.scale as mscale from matplotlib.axes import Axes, rcParams -from matplotlib.axes._base import _axis_method_wrapper +from matplotlib.axes._base import _axis_method_wrapper, _process_plot_format from matplotlib.transforms import Bbox from matplotlib.tri.triangulation import Triangulation -from matplotlib.colors import Normalize, LightSource -from matplotlib.axes._base import _process_plot_format from . import art3d from . import proj3d from . import axis3d +_log = logging.getLogger(__name__) + @cbook.deprecated("3.2", alternative="Bbox.unit()") def unit_bbox(): @@ -2846,11 +2847,11 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', """ had_data = self.has_data() - if not cbook.iterable(x): + if not np.iterable(x): x = [x] - if not cbook.iterable(y): + if not np.iterable(y): y = [y] - if not cbook.iterable(z): + if not np.iterable(z): z = [z] if fmt is None: @@ -2858,7 +2859,7 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', msg = ('Use of None object as fmt keyword argument to ' + 'suppress plotting of data values is deprecated ' + 'since 1.4; use the string "none" instead.') - warnings.warn(msg) + _log.warning(msg) plot_line = (fmt.lower() != 'none') label = kwargs.pop("label", None) @@ -2873,7 +2874,7 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', if 'color' in kwargs: base_style['color'] = kwargs.pop('color') else: - base_style = six.next(self._get_lines.prop_cycler) + base_style = next(self._get_lines.prop_cycler) base_style.update(fmt_style_kwargs) if 'color' not in base_style: @@ -2936,10 +2937,10 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', self.add_line(data_line) def _bool_asarray_helper(d, expected): - if not cbook.iterable(d): + if not np.iterable(d): return np.asarray([d] * expected, bool) - else: - return np.asarray(d, bool) + + return np.asarray(d, bool) def _mask_lists(xs, ys, zs, mask=None): """ Applies a mask to three lists. """ @@ -2958,14 +2959,14 @@ def _unpack_errs(data, err, lomask, himask): # List of endpoint coordinates, used for auto-scaling coorderrs = [] - for data, err, i_xyz, lolims, uplims in zip([x, y, z], - [xerr, yerr, zerr], range(3), - [xlolims, ylolims, zlolims], - [xuplims, yuplims, zuplims]): + for data, err, i_xyz, lolims, uplims in zip( + [x, y, z], [xerr, yerr, zerr], range(3), + [xlolims, ylolims, zlolims], [xuplims, yuplims, zuplims]): + if err is None: continue - if not cbook.iterable(err): + if not np.iterable(err): err = [err] * len(data) lolims = _bool_asarray_helper(lolims, len(x)) uplims = _bool_asarray_helper(uplims, len(x)) @@ -2976,7 +2977,7 @@ def _unpack_errs(data, err, lomask, himask): # as long as the actual data plotted stays as lists. # This is due to unit preservation issues # (c.f. the 2d errorbar case). - rolling_mask = np.roll([1.,0.,0.], i_xyz) + rolling_mask = np.roll([1., 0., 0.], i_xyz) # TODO: why is this here? if err is not None: err = np.atleast_1d(err) @@ -2984,9 +2985,10 @@ def _unpack_errs(data, err, lomask, himask): # a nested list structure that expands to (xl,xh),(yl,yh),(zl,zh), # where x/y/z and l/h correspond to dimensions and low/high # positions of errorbars in a dimension we're looping over - coorderr = [_unpack_errs(coord, err*rolling_mask[i], - ~lolims & everymask, ~uplims & everymask) - for i, coord in enumerate([x, y, z])] + coorderr = [ + _unpack_errs(coord, err * rolling_mask[i], + ~lolims & everymask, ~uplims & everymask) + for i, coord in enumerate([x, y, z])] (xl, xh), (yl, yh), (zl, zh) = coorderr # define the markers used for errorbar caps and limits below @@ -3026,8 +3028,9 @@ def _unpack_errs(data, err, lomask, himask): # example, 180 deg rotation around z-axis would flip # the markers around... However, this solution is # spiritually close to that of 2d errorbar function - limits = [_unpack_errs(coord, err*rolling_mask[i], uplims, - lolims) for i, coord in enumerate([x, y, z])] + limits = [ + _unpack_errs(coord, err*rolling_mask[i], uplims, lolims) + for i, coord in enumerate([x, y, z])] (xlo, xup), (ylo, yup), (zlo, zup) = limits lolims_xyz = _mask_lists(xup, yup, zup, lolims & everymask) From f5ef8bd24e00a9051a45f5eb07db0ceb268fa5b7 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Fri, 17 Apr 2020 17:52:23 +0200 Subject: [PATCH 19/35] fix compatibility issues with 2d errorbar version (WIP) * Integrate errorbar 2d changes since 2017 * Integrate the merged updated errorevery behavior * Remove the deprecation warning for fmt=None * Fix ecolor working for lines but not for caps * Fix broken cycler + ecolor behavior --- doc/users/whats_new/errorbars_3d.rst | 2 +- lib/mpl_toolkits/mplot3d/axes3d.py | 239 ++++++++++++++------------- 2 files changed, 123 insertions(+), 118 deletions(-) diff --git a/doc/users/whats_new/errorbars_3d.rst b/doc/users/whats_new/errorbars_3d.rst index 3286f4a37f07..99820890bf1e 100644 --- a/doc/users/whats_new/errorbars_3d.rst +++ b/doc/users/whats_new/errorbars_3d.rst @@ -1,5 +1,5 @@ Errorbar method for mplot3d ------------------------- +--------------------------- The errorbar function :meth:`matplotlib.axes._axes.Axes.errorbar` is ported into the `mplot3d` framework in its entirety. Supports features such as custom diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 7daadb81156b..dc1e329c78ff 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -12,7 +12,6 @@ from collections import defaultdict from functools import reduce -import logging import math import textwrap @@ -34,8 +33,6 @@ from . import proj3d from . import axis3d -_log = logging.getLogger(__name__) - @cbook.deprecated("3.2", alternative="Bbox.unit()") def unit_bbox(): @@ -2779,97 +2776,95 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', ylolims=False, yuplims=False, zlolims=False, zuplims=False, **kwargs): """ - Draws error bars on an Axis3D instance. + Plot lines and/or markers with errorbars around them. + + *x*/*y*/*z* define the data locations, and *xerr*/*yerr*/*zerr* define + the errorbar sizes. By default, this draws the data markers/lines as + well the errorbars. Use fmt='none' to draw errorbars only. Parameters ---------- - x : scalar - y : scalar - z : scalar - - xerr/yerr/zerr : scalar or array-like, shape(n,1) or shape(2,n). - If a scalar number, len(N) array-like object, or an Nx1 - array-like object, errorbars are drawn at +/-value relative - to the data. Default is None. - - If a sequence of shape 2xN, errorbars are drawn at -row1 - and +row2 relative to the data. - - fmt : plot format string, optional, default: None - The plot format symbol. If fmt is 'none' (case-insensitive), - only the errorbars are plotted. This is used for adding - errorbars to a bar plot, for example. Default is '', - an empty plot format string; properties are - then identical to the defaults for :meth:`plot`. - - ecolor : mpl color, optional, default: None - A matplotlib color arg which gives the color the errorbar lines; - if None, use the color of the line connecting the markers. - - elinewidth : scalar, optional, default: None - The linewidth of the errorbar lines. If None, use the linewidth. - - capsize : scalar, optional, default: None - The length of the error bar caps in points; if None, it will - take the value from ``errorbar.capsize`` - :data:`rcParam`. - - capthick : scalar, optional, default: None - An alias kwarg to markeredgewidth (a.k.a. - mew). This - setting is a more sensible name for the property that + x, y, z : scalar or array-like + The data positions. + + xerr, yerr, zerr : scalar or array-like, optional + The errorbar sizes: + - scalar: Symmetric +/- values for all data points. + - shape(N,): Symmetric +/-values for each data point. + - shape(2, N): Separate - and + values for each bar. First row + contains the lower errors, the second row contains the upper + errors. + - *None*: No errorbar. + + fmt : str, default: '' + The format for the data points / data lines. See `.plot` for + details. + + Use 'none' (case insensitive) to plot errorbars without any data + markers. + + ecolor : color, default: None + The color of the errorbar lines. If None, use the color of the + line connecting the markers. + + elinewidth : scalar, default: None + The linewidth of the errorbar lines. If None, the linewidth of + the current style is used. + + capsize : scalar, default: :rc:`errorbar.capsize` + The length of the error bar caps in points. + + capthick : scalar, default: None + An alias to the keyword argument *markeredgewidth* (a.k.a. *mew*). + This setting is a more sensible name for the property that controls the thickness of the error bar cap in points. For - backwards compatibility, if mew or markeredgewidth are given, - then they will over-ride capthick. This may change in future + backwards compatibility, if *mew* or *markeredgewidth* are given, + then they will over-ride *capthick*. This may change in future releases. - barsabove : bool, optional, default: False - if True , will plot the errorbars above the plot + barsabove : bool, default: False + If True, will plot the errorbars above the plot symbols. Default is below. - xlolims / ylolims / zlolims : bool, optional, default:None + xlolims, ylolims, zlolims : bool, default: False These arguments can be used to indicate that a value gives only lower limits. In that case a caret symbol is being drawn to indicate this. lims-arguments may be of the same type as *xerr* and *yerr*. - xuplims / yuplims / zuplims : bool, optional, default:None + xuplims, yuplims, zuplims : bool, default: False Same as above, but for controlling the upper limits. - errorevery: positive integer or tuple of integers - draws error bars on a subset of the data. errorevery=skip draws - error bars on the [::skip] intervals. If a tuple of integers, - errorevery=(skip,shift) draws error bars on the points - selected as [skip%%shift::skip]. e.g. errorevery=(6,3) - adds error bars to the data at (x[3], x[9], x[15], x[21], ...). + errorevery : int or (int, int), default: 1 + draws error bars on a subset of the data. *errorevery* =N draws + error bars on the points (x[::N], y[::N]). + *errorevery* =(start, N) draws error bars on the points + (x[start::N], y[start::N]). e.g. errorevery=(6, 3) + adds error bars to the data at (x[6], x[9], x[12], x[15], ...). + Used to avoid overlapping error bars when two series share x-axis + values. Additional keyword arguments for styling errorbar lines are passed to - :func:`~mpl_toolkits.mplot3d.art3d.Line3DCollection` + `~mpl_toolkits.mplot3d.art3d.Line3DCollection` """ had_data = self.has_data() - if not np.iterable(x): - x = [x] - if not np.iterable(y): - y = [y] - if not np.iterable(z): - z = [z] - - if fmt is None: - fmt = 'none' - msg = ('Use of None object as fmt keyword argument to ' + - 'suppress plotting of data values is deprecated ' + - 'since 1.4; use the string "none" instead.') - _log.warning(msg) - plot_line = (fmt.lower() != 'none') label = kwargs.pop("label", None) - fmt_style_kwargs = {k: v for k, v in - zip(('linestyle', 'marker', 'color'), - _process_plot_format(fmt)) if v is not None} + if fmt == '': + fmt_style_kwargs = {} + else: + fmt_style_kwargs = {k: v for k, v in + zip(('linestyle', 'marker', 'color'), + _process_plot_format(fmt)) + if v is not None} + + if fmt == 'none': + # Remove alpha=0 color that _process_plot_format returns + fmt_style_kwargs.pop('color') - if ('color' in kwargs or 'color' in fmt_style_kwargs or - ecolor is not None): + if ('color' in kwargs or 'color' in fmt_style_kwargs): base_style = {} if 'color' in kwargs: base_style['color'] = kwargs.pop('color') @@ -2882,9 +2877,28 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', if ecolor is None: ecolor = base_style['color'] + # make sure all the args are iterable; use lists not arrays to + # preserve units + x = x if np.iterable(x) else [x] + y = y if np.iterable(y) else [y] + z = z if np.iterable(z) else [z] + + # make the style dict for the 'normal' plot line + if 'zorder' not in kwargs: + kwargs['zorder'] = 2 + plot_line_style = { + **base_style, + **kwargs, + 'zorder': (kwargs['zorder'] - .1 if barsabove else + kwargs['zorder'] + .1), + } + # make the style dict for the line collections (the bars) eb_lines_style = dict(base_style) eb_lines_style.pop('marker', None) + eb_lines_style.pop('markerfacecolor', None) + eb_lines_style.pop('markeredgewidth', None) + eb_lines_style.pop('markeredgecolor', None) eb_lines_style.pop('linestyle', None) eb_lines_style['color'] = ecolor @@ -2897,29 +2911,7 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', if key in kwargs: eb_lines_style[key] = kwargs[key] - try: - errorevery, offset = errorevery - except TypeError: - offset = 0 - - int_msg = 'errorevery must be positive integer or tuple of integers' - if errorevery < 1 or int(errorevery) != errorevery: - raise ValueError(int_msg) - if int(offset) != offset: - raise ValueError(int_msg) - - everymask = (np.arange(len(x)) - offset) % errorevery == 0 - - plot_line_style = dict(base_style) - plot_line_style.update(**kwargs) - if 'zorder' not in kwargs.keys(): - kwargs['zorder'] = 2 - if barsabove: - plot_line_style['zorder'] = kwargs['zorder'] - .1 - else: - plot_line_style['zorder'] = kwargs['zorder'] + .1 - - # set up cap style dictionary + # make the style dict for cap collections (the "hats") eb_cap_style = dict(base_style) # eject any marker information from format string eb_cap_style.pop('marker', None) @@ -2931,16 +2923,25 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', eb_cap_style['markersize'] = 2. * capsize if capthick is not None: eb_cap_style['markeredgewidth'] = capthick + eb_cap_style['color'] = ecolor if plot_line: data_line = art3d.Line3D(x, y, z, **plot_line_style) self.add_line(data_line) - def _bool_asarray_helper(d, expected): - if not np.iterable(d): - return np.asarray([d] * expected, bool) + try: + offset, errorevery = errorevery + except TypeError: + offset = 0 + + if errorevery < 1 or int(errorevery) != errorevery: + raise ValueError( + 'errorevery must be positive integer or tuple of integers') + if int(offset) != offset: + raise ValueError("errorevery's starting index must be an integer") - return np.asarray(d, bool) + everymask = np.zeros(len(x), bool) + everymask[offset::errorevery] = True def _mask_lists(xs, ys, zs, mask=None): """ Applies a mask to three lists. """ @@ -2949,8 +2950,8 @@ def _mask_lists(xs, ys, zs, mask=None): zs = [l for l, m in zip(zs, mask) if m] return xs, ys, zs - # TODO: currently, only a scalar number or len(N) objects are ok... - def _unpack_errs(data, err, lomask, himask): + # TODO: errors can be only a scalar number or len(N) array-like + def _unpack_errs(err, data, lomask, himask): lows = [d - e if m else d for d, e, m in zip(data, err, lomask)] highs = [d + e if m else d for d, e, m in zip(data, err, himask)] return lows, highs @@ -2959,6 +2960,17 @@ def _unpack_errs(data, err, lomask, himask): # List of endpoint coordinates, used for auto-scaling coorderrs = [] + # define the markers used for errorbar caps and limits below + # the dictionary key is the current ticking value of `i_xyz` + capmarker = {0: '|', 1: '|', 2: '_'} + limmarker = {0: {'lower': art3d.lines.CARETRIGHT, + 'upper': art3d.lines.CARETLEFT}, + 1: {'lower': art3d.lines.CARETRIGHT, + 'upper': art3d.lines.CARETLEFT}, + 2: {'lower': art3d.lines.CARETUP, + 'upper': art3d.lines.CARETDOWN}} + + # i_xyz determines which coordinate is currently being looped over for data, err, i_xyz, lolims, uplims in zip( [x, y, z], [xerr, yerr, zerr], range(3), [xlolims, ylolims, zlolims], [xuplims, yuplims, zuplims]): @@ -2968,8 +2980,13 @@ def _unpack_errs(data, err, lomask, himask): if not np.iterable(err): err = [err] * len(data) - lolims = _bool_asarray_helper(lolims, len(x)) - uplims = _bool_asarray_helper(uplims, len(x)) + + # FIXME: err data is not supposed to be transformed into arrays! + err = np.atleast_1d(err) + + # arrays fine here, they are booleans and hence not units + lolims = np.broadcast_to(lolims, len(data)).astype(bool) + uplims = np.broadcast_to(uplims, len(data)).astype(bool) nolims = ~(lolims | uplims) @@ -2977,30 +2994,17 @@ def _unpack_errs(data, err, lomask, himask): # as long as the actual data plotted stays as lists. # This is due to unit preservation issues # (c.f. the 2d errorbar case). - rolling_mask = np.roll([1., 0., 0.], i_xyz) - # TODO: why is this here? - if err is not None: - err = np.atleast_1d(err) + rolling_mask = np.roll([1, 0, 0], i_xyz) # a nested list structure that expands to (xl,xh),(yl,yh),(zl,zh), # where x/y/z and l/h correspond to dimensions and low/high # positions of errorbars in a dimension we're looping over coorderr = [ - _unpack_errs(coord, err * rolling_mask[i], + _unpack_errs(err * rolling_mask[i], coord, ~lolims & everymask, ~uplims & everymask) for i, coord in enumerate([x, y, z])] (xl, xh), (yl, yh), (zl, zh) = coorderr - # define the markers used for errorbar caps and limits below - # the dicitonary key is the current ticking value of `i_xyz` - capmarker = {0: '|', 1: '|', 2: '_'} - limmarker = {0: {'lower': art3d.lines.CARETRIGHT, - 'upper': art3d.lines.CARETLEFT}, - 1: {'lower': art3d.lines.CARETRIGHT, - 'upper': art3d.lines.CARETLEFT}, - 2: {'lower': art3d.lines.CARETUP, - 'upper': art3d.lines.CARETDOWN}} - if nolims.any(): if capsize > 0: lo_caps_xyz = _mask_lists(xl, yl, zl, nolims & everymask) @@ -3029,7 +3033,7 @@ def _unpack_errs(data, err, lomask, himask): # the markers around... However, this solution is # spiritually close to that of 2d errorbar function limits = [ - _unpack_errs(coord, err*rolling_mask[i], uplims, lolims) + _unpack_errs(err*rolling_mask[i], coord, uplims, lolims) for i, coord in enumerate([x, y, z])] (xlo, xup), (ylo, yup), (zlo, zup) = limits @@ -3056,6 +3060,7 @@ def _unpack_errs(data, err, lomask, himask): coorderrs = np.array(coorderrs) + # TODO: errors can be only a scalar number or len(N) array-like def _digout_minmax(err_arr, coord_label): key = {'x': 0, 'y': 1, 'z': 2} return (np.nanmin(err_arr[:, key[coord_label], :, :]), From c3fa54282c7132c793b15da2583c3e23c0ff9d98 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Wed, 22 Apr 2020 16:24:12 +0200 Subject: [PATCH 20/35] fix flake8 warnings, mirror naming/docstring style of other examples --- examples/mplot3d/{errorbars_demo.py => errorbar3d.py} | 11 +++++++---- lib/mpl_toolkits/mplot3d/axes3d.py | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) rename examples/mplot3d/{errorbars_demo.py => errorbar3d.py} (85%) diff --git a/examples/mplot3d/errorbars_demo.py b/examples/mplot3d/errorbar3d.py similarity index 85% rename from examples/mplot3d/errorbars_demo.py rename to examples/mplot3d/errorbar3d.py index 06ccf12035ef..7ef14209ac22 100644 --- a/examples/mplot3d/errorbars_demo.py +++ b/examples/mplot3d/errorbar3d.py @@ -1,8 +1,11 @@ -''' -An example of using errorbars in mplot3d -''' +""" +============ +3D errorbars +============ + +An example of using errorbars with upper and lower limits in mplot3d. +""" -from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index dc1e329c78ff..26d0e7735497 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2944,7 +2944,7 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', everymask[offset::errorevery] = True def _mask_lists(xs, ys, zs, mask=None): - """ Applies a mask to three lists. """ + """Applies a mask to three lists.""" xs = [l for l, m in zip(xs, mask) if m] ys = [l for l, m in zip(ys, mask) if m] zs = [l for l, m in zip(zs, mask) if m] From b86260ad09ffc57aa62505cb3d94c4f8b3ef3755 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Thu, 23 Apr 2020 17:30:04 +0200 Subject: [PATCH 21/35] fix failing sphinx docs --- lib/mpl_toolkits/mplot3d/axes3d.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 26d0e7735497..0cd7692f7e3c 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2789,6 +2789,7 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', xerr, yerr, zerr : scalar or array-like, optional The errorbar sizes: + - scalar: Symmetric +/- values for all data points. - shape(N,): Symmetric +/-values for each data point. - shape(2, N): Separate - and + values for each bar. First row @@ -2844,8 +2845,27 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', Used to avoid overlapping error bars when two series share x-axis values. - Additional keyword arguments for styling errorbar lines are passed to - `~mpl_toolkits.mplot3d.art3d.Line3DCollection` + Returns + ------- + errlines : list + List of `~mpl_toolkits.mplot3d.art3d.Line3DCollection` instances + each containing an errorbar line. + caplines : list + List of `~mpl_toolkits.mplot3d.art3d.Line3D` instances each + containing a capline object. + limmarks : list + List of `~mpl_toolkits.mplot3d.art3d.Line3D` instances each + containing a marker with an upper or lower limit. + + Other Parameters + ---------------- + **kwargs + All other keyword arguments for styling errorbar lines are passed + `~mpl_toolkits.mplot3d.art3d.Line3DCollection`. + + Examples + -------- + .. plot:: gallery/mplot3d/errorbar3d.py """ had_data = self.has_data() From 45cbc81078b2def5ddbf4382bf25239a8298e012 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Fri, 24 Apr 2020 10:50:37 +0200 Subject: [PATCH 22/35] add an image comparison unit test for 3d errorbars --- examples/mplot3d/errorbar3d.py | 3 --- .../test_mplot3d/errorbar3d.png | Bin 0 -> 61584 bytes lib/mpl_toolkits/tests/test_mplot3d.py | 18 ++++++++++++++++++ 3 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 lib/mpl_toolkits/tests/baseline_images/test_mplot3d/errorbar3d.png diff --git a/examples/mplot3d/errorbar3d.py b/examples/mplot3d/errorbar3d.py index 7ef14209ac22..ea92c3b75a79 100644 --- a/examples/mplot3d/errorbar3d.py +++ b/examples/mplot3d/errorbar3d.py @@ -16,9 +16,6 @@ t = np.arange(0, 2*np.pi+.1, 0.01) x, y, z = np.sin(t), np.cos(3*t), np.sin(5*t) -fig_zerr_kwargs = dict(zerr=0.2, capsize=2) -fig_xerr_kwargs = dict(xerr=0.2, errorevery=(2, 2)) - estep = 15 zuplims = [True if (not i % estep and i // estep % 3 == 0) else False for i in range(t.size)] diff --git a/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/errorbar3d.png b/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/errorbar3d.png new file mode 100644 index 0000000000000000000000000000000000000000..a96324f60302496eb09c45af2e2dce85bdc77e4c GIT binary patch literal 61584 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 literal 0 HcmV?d00001 diff --git a/lib/mpl_toolkits/tests/test_mplot3d.py b/lib/mpl_toolkits/tests/test_mplot3d.py index 25bc6356a25e..639c7f1ecc1d 100644 --- a/lib/mpl_toolkits/tests/test_mplot3d.py +++ b/lib/mpl_toolkits/tests/test_mplot3d.py @@ -916,3 +916,21 @@ def test_minor_ticks(): ax.set_yticklabels(["third"], minor=True) ax.set_zticks([0.50], minor=True) ax.set_zticklabels(["half"], minor=True) + + +@mpl3d_image_comparison(['errorbar3d.png'], tol=0.03) +def test_errorbar3d(): + t = np.arange(0, 2*np.pi+.1, 0.01) + x, y, z = np.sin(t), np.cos(3*t), np.sin(5*t) + + fig = plt.figure() + ax = fig.gca(projection='3d') + + estep = 15 + zuplims = [True if (not i % estep and i // estep % 3 == 0) + else False for i in range(t.size)] + zlolims = [True if (not i % estep and i // estep % 3 == 2) + else False for i in range(t.size)] + + ax.errorbar(x, y, z, 0.2, zuplims=zuplims, zlolims=zlolims, + errorevery=estep) From 42c1d2715ed3e9846cec7a2a68120522a2d25db5 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Thu, 30 Apr 2020 17:13:31 +0200 Subject: [PATCH 23/35] errline gets drawn when both limits are set (compat. reasons) --- lib/mpl_toolkits/mplot3d/axes3d.py | 52 ++++++++++++++++-------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 0cd7692f7e3c..531f5154dfcf 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2972,12 +2972,20 @@ def _mask_lists(xs, ys, zs, mask=None): # TODO: errors can be only a scalar number or len(N) array-like def _unpack_errs(err, data, lomask, himask): - lows = [d - e if m else d for d, e, m in zip(data, err, lomask)] - highs = [d + e if m else d for d, e, m in zip(data, err, himask)] + # for compatibility with the 2d errorbar function, when both upper + # and lower limits specified, we need to draw the markers / line - + # whether or not using both limits makes any sense (it doesn't) + _lomask = lomask | (lomask == himask) + _himask = himask | (lomask == himask) + + lows = [d - e if m else d for d, e, m in zip(data, err, _lomask)] + highs = [d + e if m else d for d, e, m in zip(data, err, _himask)] return lows, highs + # collect drawn items while looping over the three coordinates errlines, caplines, limmarks = [], [], [] - # List of endpoint coordinates, used for auto-scaling + + # list of endpoint coordinates, used for auto-scaling coorderrs = [] # define the markers used for errorbar caps and limits below @@ -3025,27 +3033,23 @@ def _unpack_errs(err, data, lomask, himask): for i, coord in enumerate([x, y, z])] (xl, xh), (yl, yh), (zl, zh) = coorderr - if nolims.any(): - if capsize > 0: - lo_caps_xyz = _mask_lists(xl, yl, zl, nolims & everymask) - hi_caps_xyz = _mask_lists(xh, yh, zh, nolims & everymask) - - # NOTE on the caps in 3D plots: - # Using markers in interactive 3D plots is confusing to - # say the least, as the cap lines don't stay aligned with - # the coordinate axes! - # Nevertheless, let's stick to it for now for consistency. - # Setting '_' for z-caps and '|' for x- and y-caps: - cap_lo = art3d.Line3D(*lo_caps_xyz, ls='', - marker=capmarker[i_xyz], - **eb_cap_style) - cap_hi = art3d.Line3D(*hi_caps_xyz, ls='', - marker=capmarker[i_xyz], - **eb_cap_style) - self.add_line(cap_lo) - self.add_line(cap_hi) - caplines.append(cap_lo) - caplines.append(cap_hi) + # draws capmarkers - flat caps othogonal to the error bars + if nolims.any() and capsize > 0: + lo_caps_xyz = _mask_lists(xl, yl, zl, nolims & everymask) + hi_caps_xyz = _mask_lists(xh, yh, zh, nolims & everymask) + + # setting '_' for z-caps and '|' for x- and y-caps; + # these markers will rotate as the viewing angle changes + cap_lo = art3d.Line3D(*lo_caps_xyz, ls='', + marker=capmarker[i_xyz], + **eb_cap_style) + cap_hi = art3d.Line3D(*hi_caps_xyz, ls='', + marker=capmarker[i_xyz], + **eb_cap_style) + self.add_line(cap_lo) + self.add_line(cap_hi) + caplines.append(cap_lo) + caplines.append(cap_hi) if (lolims | uplims).any(): # FIXME: using markers for limits isn't the best idea: for From 5969893dd494427174d6663af8197e5a44fb03ff Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Fri, 1 May 2020 11:11:02 +0200 Subject: [PATCH 24/35] refactor to use art3d.get_dir_vector instead of np.roll --- lib/mpl_toolkits/mplot3d/axes3d.py | 35 ++++++++++++++---------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 531f5154dfcf..b4a877e9f4d6 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2989,7 +2989,7 @@ def _unpack_errs(err, data, lomask, himask): coorderrs = [] # define the markers used for errorbar caps and limits below - # the dictionary key is the current ticking value of `i_xyz` + # the dictionary key is mapped by the `i_xyz` helper dictionary capmarker = {0: '|', 1: '|', 2: '_'} limmarker = {0: {'lower': art3d.lines.CARETRIGHT, 'upper': art3d.lines.CARETLEFT}, @@ -2997,12 +2997,16 @@ def _unpack_errs(err, data, lomask, himask): 'upper': art3d.lines.CARETLEFT}, 2: {'lower': art3d.lines.CARETUP, 'upper': art3d.lines.CARETDOWN}} + i_xyz = {'x': 0, 'y': 1, 'z': 2} - # i_xyz determines which coordinate is currently being looped over - for data, err, i_xyz, lolims, uplims in zip( - [x, y, z], [xerr, yerr, zerr], range(3), + # loop over x-, y-, and z-direction and draw relevant elements + for zdir, data, err, lolims, uplims in zip( + ['x', 'y', 'z'], [x, y, z], [xerr, yerr, zerr], [xlolims, ylolims, zlolims], [xuplims, yuplims, zuplims]): + dir_vector = art3d.get_dir_vector(zdir) + i_zdir = i_xyz[zdir] + if err is None: continue @@ -3018,17 +3022,11 @@ def _unpack_errs(err, data, lomask, himask): nolims = ~(lolims | uplims) - # NOTE: care needs to be taken here - using numpy is fine, - # as long as the actual data plotted stays as lists. - # This is due to unit preservation issues - # (c.f. the 2d errorbar case). - rolling_mask = np.roll([1, 0, 0], i_xyz) - # a nested list structure that expands to (xl,xh),(yl,yh),(zl,zh), # where x/y/z and l/h correspond to dimensions and low/high # positions of errorbars in a dimension we're looping over coorderr = [ - _unpack_errs(err * rolling_mask[i], coord, + _unpack_errs(err * dir_vector[i], coord, ~lolims & everymask, ~uplims & everymask) for i, coord in enumerate([x, y, z])] (xl, xh), (yl, yh), (zl, zh) = coorderr @@ -3041,10 +3039,10 @@ def _unpack_errs(err, data, lomask, himask): # setting '_' for z-caps and '|' for x- and y-caps; # these markers will rotate as the viewing angle changes cap_lo = art3d.Line3D(*lo_caps_xyz, ls='', - marker=capmarker[i_xyz], + marker=capmarker[i_zdir], **eb_cap_style) cap_hi = art3d.Line3D(*hi_caps_xyz, ls='', - marker=capmarker[i_xyz], + marker=capmarker[i_zdir], **eb_cap_style) self.add_line(cap_lo) self.add_line(cap_hi) @@ -3057,7 +3055,7 @@ def _unpack_errs(err, data, lomask, himask): # the markers around... However, this solution is # spiritually close to that of 2d errorbar function limits = [ - _unpack_errs(err*rolling_mask[i], coord, uplims, lolims) + _unpack_errs(err*dir_vector[i], coord, uplims, lolims) for i, coord in enumerate([x, y, z])] (xlo, xup), (ylo, yup), (zlo, zup) = limits @@ -3065,10 +3063,10 @@ def _unpack_errs(err, data, lomask, himask): uplims_xyz = _mask_lists(xlo, ylo, zlo, uplims & everymask) lims_lo = art3d.Line3D(*lolims_xyz, ls='', - marker=limmarker[i_xyz]['lower'], + marker=limmarker[i_zdir]['lower'], **eb_cap_style) lims_up = art3d.Line3D(*uplims_xyz, ls='', - marker=limmarker[i_xyz]['upper'], + marker=limmarker[i_zdir]['upper'], **eb_cap_style) self.add_line(lims_lo) self.add_line(lims_up) @@ -3086,9 +3084,8 @@ def _unpack_errs(err, data, lomask, himask): # TODO: errors can be only a scalar number or len(N) array-like def _digout_minmax(err_arr, coord_label): - key = {'x': 0, 'y': 1, 'z': 2} - return (np.nanmin(err_arr[:, key[coord_label], :, :]), - np.nanmax(err_arr[:, key[coord_label], :, :])) + return (np.nanmin(err_arr[:, i_xyz[coord_label], :, :]), + np.nanmax(err_arr[:, i_xyz[coord_label], :, :])) minx, maxx = _digout_minmax(coorderrs, 'x') miny, maxy = _digout_minmax(coorderrs, 'y') From 26a422640e6b99a01ad53dd687e8abfcf579e3a5 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Wed, 6 May 2020 15:42:49 +0200 Subject: [PATCH 25/35] adapt 2d errorbar containers for legend handling --- lib/mpl_toolkits/mplot3d/axes3d.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index b4a877e9f4d6..df7cadd82213 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -24,6 +24,7 @@ import matplotlib.colors as mcolors import matplotlib.docstring as docstring import matplotlib.scale as mscale +import matplotlib.container as mcontainer from matplotlib.axes import Axes, rcParams from matplotlib.axes._base import _axis_method_wrapper, _process_plot_format from matplotlib.transforms import Bbox @@ -2891,6 +2892,7 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', else: base_style = next(self._get_lines.prop_cycler) + base_style['label'] = '_nolegend_' base_style.update(fmt_style_kwargs) if 'color' not in base_style: base_style['color'] = 'C0' @@ -3074,7 +3076,6 @@ def _unpack_errs(err, data, lomask, himask): limmarks.append(lims_up) errline = art3d.Line3DCollection(np.array(coorderr).T, - label=label, **eb_lines_style) self.add_collection(errline) errlines.append(errline) @@ -3092,6 +3093,14 @@ def _digout_minmax(err_arr, coord_label): minz, maxz = _digout_minmax(coorderrs, 'z') self.auto_scale_xyz((minx, maxx), (miny, maxy), (minz, maxz), had_data) + # Adapting errorbar containers for 3d case - assuming z-axis points "up" + errorbar_container = mcontainer.ErrorbarContainer( + (data_line, tuple(caplines), tuple(errlines)), + has_xerr=(xerr is not None or yerr is not None), + has_yerr=(zerr is not None), + label=label) + self.containers.append(errorbar_container) + return errlines, caplines, limmarks From c8f11614b42f6d75da43f30975341b9111563f60 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Wed, 6 May 2020 19:02:56 +0200 Subject: [PATCH 26/35] need to consider everymask for altering upper=lower limits --- lib/mpl_toolkits/mplot3d/axes3d.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index df7cadd82213..a172a61d3546 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2977,8 +2977,8 @@ def _unpack_errs(err, data, lomask, himask): # for compatibility with the 2d errorbar function, when both upper # and lower limits specified, we need to draw the markers / line - # whether or not using both limits makes any sense (it doesn't) - _lomask = lomask | (lomask == himask) - _himask = himask | (lomask == himask) + _lomask = lomask | ((lomask == himask) & everymask) + _himask = himask | ((lomask == himask) & everymask) lows = [d - e if m else d for d, e, m in zip(data, err, _lomask)] highs = [d + e if m else d for d, e, m in zip(data, err, _himask)] @@ -3093,7 +3093,7 @@ def _digout_minmax(err_arr, coord_label): minz, maxz = _digout_minmax(coorderrs, 'z') self.auto_scale_xyz((minx, maxx), (miny, maxy), (minz, maxz), had_data) - # Adapting errorbar containers for 3d case - assuming z-axis points "up" + # Adapting errorbar containers for 3d case, assuming z-axis points "up" errorbar_container = mcontainer.ErrorbarContainer( (data_line, tuple(caplines), tuple(errlines)), has_xerr=(xerr is not None or yerr is not None), From e18713a3ee3518db4c753e7427bb386062390c72 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Wed, 13 May 2020 15:51:29 +0200 Subject: [PATCH 27/35] switch to plt.quiver for drawling arrows --- lib/mpl_toolkits/mplot3d/axes3d.py | 46 ++++++++---------- .../test_mplot3d/errorbar3d.png | Bin 61584 -> 58166 bytes .../test_mplot3d/errorbar3d_errorevery.png | Bin 0 -> 60878 bytes lib/mpl_toolkits/tests/test_mplot3d.py | 21 +++++++- 4 files changed, 39 insertions(+), 28 deletions(-) create mode 100644 lib/mpl_toolkits/tests/baseline_images/test_mplot3d/errorbar3d_errorevery.png diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index a172a61d3546..f959a18605b7 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2775,7 +2775,7 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', barsabove=False, errorevery=1, ecolor=None, elinewidth=None, capsize=None, capthick=None, xlolims=False, xuplims=False, ylolims=False, yuplims=False, zlolims=False, zuplims=False, - **kwargs): + arrow_length_ratio=.4, **kwargs): """ Plot lines and/or markers with errorbars around them. @@ -2846,6 +2846,10 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', Used to avoid overlapping error bars when two series share x-axis values. + arrow_length_ratio : float, default: 0.4 + Passed to :meth:`quiver`, the ratio of the arrow head with respect + to the quiver. + Returns ------- errlines : list @@ -2993,12 +2997,6 @@ def _unpack_errs(err, data, lomask, himask): # define the markers used for errorbar caps and limits below # the dictionary key is mapped by the `i_xyz` helper dictionary capmarker = {0: '|', 1: '|', 2: '_'} - limmarker = {0: {'lower': art3d.lines.CARETRIGHT, - 'upper': art3d.lines.CARETLEFT}, - 1: {'lower': art3d.lines.CARETRIGHT, - 'upper': art3d.lines.CARETLEFT}, - 2: {'lower': art3d.lines.CARETUP, - 'upper': art3d.lines.CARETDOWN}} i_xyz = {'x': 0, 'y': 1, 'z': 2} # loop over x-, y-, and z-direction and draw relevant elements @@ -3015,7 +3013,6 @@ def _unpack_errs(err, data, lomask, himask): if not np.iterable(err): err = [err] * len(data) - # FIXME: err data is not supposed to be transformed into arrays! err = np.atleast_1d(err) # arrays fine here, they are booleans and hence not units @@ -3052,28 +3049,25 @@ def _unpack_errs(err, data, lomask, himask): caplines.append(cap_hi) if (lolims | uplims).any(): - # FIXME: using markers for limits isn't the best idea: for - # example, 180 deg rotation around z-axis would flip - # the markers around... However, this solution is - # spiritually close to that of 2d errorbar function limits = [ _unpack_errs(err*dir_vector[i], coord, uplims, lolims) for i, coord in enumerate([x, y, z])] - (xlo, xup), (ylo, yup), (zlo, zup) = limits - lolims_xyz = _mask_lists(xup, yup, zup, lolims & everymask) - uplims_xyz = _mask_lists(xlo, ylo, zlo, uplims & everymask) - - lims_lo = art3d.Line3D(*lolims_xyz, ls='', - marker=limmarker[i_zdir]['lower'], - **eb_cap_style) - lims_up = art3d.Line3D(*uplims_xyz, ls='', - marker=limmarker[i_zdir]['upper'], - **eb_cap_style) - self.add_line(lims_lo) - self.add_line(lims_up) - limmarks.append(lims_lo) - limmarks.append(lims_up) + (xlo, xup), (ylo, yup), (zlo, zup) = limits + lomask = lolims & everymask + upmask = uplims & everymask + lolims_xyz = _mask_lists(xlo, ylo, zlo, upmask) + uplims_xyz = _mask_lists(xup, yup, zup, lomask) + lo_xyz = _mask_lists(x, y, z, upmask) + up_xyz = _mask_lists(x, y, z, lomask) + + x0, y0, z0 = np.vstack([np.c_[lo_xyz], + np.c_[up_xyz]]).T + dx, dy, dz = np.vstack([np.c_[lolims_xyz] - np.c_[lo_xyz], + np.c_[uplims_xyz] - np.c_[up_xyz]]).T + self.quiver(x0, y0, z0, dx, dy, dz, + arrow_length_ratio=arrow_length_ratio, + **eb_lines_style) errline = art3d.Line3DCollection(np.array(coorderr).T, **eb_lines_style) diff --git a/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/errorbar3d.png b/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/errorbar3d.png index a96324f60302496eb09c45af2e2dce85bdc77e4c..47c22afa12e8adb40a25c9e62e4b9b06fab829c2 100644 GIT binary patch literal 58166 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 G3i>Y`3~hA) literal 61584 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 diff --git a/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/errorbar3d_errorevery.png b/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/errorbar3d_errorevery.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6bd85e43eff4e8abb1d69e217fc4f6e60d3334 GIT binary patch literal 60878 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ⅆ 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 shuBLl1*jji+RWUlwcd+W-In literal 0 HcmV?d00001 diff --git a/lib/mpl_toolkits/tests/test_mplot3d.py b/lib/mpl_toolkits/tests/test_mplot3d.py index 639c7f1ecc1d..449d179f9b02 100644 --- a/lib/mpl_toolkits/tests/test_mplot3d.py +++ b/lib/mpl_toolkits/tests/test_mplot3d.py @@ -918,8 +918,9 @@ def test_minor_ticks(): ax.set_zticklabels(["half"], minor=True) -@mpl3d_image_comparison(['errorbar3d.png'], tol=0.03) -def test_errorbar3d(): +@mpl3d_image_comparison(['errorbar3d_errorevery.png'], tol=0.03) +def test_errorbar3d_errorevery(): + """Tests errorevery functionality for 3d errorbars.""" t = np.arange(0, 2*np.pi+.1, 0.01) x, y, z = np.sin(t), np.cos(3*t), np.sin(5*t) @@ -934,3 +935,19 @@ def test_errorbar3d(): ax.errorbar(x, y, z, 0.2, zuplims=zuplims, zlolims=zlolims, errorevery=estep) + + +@mpl3d_image_comparison(['errorbar3d.png'], tol=0.03) +def test_errorbar3d(): + """Tests limits, color styling, and legend for 3d errorbars.""" + fig = plt.figure() + ax = fig.gca(projection='3d') + + d = [1, 2, 3, 4, 5] + e = [.5, .5, .5, .5, .5] + ax.errorbar(x=d, y=d, z=d, xerr=e, yerr=e, zerr=e, capsize=3, + zuplims=[False, True, False, True, True], + zlolims=[True, False, False, True, False], + yuplims=True, + ecolor='purple', label='Error lines') + ax.legend() From 159b6b5d35d4bb22be88148676381d999ad884aa Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Wed, 13 May 2020 16:38:29 +0200 Subject: [PATCH 28/35] refactor numpy array handling --- lib/mpl_toolkits/mplot3d/axes3d.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index f959a18605b7..3f0b19910d05 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2984,8 +2984,9 @@ def _unpack_errs(err, data, lomask, himask): _lomask = lomask | ((lomask == himask) & everymask) _himask = himask | ((lomask == himask) & everymask) - lows = [d - e if m else d for d, e, m in zip(data, err, _lomask)] - highs = [d + e if m else d for d, e, m in zip(data, err, _himask)] + lows = np.where(_lomask, data - err, data) + highs = np.where(_himask, data + err, data) + return lows, highs # collect drawn items while looping over the three coordinates @@ -3061,10 +3062,11 @@ def _unpack_errs(err, data, lomask, himask): lo_xyz = _mask_lists(x, y, z, upmask) up_xyz = _mask_lists(x, y, z, lomask) - x0, y0, z0 = np.vstack([np.c_[lo_xyz], - np.c_[up_xyz]]).T - dx, dy, dz = np.vstack([np.c_[lolims_xyz] - np.c_[lo_xyz], - np.c_[uplims_xyz] - np.c_[up_xyz]]).T + x0, y0, z0 = x0, y0, z0 = np.concatenate([lo_xyz, up_xyz], + axis=-1) + dx, dy, dz = np.concatenate([ + np.array(lolims_xyz) - np.array(lo_xyz), + np.array(uplims_xyz) - np.array(up_xyz)], axis=-1) self.quiver(x0, y0, z0, dx, dy, dz, arrow_length_ratio=arrow_length_ratio, **eb_lines_style) From 5db6976812a2ac7ed204b70ac18c818246bfeec7 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Wed, 13 May 2020 17:28:28 +0200 Subject: [PATCH 29/35] allow for (2, N)-shaped errorbar input + small numpy refactors --- lib/mpl_toolkits/mplot3d/axes3d.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 3f0b19910d05..1c5807dd02f2 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2976,16 +2976,21 @@ def _mask_lists(xs, ys, zs, mask=None): zs = [l for l, m in zip(zs, mask) if m] return xs, ys, zs - # TODO: errors can be only a scalar number or len(N) array-like def _unpack_errs(err, data, lomask, himask): + # For separate +/- error values we need to unpack err + if len(err.shape) == 2: + low_err, high_err = err + else: + low_err, high_err = err, err + # for compatibility with the 2d errorbar function, when both upper # and lower limits specified, we need to draw the markers / line - # whether or not using both limits makes any sense (it doesn't) _lomask = lomask | ((lomask == himask) & everymask) _himask = himask | ((lomask == himask) & everymask) - lows = np.where(_lomask, data - err, data) - highs = np.where(_himask, data + err, data) + lows = np.where(_lomask, data - low_err, data) + highs = np.where(_himask, data + high_err, data) return lows, highs @@ -3057,16 +3062,13 @@ def _unpack_errs(err, data, lomask, himask): (xlo, xup), (ylo, yup), (zlo, zup) = limits lomask = lolims & everymask upmask = uplims & everymask - lolims_xyz = _mask_lists(xlo, ylo, zlo, upmask) - uplims_xyz = _mask_lists(xup, yup, zup, lomask) - lo_xyz = _mask_lists(x, y, z, upmask) - up_xyz = _mask_lists(x, y, z, lomask) - - x0, y0, z0 = x0, y0, z0 = np.concatenate([lo_xyz, up_xyz], - axis=-1) - dx, dy, dz = np.concatenate([ - np.array(lolims_xyz) - np.array(lo_xyz), - np.array(uplims_xyz) - np.array(up_xyz)], axis=-1) + lolims_xyz = np.array(_mask_lists(xlo, ylo, zlo, upmask)) + uplims_xyz = np.array(_mask_lists(xup, yup, zup, lomask)) + lo_xyz = np.array(_mask_lists(x, y, z, upmask)) + up_xyz = np.array(_mask_lists(x, y, z, lomask)) + x0, y0, z0 = np.concatenate([lo_xyz, up_xyz], axis=-1) + dx, dy, dz = np.concatenate([lolims_xyz - lo_xyz, + uplims_xyz - up_xyz], axis=-1) self.quiver(x0, y0, z0, dx, dy, dz, arrow_length_ratio=arrow_length_ratio, **eb_lines_style) @@ -3079,7 +3081,6 @@ def _unpack_errs(err, data, lomask, himask): coorderrs = np.array(coorderrs) - # TODO: errors can be only a scalar number or len(N) array-like def _digout_minmax(err_arr, coord_label): return (np.nanmin(err_arr[:, i_xyz[coord_label], :, :]), np.nanmax(err_arr[:, i_xyz[coord_label], :, :])) From 3c7c0de7524d7264b02dcd303a6c6a00cb06572c Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Thu, 14 May 2020 11:21:45 +0200 Subject: [PATCH 30/35] add numpy refactor as per PR suggestion Co-authored-by: Eric Wieser --- lib/mpl_toolkits/mplot3d/axes3d.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 1c5807dd02f2..ff9d8bb235b6 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2986,8 +2986,9 @@ def _unpack_errs(err, data, lomask, himask): # for compatibility with the 2d errorbar function, when both upper # and lower limits specified, we need to draw the markers / line - # whether or not using both limits makes any sense (it doesn't) - _lomask = lomask | ((lomask == himask) & everymask) - _himask = himask | ((lomask == himask) & everymask) + common_mask = (lomask == himask) & everymask + _lomask = lomask | common_mask + _himask = himask | common_mask lows = np.where(_lomask, data - low_err, data) highs = np.where(_himask, data + high_err, data) From 3a99be8630f37b57c004b7e4da37006b34dd84bf Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Wed, 20 May 2020 20:11:51 +0200 Subject: [PATCH 31/35] add numpy refactror for errorbar3d example Co-authored-by: Eric Wieser --- examples/mplot3d/errorbar3d.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/mplot3d/errorbar3d.py b/examples/mplot3d/errorbar3d.py index ea92c3b75a79..7d8599d9cf2a 100644 --- a/examples/mplot3d/errorbar3d.py +++ b/examples/mplot3d/errorbar3d.py @@ -17,10 +17,9 @@ x, y, z = np.sin(t), np.cos(3*t), np.sin(5*t) estep = 15 -zuplims = [True if (not i % estep and i // estep % 3 == 0) - else False for i in range(t.size)] -zlolims = [True if (not i % estep and i // estep % 3 == 2) - else False for i in range(t.size)] +i = np.arange(t.size) +zuplims = (i % estep == 0) & (i // estep % 3 == 0) +zlolims = (i % estep == 0) & (i // estep % 3 == 2) ax.errorbar(x, y, z, 0.2, zuplims=zuplims, zlolims=zlolims, errorevery=estep) From 1a6f58a731893cc53d334213529c71c5169a3663 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Wed, 20 May 2020 20:14:37 +0200 Subject: [PATCH 32/35] add numpy refactor for errorbar3d unit test --- lib/mpl_toolkits/tests/test_mplot3d.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/mpl_toolkits/tests/test_mplot3d.py b/lib/mpl_toolkits/tests/test_mplot3d.py index 449d179f9b02..b0c52e050bc5 100644 --- a/lib/mpl_toolkits/tests/test_mplot3d.py +++ b/lib/mpl_toolkits/tests/test_mplot3d.py @@ -928,10 +928,9 @@ def test_errorbar3d_errorevery(): ax = fig.gca(projection='3d') estep = 15 - zuplims = [True if (not i % estep and i // estep % 3 == 0) - else False for i in range(t.size)] - zlolims = [True if (not i % estep and i // estep % 3 == 2) - else False for i in range(t.size)] + i = np.arange(t.size) + zuplims = (i % estep == 0) & (i // estep % 3 == 0) + zlolims = (i % estep == 0) & (i // estep % 3 == 2) ax.errorbar(x, y, z, 0.2, zuplims=zuplims, zlolims=zlolims, errorevery=estep) From 0d8c3e34d3c658aa1630c37832c18e1f6333775e Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Thu, 18 Jun 2020 18:33:56 +0200 Subject: [PATCH 33/35] port most of the changes done in #15037 for 2d errorbars --- lib/mpl_toolkits/mplot3d/axes3d.py | 46 +++++++++++++++++------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 55e94672b7b1..a00e9e284396 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -12,6 +12,7 @@ from collections import defaultdict from functools import reduce +from itertools import compress import math import textwrap @@ -2972,10 +2973,14 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', symbols. Default is below. xlolims, ylolims, zlolims : bool, default: False - These arguments can be used to indicate that a value gives - only lower limits. In that case a caret symbol is being - drawn to indicate this. lims-arguments may be of the same - type as *xerr* and *yerr*. + These arguments can be used to indicate that a value gives only + lower limits. In that case a caret symbol is used to indicate + this. *lims*-arguments may be scalars, or array-likes of the same + length as the errors. To use limits with inverted axes, + `~.Axes.set_xlim` or `~.Axes.set_ylim` must be called before + :meth:`errorbar`. Note the tricky parameter names: setting e.g. + *ylolims* to True means that the y-value is a *lower* limit of the + True value, so, only an *upward*-pointing arrow will be drawn! xuplims, yuplims, zuplims : bool, default: False Same as above, but for controlling the upper limits. @@ -3052,6 +3057,9 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', y = y if np.iterable(y) else [y] z = z if np.iterable(z) else [z] + if not len(x) == len(y) == len(z): + raise ValueError("'x', 'y', and 'z' must have the same size") + # make the style dict for the 'normal' plot line if 'zorder' not in kwargs: kwargs['zorder'] = 2 @@ -3112,14 +3120,12 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', everymask = np.zeros(len(x), bool) everymask[offset::errorevery] = True - def _mask_lists(xs, ys, zs, mask=None): - """Applies a mask to three lists.""" - xs = [l for l, m in zip(xs, mask) if m] - ys = [l for l, m in zip(ys, mask) if m] - zs = [l for l, m in zip(zs, mask) if m] - return xs, ys, zs + def _apply_mask(arrays, mask): + # Return, for each array in *arrays*, the elements for which *mask* + # is True, without using fancy indexing. + return [[*compress(array, mask)] for array in arrays] - def _unpack_errs(err, data, lomask, himask): + def _extract_errs(err, data, lomask, himask): # For separate +/- error values we need to unpack err if len(err.shape) == 2: low_err, high_err = err @@ -3175,15 +3181,15 @@ def _unpack_errs(err, data, lomask, himask): # where x/y/z and l/h correspond to dimensions and low/high # positions of errorbars in a dimension we're looping over coorderr = [ - _unpack_errs(err * dir_vector[i], coord, - ~lolims & everymask, ~uplims & everymask) + _extract_errs(err * dir_vector[i], coord, + ~lolims & everymask, ~uplims & everymask) for i, coord in enumerate([x, y, z])] (xl, xh), (yl, yh), (zl, zh) = coorderr # draws capmarkers - flat caps othogonal to the error bars if nolims.any() and capsize > 0: - lo_caps_xyz = _mask_lists(xl, yl, zl, nolims & everymask) - hi_caps_xyz = _mask_lists(xh, yh, zh, nolims & everymask) + lo_caps_xyz = _apply_mask([xl, yl, zl], nolims & everymask) + hi_caps_xyz = _apply_mask([xh, yh, zh], nolims & everymask) # setting '_' for z-caps and '|' for x- and y-caps; # these markers will rotate as the viewing angle changes @@ -3200,16 +3206,16 @@ def _unpack_errs(err, data, lomask, himask): if (lolims | uplims).any(): limits = [ - _unpack_errs(err*dir_vector[i], coord, uplims, lolims) + _extract_errs(err*dir_vector[i], coord, uplims, lolims) for i, coord in enumerate([x, y, z])] (xlo, xup), (ylo, yup), (zlo, zup) = limits lomask = lolims & everymask upmask = uplims & everymask - lolims_xyz = np.array(_mask_lists(xlo, ylo, zlo, upmask)) - uplims_xyz = np.array(_mask_lists(xup, yup, zup, lomask)) - lo_xyz = np.array(_mask_lists(x, y, z, upmask)) - up_xyz = np.array(_mask_lists(x, y, z, lomask)) + lolims_xyz = np.array(_apply_mask([xlo, ylo, zlo], upmask)) + uplims_xyz = np.array(_apply_mask([xup, yup, zup], lomask)) + lo_xyz = np.array(_apply_mask([x, y, z], upmask)) + up_xyz = np.array(_apply_mask([x, y, z], lomask)) x0, y0, z0 = np.concatenate([lo_xyz, up_xyz], axis=-1) dx, dy, dz = np.concatenate([lolims_xyz - lo_xyz, uplims_xyz - up_xyz], axis=-1) From 93c9de562fcf55b021fb05698df16695f46fcca6 Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Sun, 26 Jul 2020 12:45:17 +0200 Subject: [PATCH 34/35] Apply suggestions from code review Co-authored-by: Elliott Sales de Andrade --- lib/mpl_toolkits/mplot3d/axes3d.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index a00e9e284396..9a54cc0e4ab8 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -2929,10 +2929,10 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', Parameters ---------- - x, y, z : scalar or array-like + x, y, z : float or array-like The data positions. - xerr, yerr, zerr : scalar or array-like, optional + xerr, yerr, zerr : float or array-like, shape (N,) or (2, N), optional The errorbar sizes: - scalar: Symmetric +/- values for all data points. @@ -2942,6 +2942,8 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', errors. - *None*: No errorbar. + Note that all error arrays should have *positive* values. + fmt : str, default: '' The format for the data points / data lines. See `.plot` for details. @@ -2953,14 +2955,14 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', The color of the errorbar lines. If None, use the color of the line connecting the markers. - elinewidth : scalar, default: None + elinewidth : float, default: None The linewidth of the errorbar lines. If None, the linewidth of the current style is used. - capsize : scalar, default: :rc:`errorbar.capsize` + capsize : float, default: :rc:`errorbar.capsize` The length of the error bar caps in points. - capthick : scalar, default: None + capthick : float, default: None An alias to the keyword argument *markeredgewidth* (a.k.a. *mew*). This setting is a more sensible name for the property that controls the thickness of the error bar cap in points. For @@ -2987,9 +2989,9 @@ def errorbar(self, x, y, z, zerr=None, yerr=None, xerr=None, fmt='', errorevery : int or (int, int), default: 1 draws error bars on a subset of the data. *errorevery* =N draws - error bars on the points (x[::N], y[::N]). + error bars on the points (x[::N], y[::N], z[::N]). *errorevery* =(start, N) draws error bars on the points - (x[start::N], y[start::N]). e.g. errorevery=(6, 3) + (x[start::N], y[start::N], z[start::N]). e.g. errorevery=(6, 3) adds error bars to the data at (x[6], x[9], x[12], x[15], ...). Used to avoid overlapping error bars when two series share x-axis values. @@ -3186,7 +3188,7 @@ def _extract_errs(err, data, lomask, himask): for i, coord in enumerate([x, y, z])] (xl, xh), (yl, yh), (zl, zh) = coorderr - # draws capmarkers - flat caps othogonal to the error bars + # draws capmarkers - flat caps orthogonal to the error bars if nolims.any() and capsize > 0: lo_caps_xyz = _apply_mask([xl, yl, zl], nolims & everymask) hi_caps_xyz = _apply_mask([xh, yh, zh], nolims & everymask) From 1c732042173565b72025d6306697e21a62667a0c Mon Sep 17 00:00:00 2001 From: Vlas Sokolov Date: Wed, 29 Jul 2020 12:04:50 +0200 Subject: [PATCH 35/35] fix more pr comments --- lib/mpl_toolkits/mplot3d/axes3d.py | 3 +-- lib/mpl_toolkits/tests/test_mplot3d.py | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 9a54cc0e4ab8..8b50ff6300e2 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -3135,8 +3135,7 @@ def _extract_errs(err, data, lomask, himask): low_err, high_err = err, err # for compatibility with the 2d errorbar function, when both upper - # and lower limits specified, we need to draw the markers / line - - # whether or not using both limits makes any sense (it doesn't) + # and lower limits specified, we need to draw the markers / line common_mask = (lomask == himask) & everymask _lomask = lomask | common_mask _himask = himask | common_mask diff --git a/lib/mpl_toolkits/tests/test_mplot3d.py b/lib/mpl_toolkits/tests/test_mplot3d.py index b7a96f305c20..a3643db6fc10 100644 --- a/lib/mpl_toolkits/tests/test_mplot3d.py +++ b/lib/mpl_toolkits/tests/test_mplot3d.py @@ -975,7 +975,7 @@ def test_minor_ticks(): ax.set_zticklabels(["half"], minor=True) -@mpl3d_image_comparison(['errorbar3d_errorevery.png'], tol=0.03) +@mpl3d_image_comparison(['errorbar3d_errorevery.png']) def test_errorbar3d_errorevery(): """Tests errorevery functionality for 3d errorbars.""" t = np.arange(0, 2*np.pi+.1, 0.01) @@ -993,7 +993,7 @@ def test_errorbar3d_errorevery(): errorevery=estep) -@mpl3d_image_comparison(['errorbar3d.png'], tol=0.03) +@mpl3d_image_comparison(['errorbar3d.png']) def test_errorbar3d(): """Tests limits, color styling, and legend for 3d errorbars.""" fig = plt.figure()