diff --git a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle index 43753c693fea..fed8d48ad1db 100644 --- a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle +++ b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle @@ -213,8 +213,9 @@ axes.prop_cycle : cycler('color', 'bgrcmyk') # single letter, long name, or # web-style hex axes.autolimit_mode : round_numbers -axes.xmargin : 0 # x margin. See `axes.Axes.margins` -axes.ymargin : 0 # y margin See `axes.Axes.margins` +axes.xmargin : 0 # x margin. See `axes.Axes.margins` +axes.ymargin : 0 # y margin. See `axes.Axes.margins` +axes.zmargin : 0 # z margin. See `axes.Axes.margins` axes.spines.bottom : True axes.spines.left : True axes.spines.right : True diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 2ce76acf49d3..8ee74f3cc075 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -157,11 +157,10 @@ def __init__( self.xy_viewLim = Bbox.unit() self.zz_viewLim = Bbox.unit() - xymargin = 0.05 * 10/11 # match mpl3.8 appearance - self.xy_dataLim = Bbox([[xymargin, xymargin], - [1 - xymargin, 1 - xymargin]]) - # z-limits are encoded in the x-component of the Bbox, y is un-used - self.zz_dataLim = Bbox.unit() + self._xmargin = mpl.rcParams['axes.xmargin'] + self._ymargin = mpl.rcParams['axes.ymargin'] + self._zmargin = mpl.rcParams['axes.zmargin'] + self._init_dataLims() # inhibit autoscale_view until the axes are defined # they can't be defined until Axes.__init__ has been called @@ -602,6 +601,25 @@ def margins(self, *margins, x=None, y=None, z=None, tight=True): scalez=(z is not None) ) + def _init_dataLims(self): + """Reset dataLim bboxes for empty-plot defaults. + + The per-axis padding ensures that the margin expansion in autoscale_view + cancels out exactly, landing on [0, 1] for empty plots. + """ + def pad(margin): + # Note margin is validated to be > -0.5 in rcParams and set_x/y/zmargin + return margin / (1 + 2 * margin) if margin > 0 else 0 + + xpad = pad(self._xmargin) + ypad = pad(self._ymargin) + zpad = pad(self._zmargin) + self.xy_dataLim = Bbox([[xpad, ypad], + [1 - xpad, 1 - ypad]]) + # z-limits are encoded in the x-component of the Bbox, y is un-used + self.zz_dataLim = Bbox([[zpad, 0], + [1 - zpad, 1]]) + def autoscale(self, enable=True, axis='both', tight=None): """ Convenience method for simple axis view autoscaling. @@ -1142,18 +1160,6 @@ def _set_axis_scale(self, axis, value, **kwargs): **kwargs Forwarded to scale constructor. """ - # For non-linear scales on the z-axis, switch from the [0, 1] + - # margin=0 representation to the same xymargin + margin=0.05 - # representation that x/y use. Both produce identical linear limits, - # but only the xymargin form has valid positive lower bounds for log - # etc. This must happen before _set_axes_scale because that triggers - # autoscale_view internally. - if (axis is self.zaxis and value != 'linear' - and np.array_equal(self.zz_dataLim.get_points(), [[0, 0], [1, 1]])): - xymargin = 0.05 * 10/11 - self.zz_dataLim = Bbox([[xymargin, xymargin], - [1 - xymargin, 1 - xymargin]]) - self._zmargin = self._xmargin axis._set_axes_scale(value, **kwargs) def set_xscale(self, value, **kwargs): @@ -1556,16 +1562,8 @@ def shareview(self, other): def clear(self): # docstring inherited. super().clear() - if self._focal_length == np.inf: - self._zmargin = mpl.rcParams['axes.zmargin'] - else: - self._zmargin = 0. - - xymargin = 0.05 * 10/11 # match mpl3.8 appearance - self.xy_dataLim = Bbox([[xymargin, xymargin], - [1 - xymargin, 1 - xymargin]]) - # z-limits are encoded in the x-component of the Bbox, y is un-used - self.zz_dataLim = Bbox.unit() + self._zmargin = mpl.rcParams['axes.zmargin'] # x, y are set in super().clear() + self._init_dataLims() self._view_margin = 1/48 # default value to match mpl3.8 self.autoscale_view() @@ -3235,9 +3233,6 @@ def scatter(self, xs, ys, zs=0, zdir='z', s=20, c=None, depthshade=None, depthshade_minalpha=depthshade_minalpha, axlim_clip=axlim_clip, ) - if self._zmargin < 0.05 and xs.size > 0: - self.set_zmargin(0.05) - self.auto_scale_xyz(xs, ys, zs, had_data) return patches diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/aspects.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/aspects.png index 764e3c0b8837..2e924d374d71 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/aspects.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/aspects.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/aspects_adjust_box.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/aspects_adjust_box.png index 3d43e4e9c5d5..229d468335ea 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/aspects_adjust_box.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/aspects_adjust_box.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/bar3d.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/bar3d.png index 852da9e4f066..811d96fec8bd 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/bar3d.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/bar3d.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/bar3d_notshaded.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/bar3d_notshaded.png index dc9c40eedc6c..de64eef375b4 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/bar3d_notshaded.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/bar3d_notshaded.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/bar3d_shaded.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/bar3d_shaded.png index dd8e2a1f76fe..e67c275a164b 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/bar3d_shaded.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/bar3d_shaded.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/computed_zorder.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/computed_zorder.png index 8e6b6f11602b..da6cefb16186 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/computed_zorder.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/computed_zorder.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/errorbar3d.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/errorbar3d.png index d53ede165cd2..3bd0a966251c 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/errorbar3d.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/errorbar3d.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/errorbar3d_errorevery.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/errorbar3d_errorevery.png index 455da1901561..eb2360e66e08 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/errorbar3d_errorevery.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/errorbar3d_errorevery.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/fill_between_polygon.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/fill_between_polygon.png index f1f160fe5579..36384659e553 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/fill_between_polygon.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/fill_between_polygon.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/fill_between_quad.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/fill_between_quad.png index e405bcffb965..ef4e07e642e8 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/fill_between_quad.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/fill_between_quad.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/lines3d.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/lines3d.png index c900cd02e87a..56f7e62548ef 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/lines3d.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/lines3d.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/plot_3d_from_2d.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/plot_3d_from_2d.png index f6164696bcb9..db7ff33ec937 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/plot_3d_from_2d.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/plot_3d_from_2d.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/quiver3d_colorcoded.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/quiver3d_colorcoded.png index 09b27c306c61..40c2fd807a7d 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/quiver3d_colorcoded.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/quiver3d_colorcoded.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/quiver3d_masked.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/quiver3d_masked.png index 5f9aaa95ff70..6b4dced2c57c 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/quiver3d_masked.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/quiver3d_masked.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/scale3d_artists_log.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/scale3d_artists_log.png index b2538ffb85c0..224bfc526d2a 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/scale3d_artists_log.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/scale3d_artists_log.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/stem3d.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/stem3d.png index 468c684081dd..01b84aac4c93 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/stem3d.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/stem3d.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_label_offset_tick_position.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_label_offset_tick_position.png index 6f72d0483daa..b29fe77ebc28 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_label_offset_tick_position.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_label_offset_tick_position.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_masked.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_masked.png index 9e5af36ffbfc..253e0a165508 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_masked.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_masked.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_masked_strides.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_masked_strides.png index 0277b8f8a610..7545964422f9 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_masked_strides.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_masked_strides.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_zsort_inf.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_zsort_inf.png index d533e6a40235..fcfec364c092 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_zsort_inf.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/surface3d_zsort_inf.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/tricontour.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/tricontour.png index 99fb15b6bcea..3667cb334603 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/tricontour.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/tricontour.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/trisurf3d.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/trisurf3d.png index ea09aadd995f..4671b7590e91 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/trisurf3d.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/trisurf3d.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/trisurf3d_shaded.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/trisurf3d_shaded.png index 24e0e1368890..3f5cf9e97ab1 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/trisurf3d_shaded.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/trisurf3d_shaded.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-alpha.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-alpha.png index 3a342051a7b3..569f3c45765a 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-alpha.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-alpha.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-edge-style.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-edge-style.png index 69d6b4833f6e..f23a001b70c7 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-edge-style.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-edge-style.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-named-colors.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-named-colors.png index 33dfc2f2313a..b4f106919405 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-named-colors.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-named-colors.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-rgb-data.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-rgb-data.png index cd8a3d046cdd..96548007477a 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-rgb-data.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-rgb-data.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-simple.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-simple.png index 37eb5e6c9888..1ee98766c0c2 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-simple.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-simple.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-xyz.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-xyz.png index 628eddacd78f..6bcb438c4544 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-xyz.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/voxels-xyz.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3d.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3d.png index fb8b7df65ae4..aed30fb1e25c 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3d.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3d.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3dasymmetric.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3dasymmetric.png index 18a4312497b3..65aa76bd863b 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3dasymmetric.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3dasymmetric.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3dzerocstride.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3dzerocstride.png index 7e4cf6a0c014..d858d3abe8ac 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3dzerocstride.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3dzerocstride.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3dzerorstride.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3dzerorstride.png index b2ec3ee4bdc7..a51679f476eb 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3dzerorstride.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/wireframe3dzerorstride.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_legend3d/legend_bar.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_legend3d/legend_bar.png index 8203aebae0ec..1182c6fc8d10 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_legend3d/legend_bar.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_legend3d/legend_bar.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_legend3d/legend_plot.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_legend3d/legend_plot.png index 724ebe25c736..a07f0232d006 100644 Binary files a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_legend3d/legend_plot.png and b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_legend3d/legend_plot.png differ diff --git a/lib/mpl_toolkits/mplot3d/tests/test_axes3d.py b/lib/mpl_toolkits/mplot3d/tests/test_axes3d.py index 1e150f1c92c8..c9a4ac43c6b8 100644 --- a/lib/mpl_toolkits/mplot3d/tests/test_axes3d.py +++ b/lib/mpl_toolkits/mplot3d/tests/test_axes3d.py @@ -161,7 +161,7 @@ def test_bar3d_colors(): ax.bar3d(xs, ys, zs, 1, 1, 1, color=c) -@mpl3d_image_comparison(['bar3d_shaded.png'], style='mpl20') +@mpl3d_image_comparison(['bar3d_shaded.png'], tol=0.035, style='mpl20') def test_bar3d_shaded(): x = np.arange(4) y = np.arange(5) @@ -299,7 +299,6 @@ def test_contourf3d_extend(fig_test, fig_ref, extend, levels): @mpl3d_image_comparison(['tricontour.png'], tol=0.02, style='mpl20') def test_tricontour(): - plt.rcParams['axes3d.automargin'] = True # Remove when image is regenerated fig = plt.figure() np.random.seed(19680801) @@ -587,7 +586,7 @@ def test_marker_draw_order_view_rotated(fig_test, fig_ref): ax.view_init(elev=0, azim=azim - 180, roll=0) # view rotated by 180 deg -@mpl3d_image_comparison(['plot_3d_from_2d.png'], tol=0.019, style='mpl20') +@mpl3d_image_comparison(['plot_3d_from_2d.png'], tol=0.03, style='mpl20') def test_plot_3d_from_2d(): fig = plt.figure() ax = fig.add_subplot(projection='3d') @@ -1509,7 +1508,7 @@ def test_alpha(self): assert isinstance(poly, art3d.Poly3DCollection) @mpl3d_image_comparison(['voxels-xyz.png'], remove_text=False, style='mpl20', - tol=0.002 if sys.platform == 'win32' else 0) + tol=0 if platform.machine() == 'x86_64' else 0.008) def test_xyz(self): fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) @@ -1739,7 +1738,7 @@ def test_errorbar3d(): @image_comparison(['stem3d.png'], style='mpl20', - tol=0 if platform.machine() == 'x86_64' else 0.008) + tol=0 if platform.machine() == 'x86_64' else 0.01) def test_stem3d(): fig, axs = plt.subplots(2, 3, figsize=(8, 6), constrained_layout=True, @@ -2209,7 +2208,6 @@ def test_subfigure_simple(): @image_comparison(['computed_zorder.png'], remove_text=True, style='mpl20') def test_computed_zorder(): - plt.rcParams['axes3d.automargin'] = True # Remove when image is regenerated fig = plt.figure() ax1 = fig.add_subplot(221, projection='3d') ax2 = fig.add_subplot(222, projection='3d') @@ -2664,7 +2662,6 @@ def test_scatter_masked_color(): @mpl3d_image_comparison(['surface3d_zsort_inf.png'], style='mpl20') def test_surface3d_zsort_inf(): - plt.rcParams['axes3d.automargin'] = True # Remove when image is regenerated fig = plt.figure() ax = fig.add_subplot(projection='3d') @@ -2994,6 +2991,72 @@ def test_scale3d_default_limits(scale, expected_lims): np.testing.assert_allclose(get_lim(), expected_lims) +@pytest.mark.parametrize("scale, expected_lims", [ + ("linear", (0.041666666666666664, 0.9583333333333334)), + ("log", (0.08519612008506527, 1.056386134839687)), + ("symlog", (0.04166666666666668, 0.9583333333333334)), + ("logit", (0.0746298566901612, 0.9253701433098389)), + ("asinh", (0.04815235510959675, 0.9707897299792895)), +]) +@mpl.style.context("default") +def test_scale3d_automargin_limits(scale, expected_lims): + """Axis limits with data and automargin should be correct for each scale.""" + fig = plt.figure() + ax = fig.add_subplot(projection='3d') + ax.set_xscale(scale) + ax.set_yscale(scale) + ax.set_zscale(scale) + ax.plot([0.1, 0.9], [0.1, 0.9], [0.1, 0.9]) + fig.canvas.draw() + + for get_lim in (ax.get_xlim, ax.get_ylim, ax.get_zlim): + np.testing.assert_allclose(get_lim(), expected_lims) + + +@pytest.mark.parametrize("scale, expected_lims", [ + ("linear", (0.08333333333333334, 0.9166666666666667)), + ("log", (0.09552563816905349, 0.9421554435545909)), + ("symlog", (0.08333333333333334, 0.9166666666666667)), + ("logit", (0.09205683697189532, 0.9079431630281046)), + ("asinh", (0.08516517850312533, 0.9199719582595468)), +]) +@mpl.style.context("default") +def test_scale3d_zero_margin_limits(scale, expected_lims): + """Axis limits with data and zero margins should be correct for each scale. + + Limits are not exactly (0.1, 0.9) because view_margin still applies. + """ + fig = plt.figure() + ax = fig.add_subplot(projection='3d') + ax.set_xscale(scale) + ax.set_yscale(scale) + ax.set_zscale(scale) + ax.margins(0) + ax.plot([0.1, 0.9], [0.1, 0.9], [0.1, 0.9]) + fig.canvas.draw() + + for get_lim in (ax.get_xlim, ax.get_ylim, ax.get_zlim): + np.testing.assert_allclose(get_lim(), expected_lims) + + +@pytest.mark.parametrize("scale", ["linear", "log", "symlog", "logit", "asinh"]) +@mpl.style.context("default") +def test_scale3d_explicit_limits(scale): + """Explicitly set limits should be honored exactly for each scale.""" + fig = plt.figure() + ax = fig.add_subplot(projection='3d') + ax.set_xscale(scale) + ax.set_yscale(scale) + ax.set_zscale(scale) + ax.set_xlim(0.1, 0.9) + ax.set_ylim(0.1, 0.9) + ax.set_zlim(0.1, 0.9) + fig.canvas.draw() + + for get_lim in (ax.get_xlim, ax.get_ylim, ax.get_zlim): + np.testing.assert_allclose(get_lim(), (0.1, 0.9)) + + @check_figures_equal() @pytest.mark.filterwarnings("ignore:Data has no positive values") def test_scale3d_all_clipped(fig_test, fig_ref):