From 14bd0140c56d99b28913c27e0cb9d5c1059b2d2c Mon Sep 17 00:00:00 2001 From: Scott Shambaugh Date: Tue, 16 Aug 2022 22:23:47 -0600 Subject: [PATCH 1/4] Put edge-on axes on left and right when viewing 3d axis planes Tests Fix broken tests Clean up test --- lib/mpl_toolkits/mplot3d/axis3d.py | 20 ++++++++--- .../test_mplot3d/axes3d_primary_views.png | Bin 0 -> 10749 bytes .../test_mplot3d/axes3d_rotated.png | Bin 20696 -> 20940 bytes lib/mpl_toolkits/tests/test_mplot3d.py | 32 ++++++++++++++---- 4 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 lib/mpl_toolkits/tests/baseline_images/test_mplot3d/axes3d_primary_views.png diff --git a/lib/mpl_toolkits/mplot3d/axis3d.py b/lib/mpl_toolkits/mplot3d/axis3d.py index fff4a4f71701..2e12cf5adc98 100644 --- a/lib/mpl_toolkits/mplot3d/axis3d.py +++ b/lib/mpl_toolkits/mplot3d/axis3d.py @@ -231,11 +231,23 @@ def _get_coord_info(self, renderer): bounds_proj = self.axes.tunit_cube(bounds, self.axes.M) # Determine which one of the parallel planes are higher up: - highs = np.zeros(3, dtype=bool) + means_z0 = np.zeros(3) + means_z1 = np.zeros(3) for i in range(3): - mean_z0 = np.mean(bounds_proj[self._PLANES[2 * i], 2]) - mean_z1 = np.mean(bounds_proj[self._PLANES[2 * i + 1], 2]) - highs[i] = mean_z0 < mean_z1 + means_z0[i] = np.mean(bounds_proj[self._PLANES[2 * i], 2]) + means_z1[i] = np.mean(bounds_proj[self._PLANES[2 * i + 1], 2]) + highs = means_z0 < means_z1 + + # Special handling for edge-on views + equals = np.abs(means_z0 - means_z1) <= np.finfo(float).eps + if np.sum(equals) == 2: + vertical = np.where(np.invert(equals))[0][0] + if vertical == 2: # looking at XY plane + highs = np.array([True, True, highs[2]]) + elif vertical == 1: # looking at XZ plane + highs = np.array([True, highs[1], False]) + elif vertical == 0: # looking at YZ plane + highs = np.array([highs[0], False, False]) return mins, maxs, centers, deltas, bounds_proj, highs diff --git a/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/axes3d_primary_views.png b/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/axes3d_primary_views.png new file mode 100644 index 0000000000000000000000000000000000000000..025156f34d39ed56c9b1633228a0357bb20f0c6b GIT binary patch literal 10749 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 K3b=D-cmD_J1ib11 literal 0 HcmV?d00001 diff --git a/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/axes3d_rotated.png b/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/axes3d_rotated.png index 0c79fd32e42c28a3c1a8ab22d9b325a8df2c8c44..9e7193d6b3261b95b85d095dbaeb368f64bb372b 100644 GIT binary patch literal 20940 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 Q7=DVjx~^KnX7h9Z3nplL$p8QV diff --git a/lib/mpl_toolkits/tests/test_mplot3d.py b/lib/mpl_toolkits/tests/test_mplot3d.py index ea5a000f0d70..48a1bb9b70b4 100644 --- a/lib/mpl_toolkits/tests/test_mplot3d.py +++ b/lib/mpl_toolkits/tests/test_mplot3d.py @@ -60,6 +60,26 @@ def test_axes3d_repr(): "title={'center': 'title'}, xlabel='x', ylabel='y', zlabel='z'>") +@mpl3d_image_comparison(['axes3d_primary_views.png']) +def test_axes3d_primary_views(): + # (elev, azim, roll) + views = [(90, -90, 0), # XY + (0, -90, 0), # XZ + (0, 0, 0), # YZ + (-90, 90, 0), # -XY + (0, 90, 0), # -XZ + (0, 180, 0)] # -YZ + # When viewing primary planes, draw the two other axes on left and bottom + fig, axs = plt.subplots(2, 3, subplot_kw={'projection': '3d'}) + for i, ax in enumerate([ax for ax_row in axs for ax in ax_row]): + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + ax.set_proj_type('ortho') + ax.view_init(elev=views[i][0], azim=views[i][1], roll=views[i][2]) + plt.tight_layout() + + @mpl3d_image_comparison(['bar3d.png']) def test_bar3d(): fig = plt.figure() @@ -1839,9 +1859,9 @@ def test_scatter_spiral(): [0.0, 0.0, -1.142857, 10.571429], ], [ - ([0.06329114, -0.06329114], [-0.04746835, -0.04746835]), - ([-0.06329114, -0.06329114], [0.04746835, -0.04746835]), - ([0.05617978, 0.06329114], [-0.04213483, -0.04746835]), + ([-0.06329114, 0.06329114], [0.04746835, 0.04746835]), + ([0.06329114, 0.06329114], [-0.04746835, 0.04746835]), + ([-0.05617978, -0.06329114], [0.04213483, 0.04746835]), ], [2, 2, 0], ), @@ -1854,9 +1874,9 @@ def test_scatter_spiral(): [0.0, -1.142857, 0.0, 10.571429], ], [ - ([-0.06329114, -0.06329114], [-0.04746835, 0.04746835]), - ([0.06329114, 0.05617978], [-0.04746835, -0.04213483]), - ([0.06329114, -0.06329114], [-0.04746835, -0.04746835]), + ([-0.06329114, -0.06329114], [0.04746835, -0.04746835]), + ([0.06329114, 0.05617978], [0.04746835, 0.04213483]), + ([0.06329114, -0.06329114], [0.04746835, 0.04746835]), ], [1, 2, 1], ), From 7ee6161d36ed5056bc9a4723aa90c61cdcf31ca3 Mon Sep 17 00:00:00 2001 From: Scott Shambaugh <14363975+scottshambaugh@users.noreply.github.com> Date: Thu, 18 Aug 2022 10:35:16 -0600 Subject: [PATCH 2/4] Update lib/mpl_toolkits/tests/test_mplot3d.py --- lib/mpl_toolkits/tests/test_mplot3d.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/mpl_toolkits/tests/test_mplot3d.py b/lib/mpl_toolkits/tests/test_mplot3d.py index 48a1bb9b70b4..dbd8ab8e7076 100644 --- a/lib/mpl_toolkits/tests/test_mplot3d.py +++ b/lib/mpl_toolkits/tests/test_mplot3d.py @@ -69,7 +69,8 @@ def test_axes3d_primary_views(): (-90, 90, 0), # -XY (0, 90, 0), # -XZ (0, 180, 0)] # -YZ - # When viewing primary planes, draw the two other axes on left and bottom + # When viewing primary planes, draw the two visible axes so they intersect + # at their low values fig, axs = plt.subplots(2, 3, subplot_kw={'projection': '3d'}) for i, ax in enumerate([ax for ax_row in axs for ax in ax_row]): ax.set_xlabel('x') From eadeed55446851739b9f4c815b03ce30883916d3 Mon Sep 17 00:00:00 2001 From: Scott Shambaugh <14363975+scottshambaugh@users.noreply.github.com> Date: Thu, 18 Aug 2022 17:57:56 -0600 Subject: [PATCH 3/4] Update lib/mpl_toolkits/tests/test_mplot3d.py Co-authored-by: Elliott Sales de Andrade --- lib/mpl_toolkits/tests/test_mplot3d.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mpl_toolkits/tests/test_mplot3d.py b/lib/mpl_toolkits/tests/test_mplot3d.py index dbd8ab8e7076..eb9578c57b2a 100644 --- a/lib/mpl_toolkits/tests/test_mplot3d.py +++ b/lib/mpl_toolkits/tests/test_mplot3d.py @@ -72,7 +72,7 @@ def test_axes3d_primary_views(): # When viewing primary planes, draw the two visible axes so they intersect # at their low values fig, axs = plt.subplots(2, 3, subplot_kw={'projection': '3d'}) - for i, ax in enumerate([ax for ax_row in axs for ax in ax_row]): + for i, ax in enumerate(axs.flat): ax.set_xlabel('x') ax.set_ylabel('y') ax.set_zlabel('z') From d32c4fe39699c34ed1ea6937bfa96cc523971977 Mon Sep 17 00:00:00 2001 From: Scott Shambaugh <14363975+scottshambaugh@users.noreply.github.com> Date: Thu, 18 Aug 2022 18:00:31 -0600 Subject: [PATCH 4/4] Update lib/mpl_toolkits/mplot3d/axis3d.py --- lib/mpl_toolkits/mplot3d/axis3d.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mpl_toolkits/mplot3d/axis3d.py b/lib/mpl_toolkits/mplot3d/axis3d.py index 349999bd8942..24c595c04ca9 100644 --- a/lib/mpl_toolkits/mplot3d/axis3d.py +++ b/lib/mpl_toolkits/mplot3d/axis3d.py @@ -254,7 +254,7 @@ def _get_coord_info(self, renderer): # Special handling for edge-on views equals = np.abs(means_z0 - means_z1) <= np.finfo(float).eps if np.sum(equals) == 2: - vertical = np.where(np.invert(equals))[0][0] + vertical = np.where(~equals)[0][0] if vertical == 2: # looking at XY plane highs = np.array([True, True, highs[2]]) elif vertical == 1: # looking at XZ plane