From 930d9b35b5447e194cb5ced966dcd0640d0dd6e1 Mon Sep 17 00:00:00 2001 From: Tyrone Xiong Date: Wed, 14 Mar 2018 19:44:57 -0400 Subject: [PATCH 1/4] Fix marker overlap Sort points by z coordinate values similar to Poly3DCollection Added: Image comparison tests for marker overlap Fix PEP8 errors Refactored do_projection to use starred expression --- lib/mpl_toolkits/mplot3d/art3d.py | 25 +++++++++++++----- .../scatter3d_overlap_markers_blue.png | Bin 0 -> 18097 bytes .../scatter3d_overlap_markers_yellow.png | Bin 0 -> 18296 bytes lib/mpl_toolkits/tests/test_mplot3d.py | 24 +++++++++++++++++ 4 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 lib/mpl_toolkits/tests/baseline_images/test_mplot3d/scatter3d_overlap_markers_blue.png create mode 100644 lib/mpl_toolkits/tests/baseline_images/test_mplot3d/scatter3d_overlap_markers_yellow.png diff --git a/lib/mpl_toolkits/mplot3d/art3d.py b/lib/mpl_toolkits/mplot3d/art3d.py index 84fc9d155b5f..c9d2e96abfd3 100644 --- a/lib/mpl_toolkits/mplot3d/art3d.py +++ b/lib/mpl_toolkits/mplot3d/art3d.py @@ -494,9 +494,21 @@ def do_3d_projection(self, renderer): ecs = (_zalpha(self._edgecolor3d, vzs) if self._depthshade else self._edgecolor3d) + + # Sort the points based on z coordinates + # Put vzs first to sort based on z value + z_markers = sorted(zip(vzs, np.column_stack([vxs, vys]), fcs, ecs), + reverse=True) + + [zzs, vps, fcs, ecs] = zip(*z_markers) + + fcs = mcolors.to_rgba_array(fcs, self._alpha) ecs = mcolors.to_rgba_array(ecs, self._alpha) + self.set_edgecolors(ecs) - PathCollection.set_offsets(self, np.column_stack([vxs, vys])) + self.set_facecolors(fcs) + + PathCollection.set_offsets(self, vps) return np.min(vzs) if vzs.size else np.nan @@ -663,17 +675,16 @@ def do_3d_projection(self, renderer): in enumerate(zip(xyzlist, cface, cedge))), key=lambda x: x[0], reverse=True) - segments_2d = [s for z, s, fc, ec, idx in z_segments_2d] + [zzs, segments_2d, self._facecolors2d, self._edgecolors2d, idxs] = \ + zip(*z_segments_2d) + if self._codes3d is not None: - codes = [self._codes3d[idx] for z, s, fc, ec, idx in z_segments_2d] + codes = [self._codes3d[idx] for idx in idxs] PolyCollection.set_verts_and_codes(self, segments_2d, codes) else: PolyCollection.set_verts(self, segments_2d, self._closed) - self._facecolors2d = [fc for z, s, fc, ec, idx in z_segments_2d] - if len(self._edgecolors3d) == len(cface): - self._edgecolors2d = [ec for z, s, fc, ec, idx in z_segments_2d] - else: + if len(self._edgecolors3d) != len(cface): self._edgecolors2d = self._edgecolors3d # Return zorder value diff --git a/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/scatter3d_overlap_markers_blue.png b/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/scatter3d_overlap_markers_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..690d41aeddf481f4dadc6421431b99b77270e677 GIT binary patch literal 18097 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 literal 0 HcmV?d00001 diff --git a/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/scatter3d_overlap_markers_yellow.png b/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/scatter3d_overlap_markers_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..4814992b9d9b8e1deb0fba022d033cc3cb488da3 GIT binary patch literal 18296 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 Date: Sat, 2 Nov 2019 16:32:53 +0000 Subject: [PATCH 2/4] Performance optimization of zsort for mplot3d plots --- lib/mpl_toolkits/mplot3d/art3d.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/art3d.py b/lib/mpl_toolkits/mplot3d/art3d.py index c9d2e96abfd3..2036cce975d3 100644 --- a/lib/mpl_toolkits/mplot3d/art3d.py +++ b/lib/mpl_toolkits/mplot3d/art3d.py @@ -496,11 +496,17 @@ def do_3d_projection(self, renderer): self._edgecolor3d) # Sort the points based on z coordinates - # Put vzs first to sort based on z value - z_markers = sorted(zip(vzs, np.column_stack([vxs, vys]), fcs, ecs), - reverse=True) - - [zzs, vps, fcs, ecs] = zip(*z_markers) + # Performance optimization: Create a sorted index array and reorder + # points and point properties according to the index array + z_markers_idx = np.argsort(vzs)[::-1] + + # Re-order items + zzs = vzs[z_markers_idx] + vxs = vxs[z_markers_idx] + vys = vys[z_markers_idx] + fcs = fcs[z_markers_idx] + ecs = ecs[z_markers_idx] + vps = np.vstack((vxs, vys)).T fcs = mcolors.to_rgba_array(fcs, self._alpha) ecs = mcolors.to_rgba_array(ecs, self._alpha) @@ -668,7 +674,7 @@ def do_3d_projection(self, renderer): else: cedge = cedge.repeat(len(xyzlist), axis=0) - # sort by depth (furthest drawn first) + # # sort by depth (furthest drawn first) z_segments_2d = sorted( ((self._zsortfunc(zs), np.column_stack([xs, ys]), fc, ec, idx) for idx, ((xs, ys, zs), fc, ec) From 7cd8c4a4f8334bd442df85c4f5b583d3ab25a192 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Fri, 1 May 2020 20:30:50 +0200 Subject: [PATCH 3/4] Minor corrections --- lib/mpl_toolkits/mplot3d/art3d.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/art3d.py b/lib/mpl_toolkits/mplot3d/art3d.py index 2036cce975d3..311e811dfa79 100644 --- a/lib/mpl_toolkits/mplot3d/art3d.py +++ b/lib/mpl_toolkits/mplot3d/art3d.py @@ -501,7 +501,7 @@ def do_3d_projection(self, renderer): z_markers_idx = np.argsort(vzs)[::-1] # Re-order items - zzs = vzs[z_markers_idx] + vzs = vzs[z_markers_idx] vxs = vxs[z_markers_idx] vys = vys[z_markers_idx] fcs = fcs[z_markers_idx] @@ -674,14 +674,14 @@ def do_3d_projection(self, renderer): else: cedge = cedge.repeat(len(xyzlist), axis=0) - # # sort by depth (furthest drawn first) + # sort by depth (furthest drawn first) z_segments_2d = sorted( ((self._zsortfunc(zs), np.column_stack([xs, ys]), fc, ec, idx) for idx, ((xs, ys, zs), fc, ec) in enumerate(zip(xyzlist, cface, cedge))), key=lambda x: x[0], reverse=True) - [zzs, segments_2d, self._facecolors2d, self._edgecolors2d, idxs] = \ + zzs, segments_2d, self._facecolors2d, self._edgecolors2d, idxs = \ zip(*z_segments_2d) if self._codes3d is not None: From e066c5d51f66331c2d0b38f00a7cfce22611a5e1 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Wed, 6 May 2020 00:52:42 +0200 Subject: [PATCH 4/4] Replace image-comparision by figure-comparison tests --- lib/mpl_toolkits/tests/test_mplot3d.py | 61 +++++++++++++++++--------- 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/lib/mpl_toolkits/tests/test_mplot3d.py b/lib/mpl_toolkits/tests/test_mplot3d.py index f23356c1bee9..dc441568cc5c 100644 --- a/lib/mpl_toolkits/tests/test_mplot3d.py +++ b/lib/mpl_toolkits/tests/test_mplot3d.py @@ -230,28 +230,49 @@ def test_scatter3d_color(): color='b', marker='s') -@image_comparison(baseline_images=['scatter3d_overlap_markers_yellow'], - extensions=['png'], remove_text=True) -def test_overlap_markers_yellow_first(): - fig = plt.figure() - x = np.array([-1, 1]) - y = np.array([1, -1]) - z = np.array([0, 0]) - ax = fig.add_subplot(111, projection='3d') - patches = ax.scatter(x, y, z, s=3500, c=['b', 'y']) - ax.view_init(elev=0, azim=-50) +@pytest.mark.parametrize('azim', [-50, 130]) # yellow first, blue first +@check_figures_equal(extensions=['png']) +def test_marker_draw_order_data_reversed(fig_test, fig_ref, azim): + """ + Test that the draw order does not depend on the data point order. + + For the given viewing angle at azim=-50, the yellow marker should be in + front. For azim=130, the blue marker should be in front. + """ + x = [-1, 1] + y = [1, -1] + z = [0, 0] + color = ['b', 'y'] + ax = fig_test.add_subplot(projection='3d') + ax.scatter(x, y, z, s=3500, c=color) + ax.view_init(elev=0, azim=azim) + ax = fig_ref.add_subplot(projection='3d') + ax.scatter(x[::-1], y[::-1], z[::-1], s=3500, c=color[::-1]) + ax.view_init(elev=0, azim=azim) -@image_comparison(baseline_images=['scatter3d_overlap_markers_blue'], - extensions=['png'], remove_text=True) -def test_overlap_markers_blue_first(): - fig = plt.figure() - x = np.array([-1, 1]) - y = np.array([1, -1]) - z = np.array([0, 0]) - ax = fig.add_subplot(111, projection='3d') - patches = ax.scatter(x, y, z, s=3500, c=['b', 'y']) - ax.view_init(elev=0, azim=130) +@check_figures_equal(extensions=['png']) +def test_marker_draw_order_view_rotated(fig_test, fig_ref): + """ + Test that the draw order changes with the direction. + + If we rotate *azim* by 180 degrees and exchange the colors, the plot + plot should look the same again. + """ + azim = 130 + x = [-1, 1] + y = [1, -1] + z = [0, 0] + color = ['b', 'y'] + ax = fig_test.add_subplot(projection='3d') + # axis are not exactly invariant under 180 degree rotation -> deactivate + ax.set_axis_off() + ax.scatter(x, y, z, s=3500, c=color) + ax.view_init(elev=0, azim=azim) + ax = fig_ref.add_subplot(projection='3d') + ax.set_axis_off() + ax.scatter(x, y, z, s=3500, c=color[::-1]) # color reversed + ax.view_init(elev=0, azim=azim - 180) # view rotated by 180 degrees @mpl3d_image_comparison(['plot_3d_from_2d.png'], tol=0.01)