From 3ef2340bc2931131c5557e311fa042a730d2e71d Mon Sep 17 00:00:00 2001 From: Scott Shambaugh Date: Tue, 14 May 2024 10:11:27 -0600 Subject: [PATCH 1/2] fill_between extended to 3D fill_between in plot types Apply suggestions from code review Co-authored-by: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> fill_between single_polygon flag 3D fill_between auto mode maps to polygon when all points lie on a x, y, or z plane 3D fill_between auto mode maps to polygon when all points lie on a x, y, or z plane Code review comments fill_between 3d shading fill_between 3d shading --- doc/api/toolkits/mplot3d/axes3d.rst | 1 + doc/users/next_whats_new/fill_between_3d.rst | 25 ++++ galleries/examples/mplot3d/fillbetween3d.py | 28 ++++ galleries/examples/mplot3d/fillunder3d.py | 34 +++++ galleries/examples/mplot3d/polys3d.py | 53 +++----- .../plot_types/3D/fill_between3d_simple.py | 33 +++++ galleries/users_explain/toolkits/mplot3d.rst | 10 ++ lib/mpl_toolkits/mplot3d/axes3d.py | 123 ++++++++++++++++++ .../test_axes3d/fill_between_polygon.png | Bin 0 -> 51280 bytes .../test_axes3d/fill_between_quad.png | Bin 0 -> 72103 bytes lib/mpl_toolkits/mplot3d/tests/test_axes3d.py | 42 ++++++ 11 files changed, 317 insertions(+), 32 deletions(-) create mode 100644 doc/users/next_whats_new/fill_between_3d.rst create mode 100644 galleries/examples/mplot3d/fillbetween3d.py create mode 100644 galleries/examples/mplot3d/fillunder3d.py create mode 100644 galleries/plot_types/3D/fill_between3d_simple.py create mode 100644 lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/fill_between_polygon.png create mode 100644 lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/fill_between_quad.png diff --git a/doc/api/toolkits/mplot3d/axes3d.rst b/doc/api/toolkits/mplot3d/axes3d.rst index 877e47b7e93a..83cd8dd63cef 100644 --- a/doc/api/toolkits/mplot3d/axes3d.rst +++ b/doc/api/toolkits/mplot3d/axes3d.rst @@ -30,6 +30,7 @@ Plotting plot_surface plot_wireframe plot_trisurf + fill_between clabel contour diff --git a/doc/users/next_whats_new/fill_between_3d.rst b/doc/users/next_whats_new/fill_between_3d.rst new file mode 100644 index 000000000000..13e89780d34f --- /dev/null +++ b/doc/users/next_whats_new/fill_between_3d.rst @@ -0,0 +1,25 @@ +Fill between 3D lines +--------------------- + +The new method `.Axes3D.fill_between` allows to fill the surface between two +3D lines with polygons. + +.. plot:: + :include-source: + :alt: Example of 3D fill_between + + N = 50 + theta = np.linspace(0, 2*np.pi, N) + + x1 = np.cos(theta) + y1 = np.sin(theta) + z1 = 0.1 * np.sin(6 * theta) + + x2 = 0.6 * np.cos(theta) + y2 = 0.6 * np.sin(theta) + z2 = 2 # Note that scalar values work in addition to length N arrays + + fig = plt.figure() + ax = fig.add_subplot(projection='3d') + ax.fill_between(x1, y1, z1, x2, y2, z2, + alpha=0.5, edgecolor='k') diff --git a/galleries/examples/mplot3d/fillbetween3d.py b/galleries/examples/mplot3d/fillbetween3d.py new file mode 100644 index 000000000000..07ee2b365f74 --- /dev/null +++ b/galleries/examples/mplot3d/fillbetween3d.py @@ -0,0 +1,28 @@ +""" +===================== +Fill between 3D lines +===================== + +Demonstrate how to fill the space between 3D lines with surfaces. Here we +create a sort of "lampshade" shape. +""" + +import matplotlib.pyplot as plt +import numpy as np + +N = 50 +theta = np.linspace(0, 2*np.pi, N) + +x1 = np.cos(theta) +y1 = np.sin(theta) +z1 = 0.1 * np.sin(6 * theta) + +x2 = 0.6 * np.cos(theta) +y2 = 0.6 * np.sin(theta) +z2 = 2 # Note that scalar values work in addition to length N arrays + +fig = plt.figure() +ax = fig.add_subplot(projection='3d') +ax.fill_between(x1, y1, z1, x2, y2, z2, alpha=0.5, edgecolor='k') + +plt.show() diff --git a/galleries/examples/mplot3d/fillunder3d.py b/galleries/examples/mplot3d/fillunder3d.py new file mode 100644 index 000000000000..b127f3406508 --- /dev/null +++ b/galleries/examples/mplot3d/fillunder3d.py @@ -0,0 +1,34 @@ +""" +========================= +Fill under 3D line graphs +========================= + +Demonstrate how to create polygons which fill the space under a line +graph. In this example polygons are semi-transparent, creating a sort +of 'jagged stained glass' effect. +""" + +import math + +import matplotlib.pyplot as plt +import numpy as np + +gamma = np.vectorize(math.gamma) +N = 31 +x = np.linspace(0., 10., N) +lambdas = range(1, 9) + +ax = plt.figure().add_subplot(projection='3d') + +facecolors = plt.colormaps['viridis_r'](np.linspace(0, 1, len(lambdas))) + +for i, l in enumerate(lambdas): + # Note fill_between can take coordinates as length N vectors, or scalars + ax.fill_between(x, l, l**x * np.exp(-l) / gamma(x + 1), + x, l, 0, + facecolors=facecolors[i], alpha=.7) + +ax.set(xlim=(0, 10), ylim=(1, 9), zlim=(0, 0.35), + xlabel='x', ylabel=r'$\lambda$', zlabel='probability') + +plt.show() diff --git a/galleries/examples/mplot3d/polys3d.py b/galleries/examples/mplot3d/polys3d.py index b174f804d61d..e6c51a2d8347 100644 --- a/galleries/examples/mplot3d/polys3d.py +++ b/galleries/examples/mplot3d/polys3d.py @@ -1,47 +1,36 @@ """ -============================================= -Generate polygons to fill under 3D line graph -============================================= +==================== +Generate 3D polygons +==================== -Demonstrate how to create polygons which fill the space under a line -graph. In this example polygons are semi-transparent, creating a sort -of 'jagged stained glass' effect. +Demonstrate how to create polygons in 3D. Here we stack 3 hexagons. """ -import math - import matplotlib.pyplot as plt import numpy as np -from matplotlib.collections import PolyCollection - -# Fixing random state for reproducibility -np.random.seed(19680801) +from mpl_toolkits.mplot3d.art3d import Poly3DCollection +# Coordinates of a hexagon +angles = np.linspace(0, 2 * np.pi, 6, endpoint=False) +x = np.cos(angles) +y = np.sin(angles) +zs = [-3, -2, -1] -def polygon_under_graph(x, y): - """ - Construct the vertex list which defines the polygon filling the space under - the (x, y) line graph. This assumes x is in ascending order. - """ - return [(x[0], 0.), *zip(x, y), (x[-1], 0.)] +# Close the hexagon by repeating the first vertex +x = np.append(x, x[0]) +y = np.append(y, y[0]) +verts = [] +for z in zs: + verts.append(list(zip(x*z, y*z, np.full_like(x, z)))) +verts = np.array(verts) ax = plt.figure().add_subplot(projection='3d') -x = np.linspace(0., 10., 31) -lambdas = range(1, 9) - -# verts[i] is a list of (x, y) pairs defining polygon i. -gamma = np.vectorize(math.gamma) -verts = [polygon_under_graph(x, l**x * np.exp(-l) / gamma(x + 1)) - for l in lambdas] -facecolors = plt.colormaps['viridis_r'](np.linspace(0, 1, len(verts))) - -poly = PolyCollection(verts, facecolors=facecolors, alpha=.7) -ax.add_collection3d(poly, zs=lambdas, zdir='y') - -ax.set(xlim=(0, 10), ylim=(1, 9), zlim=(0, 0.35), - xlabel='x', ylabel=r'$\lambda$', zlabel='probability') +poly = Poly3DCollection(verts, alpha=.7) +ax.add_collection3d(poly) +ax.auto_scale_xyz(verts[:, :, 0], verts[:, :, 1], verts[:, :, 2]) +ax.set_aspect('equalxy') plt.show() diff --git a/galleries/plot_types/3D/fill_between3d_simple.py b/galleries/plot_types/3D/fill_between3d_simple.py new file mode 100644 index 000000000000..f12fbbb5e958 --- /dev/null +++ b/galleries/plot_types/3D/fill_between3d_simple.py @@ -0,0 +1,33 @@ +""" +==================================== +fill_between(x1, y1, z1, x2, y2, z2) +==================================== + +See `~mpl_toolkits.mplot3d.axes3d.Axes3D.fill_between`. +""" +import matplotlib.pyplot as plt +import numpy as np + +plt.style.use('_mpl-gallery') + +# Make data for a double helix +n = 50 +theta = np.linspace(0, 2*np.pi, n) +x1 = np.cos(theta) +y1 = np.sin(theta) +z1 = np.linspace(0, 1, n) +x2 = np.cos(theta + np.pi) +y2 = np.sin(theta + np.pi) +z2 = z1 + +# Plot +fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) +ax.fill_between(x1, y1, z1, x2, y2, z2, alpha=0.5) +ax.plot(x1, y1, z1, linewidth=2, color='C0') +ax.plot(x2, y2, z2, linewidth=2, color='C0') + +ax.set(xticklabels=[], + yticklabels=[], + zticklabels=[]) + +plt.show() diff --git a/galleries/users_explain/toolkits/mplot3d.rst b/galleries/users_explain/toolkits/mplot3d.rst index 2551c065ea46..100449f23a0e 100644 --- a/galleries/users_explain/toolkits/mplot3d.rst +++ b/galleries/users_explain/toolkits/mplot3d.rst @@ -111,6 +111,16 @@ See `.Axes3D.contourf` for API documentation. The feature demoed in the second contourf3d example was enabled as a result of a bugfix for version 1.1.0. +.. _fillbetween3d: + +Fill between 3D lines +===================== +See `.Axes3D.fill_between` for API documentation. + +.. figure:: /gallery/mplot3d/images/sphx_glr_fillbetween3d_001.png + :target: /gallery/mplot3d/fillbetween3d.html + :align: center + .. _polygon3d: Polygon plots diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 408fd69ff5c3..efa72a11466b 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -1957,6 +1957,129 @@ def plot(self, xs, ys, *args, zdir='z', **kwargs): plot3D = plot + def fill_between(self, x1, y1, z1, x2, y2, z2, *, + where=None, mode='auto', facecolors=None, shade=None, + **kwargs): + """ + Fill the area between two 3D curves. + + The curves are defined by the points (*x1*, *y1*, *z1*) and + (*x2*, *y2*, *z2*). This creates one or multiple quadrangle + polygons that are filled. All points must be the same length N, or a + single value to be used for all points. + + Parameters + ---------- + x1, y1, z1 : float or 1D array-like + x, y, and z coordinates of vertices for 1st line. + + x2, y2, z2 : float or 1D array-like + x, y, and z coordinates of vertices for 2nd line. + + where : array of bool (length N), optional + Define *where* to exclude some regions from being filled. The + filled regions are defined by the coordinates ``pts[where]``, + for all x, y, and z pts. More precisely, fill between ``pts[i]`` + and ``pts[i+1]`` if ``where[i] and where[i+1]``. Note that this + definition implies that an isolated *True* value between two + *False* values in *where* will not result in filling. Both sides of + the *True* position remain unfilled due to the adjacent *False* + values. + + mode : {'quad', 'polygon', 'auto'}, default: 'auto' + The fill mode. One of: + + - 'quad': A separate quadrilateral polygon is created for each + pair of subsequent points in the two lines. + - 'polygon': The two lines are connected to form a single polygon. + This is faster and can render more cleanly for simple shapes + (e.g. for filling between two lines that lie within a plane). + - 'auto': If the lines are in a plane parallel to a coordinate axis + (one of *x*, *y*, *z* are constant and equal for both lines), + 'polygon' is used. Otherwise, 'quad' is used. + + facecolors : list of :mpltype:`color`, default: None + Colors of each individual patch, or a single color to be used for + all patches. + + shade : bool, default: None + Whether to shade the facecolors. If *None*, then defaults to *True* + for 'quad' mode and *False* for 'polygon' mode. + + **kwargs + All other keyword arguments are passed on to `.Poly3DCollection`. + + Returns + ------- + `.Poly3DCollection` + A `.Poly3DCollection` containing the plotted polygons. + + """ + _api.check_in_list(['auto', 'quad', 'polygon'], mode=mode) + + had_data = self.has_data() + x1, y1, z1, x2, y2, z2 = cbook._broadcast_with_masks(x1, y1, z1, x2, y2, z2) + if mode == 'auto': + if ((np.all(x1 == x1[0]) and np.all(x2 == x1[0])) + or (np.all(y1 == y1[0]) and np.all(y2 == y1[0])) + or (np.all(z1 == z1[0]) and np.all(z2 == z1[0]))): + mode = 'polygon' + else: + mode = 'quad' + + if shade is None: + if mode == 'quad': + shade = True + else: + shade = False + + if facecolors is None: + facecolors = [self._get_patches_for_fill.get_next_color()] + facecolors = list(mcolors.to_rgba_array(facecolors)) + + if where is None: + where = True + else: + where = np.asarray(where, dtype=bool) + if where.size != x1.size: + raise ValueError(f"where size ({where.size}) does not match " + f"size ({x1.size})") + where = where & ~np.isnan(x1) # NaNs were broadcast in _broadcast_with_masks + + polys = [] + for idx0, idx1 in cbook.contiguous_regions(where): + x1i = x1[idx0:idx1] + y1i = y1[idx0:idx1] + z1i = z1[idx0:idx1] + x2i = x2[idx0:idx1] + y2i = y2[idx0:idx1] + z2i = z2[idx0:idx1] + + if not len(x1i): + continue + + if mode == 'quad': + # Preallocate the array for the region's vertices, and fill it in + n_polys_i = len(x1i) - 1 + polys_i = np.empty((n_polys_i, 4, 3)) + polys_i[:, 0, :] = np.column_stack((x1i[:-1], y1i[:-1], z1i[:-1])) + polys_i[:, 1, :] = np.column_stack((x1i[1:], y1i[1:], z1i[1:])) + polys_i[:, 2, :] = np.column_stack((x2i[1:], y2i[1:], z2i[1:])) + polys_i[:, 3, :] = np.column_stack((x2i[:-1], y2i[:-1], z2i[:-1])) + polys = polys + [*polys_i] + elif mode == 'polygon': + line1 = np.column_stack((x1i, y1i, z1i)) + line2 = np.column_stack((x2i[::-1], y2i[::-1], z2i[::-1])) + poly = np.concatenate((line1, line2), axis=0) + polys.append(poly) + + polyc = art3d.Poly3DCollection(polys, facecolors=facecolors, shade=shade, + **kwargs) + self.add_collection(polyc) + + self.auto_scale_xyz([x1, x2], [y1, y2], [z1, z2], had_data) + return polyc + def plot_surface(self, X, Y, Z, *, norm=None, vmin=None, vmax=None, lightsource=None, **kwargs): """ 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 new file mode 100644 index 0000000000000000000000000000000000000000..f1f160fe557965f95a7a01a786ac2c47fe8f9dee GIT binary patch literal 51280 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..e405bcffb9655918728ffed0b561ce0d7d407f2e GIT binary patch literal 72103 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 q9Eu2qvJXR%{Qv*>e{My1?so=Ur$o~Q{K_UqN literal 0 HcmV?d00001 diff --git a/lib/mpl_toolkits/mplot3d/tests/test_axes3d.py b/lib/mpl_toolkits/mplot3d/tests/test_axes3d.py index fdd90ccf4c90..4d7acd83fbee 100644 --- a/lib/mpl_toolkits/mplot3d/tests/test_axes3d.py +++ b/lib/mpl_toolkits/mplot3d/tests/test_axes3d.py @@ -593,6 +593,48 @@ def test_plot_3d_from_2d(): ax.plot(xs, ys, zs=0, zdir='y') +@mpl3d_image_comparison(['fill_between_quad.png'], style='mpl20') +def test_fill_between_quad(): + fig = plt.figure() + ax = fig.add_subplot(projection='3d') + + theta = np.linspace(0, 2*np.pi, 50) + + x1 = np.cos(theta) + y1 = np.sin(theta) + z1 = 0.1 * np.sin(6 * theta) + + x2 = 0.6 * np.cos(theta) + y2 = 0.6 * np.sin(theta) + z2 = 2 + + where = (theta < np.pi/2) | (theta > 3*np.pi/2) + + # Since none of x1 == x2, y1 == y2, or z1 == z2 is True, the fill_between + # mode will map to 'quad' + ax.fill_between(x1, y1, z1, x2, y2, z2, + where=where, mode='auto', alpha=0.5, edgecolor='k') + + +@mpl3d_image_comparison(['fill_between_polygon.png'], style='mpl20') +def test_fill_between_polygon(): + fig = plt.figure() + ax = fig.add_subplot(projection='3d') + + theta = np.linspace(0, 2*np.pi, 50) + + x1 = x2 = theta + y1 = y2 = 0 + z1 = np.cos(theta) + z2 = z1 + 1 + + where = (theta < np.pi/2) | (theta > 3*np.pi/2) + + # Since x1 == x2 and y1 == y2, the fill_between mode will be 'polygon' + ax.fill_between(x1, y1, z1, x2, y2, z2, + where=where, mode='auto', edgecolor='k') + + @mpl3d_image_comparison(['surface3d.png'], style='mpl20') def test_surface3d(): # Remove this line when this test image is regenerated. From dd05f32011431ea91e001477947a18cc44e5080a Mon Sep 17 00:00:00 2001 From: Scott Shambaugh Date: Sun, 16 Jun 2024 20:29:17 -0600 Subject: [PATCH 2/2] check if all points lie on a plane --- lib/mpl_toolkits/mplot3d/art3d.py | 41 ++++++++++++++++++++ lib/mpl_toolkits/mplot3d/axes3d.py | 33 ++++++++-------- lib/mpl_toolkits/mplot3d/tests/test_art3d.py | 33 +++++++++++++++- 3 files changed, 90 insertions(+), 17 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/art3d.py b/lib/mpl_toolkits/mplot3d/art3d.py index ec4ab07e4874..feeff130b0cd 100644 --- a/lib/mpl_toolkits/mplot3d/art3d.py +++ b/lib/mpl_toolkits/mplot3d/art3d.py @@ -1185,6 +1185,47 @@ def _zalpha(colors, zs): return np.column_stack([rgba[:, :3], rgba[:, 3] * sats]) +def _all_points_on_plane(xs, ys, zs, atol=1e-8): + """ + Check if all points are on the same plane. Note that NaN values are + ignored. + + Parameters + ---------- + xs, ys, zs : array-like + The x, y, and z coordinates of the points. + atol : float, default: 1e-8 + The tolerance for the equality check. + """ + xs, ys, zs = np.asarray(xs), np.asarray(ys), np.asarray(zs) + points = np.column_stack([xs, ys, zs]) + points = points[~np.isnan(points).any(axis=1)] + # Check for the case where we have less than 3 unique points + points = np.unique(points, axis=0) + if len(points) <= 3: + return True + # Calculate the vectors from the first point to all other points + vs = (points - points[0])[1:] + vs = vs / np.linalg.norm(vs, axis=1)[:, np.newaxis] + # Filter out parallel vectors + vs = np.unique(vs, axis=0) + if len(vs) <= 2: + return True + # Filter out parallel and antiparallel vectors to the first vector + cross_norms = np.linalg.norm(np.cross(vs[0], vs[1:]), axis=1) + zero_cross_norms = np.where(np.isclose(cross_norms, 0, atol=atol))[0] + 1 + vs = np.delete(vs, zero_cross_norms, axis=0) + if len(vs) <= 2: + return True + # Calculate the normal vector from the first three points + n = np.cross(vs[0], vs[1]) + n = n / np.linalg.norm(n) + # If the dot product of the normal vector and all other vectors is zero, + # all points are on the same plane + dots = np.dot(n, vs.transpose()) + return np.allclose(dots, 0, atol=atol) + + def _generate_normals(polygons): """ Compute the normals of a list of polygons, one normal per polygon. diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index efa72a11466b..92a90b2f30ef 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -1994,9 +1994,8 @@ def fill_between(self, x1, y1, z1, x2, y2, z2, *, - 'polygon': The two lines are connected to form a single polygon. This is faster and can render more cleanly for simple shapes (e.g. for filling between two lines that lie within a plane). - - 'auto': If the lines are in a plane parallel to a coordinate axis - (one of *x*, *y*, *z* are constant and equal for both lines), - 'polygon' is used. Otherwise, 'quad' is used. + - 'auto': If the points all lie on the same 3D plane, 'polygon' is + used. Otherwise, 'quad' is used. facecolors : list of :mpltype:`color`, default: None Colors of each individual patch, or a single color to be used for @@ -2019,19 +2018,6 @@ def fill_between(self, x1, y1, z1, x2, y2, z2, *, had_data = self.has_data() x1, y1, z1, x2, y2, z2 = cbook._broadcast_with_masks(x1, y1, z1, x2, y2, z2) - if mode == 'auto': - if ((np.all(x1 == x1[0]) and np.all(x2 == x1[0])) - or (np.all(y1 == y1[0]) and np.all(y2 == y1[0])) - or (np.all(z1 == z1[0]) and np.all(z2 == z1[0]))): - mode = 'polygon' - else: - mode = 'quad' - - if shade is None: - if mode == 'quad': - shade = True - else: - shade = False if facecolors is None: facecolors = [self._get_patches_for_fill.get_next_color()] @@ -2046,6 +2032,21 @@ def fill_between(self, x1, y1, z1, x2, y2, z2, *, f"size ({x1.size})") where = where & ~np.isnan(x1) # NaNs were broadcast in _broadcast_with_masks + if mode == 'auto': + if art3d._all_points_on_plane(np.concatenate((x1[where], x2[where])), + np.concatenate((y1[where], y2[where])), + np.concatenate((z1[where], z2[where])), + atol=1e-12): + mode = 'polygon' + else: + mode = 'quad' + + if shade is None: + if mode == 'quad': + shade = True + else: + shade = False + polys = [] for idx0, idx1 in cbook.contiguous_regions(where): x1i = x1[idx0:idx1] diff --git a/lib/mpl_toolkits/mplot3d/tests/test_art3d.py b/lib/mpl_toolkits/mplot3d/tests/test_art3d.py index 4ed48aae4685..f4f7067b76bb 100644 --- a/lib/mpl_toolkits/mplot3d/tests/test_art3d.py +++ b/lib/mpl_toolkits/mplot3d/tests/test_art3d.py @@ -3,7 +3,7 @@ import matplotlib.pyplot as plt from matplotlib.backend_bases import MouseEvent -from mpl_toolkits.mplot3d.art3d import Line3DCollection +from mpl_toolkits.mplot3d.art3d import Line3DCollection, _all_points_on_plane def test_scatter_3d_projection_conservation(): @@ -54,3 +54,34 @@ def test_zordered_error(): ax.add_collection(Line3DCollection(lc)) ax.scatter(*pc, visible=False) plt.draw() + + +def test_all_points_on_plane(): + # Non-coplanar points + points = np.array([[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]]) + assert not _all_points_on_plane(*points.T) + + # Duplicate points + points = np.array([[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 0]]) + assert _all_points_on_plane(*points.T) + + # NaN values + points = np.array([[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, np.nan]]) + assert _all_points_on_plane(*points.T) + + # Less than 3 unique points + points = np.array([[0, 0, 0], [0, 0, 0], [0, 0, 0]]) + assert _all_points_on_plane(*points.T) + + # All points lie on a line + points = np.array([[0, 0, 0], [0, 1, 0], [0, 2, 0], [0, 3, 0]]) + assert _all_points_on_plane(*points.T) + + # All points lie on two lines, with antiparallel vectors + points = np.array([[-2, 2, 0], [-1, 1, 0], [1, -1, 0], + [0, 0, 0], [2, 0, 0], [1, 0, 0]]) + assert _all_points_on_plane(*points.T) + + # All points lie on a plane + points = np.array([[0, 0, 0], [0, 1, 0], [1, 0, 0], [1, 1, 0], [1, 2, 0]]) + assert _all_points_on_plane(*points.T)