diff --git a/lib/mpl_toolkits/mplot3d/art3d.py b/lib/mpl_toolkits/mplot3d/art3d.py index 39727ca60614..770e539c3daf 100644 --- a/lib/mpl_toolkits/mplot3d/art3d.py +++ b/lib/mpl_toolkits/mplot3d/art3d.py @@ -455,18 +455,27 @@ def do_3d_projection(self, renderer): fcs = (zalpha(self._facecolor3d, vzs) if self._depthshade else self._facecolor3d) - fcs = mcolors.to_rgba_array(fcs, self._alpha) - self.set_facecolors(fcs) - 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) - if vzs.size > 0 : + if vzs.size > 0: return min(vzs) - else : + else: return np.nan @@ -634,17 +643,16 @@ def do_3d_projection(self, renderer): else: raise ValueError("whoops") - 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 000000000000..690d41aeddf4 Binary files /dev/null and b/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/scatter3d_overlap_markers_blue.png differ 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 000000000000..4814992b9d9b Binary files /dev/null and b/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/scatter3d_overlap_markers_yellow.png differ diff --git a/lib/mpl_toolkits/tests/test_mplot3d.py b/lib/mpl_toolkits/tests/test_mplot3d.py index 0a506db92adf..4ff51bfa96db 100644 --- a/lib/mpl_toolkits/tests/test_mplot3d.py +++ b/lib/mpl_toolkits/tests/test_mplot3d.py @@ -175,6 +175,30 @@ 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) + + +@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) + + @image_comparison(baseline_images=['plot_3d_from_2d'], remove_text=True, extensions=['png']) def test_plot_3d_from_2d():