1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backend_bases import MouseEvent
from mpl_toolkits.mplot3d.art3d import (
Line3DCollection,
Poly3DCollection,
_all_points_on_plane,
)
def test_scatter_3d_projection_conservation():
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# fix axes3d projection
ax.roll = 0
ax.elev = 0
ax.azim = -45
ax.stale = True
x = [0, 1, 2, 3, 4]
scatter_collection = ax.scatter(x, x, x)
fig.canvas.draw_idle()
# Get scatter location on canvas and freeze the data
scatter_offset = scatter_collection.get_offsets()
scatter_location = ax.transData.transform(scatter_offset)
# Yaw -44 and -46 are enough to produce two set of scatter
# with opposite z-order without moving points too far
for azim in (-44, -46):
ax.azim = azim
ax.stale = True
fig.canvas.draw_idle()
for i in range(5):
# Create a mouse event used to locate and to get index
# from each dots
event = MouseEvent("button_press_event", fig.canvas,
*scatter_location[i, :])
contains, ind = scatter_collection.contains(event)
assert contains is True
assert len(ind["ind"]) == 1
assert ind["ind"][0] == i
def test_zordered_error():
# Smoke test for https://github.com/matplotlib/matplotlib/issues/26497
lc = [(np.fromiter([0.0, 0.0, 0.0], dtype="float"),
np.fromiter([1.0, 1.0, 1.0], dtype="float"))]
pc = [np.fromiter([0.0, 0.0], dtype="float"),
np.fromiter([0.0, 1.0], dtype="float"),
np.fromiter([1.0, 1.0], dtype="float")]
fig = plt.figure()
ax = fig.add_subplot(projection="3d")
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)
def test_generate_normals():
# Smoke test for https://github.com/matplotlib/matplotlib/issues/29156
vertices = ((0, 0, 0), (0, 5, 0), (5, 5, 0), (5, 0, 0))
shape = Poly3DCollection([vertices], edgecolors='r', shade=True)
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.add_collection3d(shape)
plt.draw()
|