From ba9dcd7de8eda7fbb4ba1b959593c0bfff69c5f6 Mon Sep 17 00:00:00 2001 From: AdwaithBatchu Date: Thu, 12 Jun 2025 14:28:22 +0530 Subject: [PATCH] Implement arrow3d method in Axes3D --- doc/release/next_whats_new/arrow3d.rst | 5 ++ galleries/examples/mplot3d/arrow3d.py | 37 ++++++++++++++ lib/mpl_toolkits/mplot3d/art3d.py | 24 ++++++++- lib/mpl_toolkits/mplot3d/axes3d.py | 47 ++++++++++++++++++ .../test_axes3d/arrow3d_custom_props.png | Bin 0 -> 53816 bytes lib/mpl_toolkits/mplot3d/tests/test_axes3d.py | 27 ++++++++++ 6 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 doc/release/next_whats_new/arrow3d.rst create mode 100644 galleries/examples/mplot3d/arrow3d.py create mode 100644 lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/arrow3d_custom_props.png diff --git a/doc/release/next_whats_new/arrow3d.rst b/doc/release/next_whats_new/arrow3d.rst new file mode 100644 index 000000000000..3728ea68375d --- /dev/null +++ b/doc/release/next_whats_new/arrow3d.rst @@ -0,0 +1,5 @@ +New ``arrow3d`` Method +---------------------- + +The new ``arrow3d`` method for `~.Axes3D` allows users to plot 3D arrows, +which can be used for representing vectors or directional data. diff --git a/galleries/examples/mplot3d/arrow3d.py b/galleries/examples/mplot3d/arrow3d.py new file mode 100644 index 000000000000..c8194a1ceeb3 --- /dev/null +++ b/galleries/examples/mplot3d/arrow3d.py @@ -0,0 +1,37 @@ +""" +============= +3D arrow plot +============= + +Demonstrates plotting arrows in a 3D space. + +Here we plot two arrows from the same start point to different +end points. The properties of the second arrow is changed by passing +additional parameters other than ``end`` and ``start`` to +`.patches.FancyArrowPatch`. +""" + +import matplotlib.pyplot as plt +import numpy as np + +fig = plt.figure() +ax = fig.add_subplot(111, projection='3d') + +# Define the start and end points of the arrow +start = np.array([0, 0, 0]) +end = np.array([1, 1, 1]) + +# Create the arrow +ax.arrow3d(end, start) + +end1 = np.array([1, 2, 3]) +# Passing additional keyword arguments to control properties of the arrow. +# If the `start` parameter is not passed, the arrow is drawn from (0, 0, 0). +ax.arrow3d(end1, mutation_scale=20, color='r', arrowstyle='->', linewidth=2) + +plt.show() + +# %% +# .. tags:: +# plot-type: 3D, +# level: beginner diff --git a/lib/mpl_toolkits/mplot3d/art3d.py b/lib/mpl_toolkits/mplot3d/art3d.py index e051e44fb23d..5a28db548979 100644 --- a/lib/mpl_toolkits/mplot3d/art3d.py +++ b/lib/mpl_toolkits/mplot3d/art3d.py @@ -18,7 +18,7 @@ path as mpath, rcParams) from matplotlib.collections import ( Collection, LineCollection, PolyCollection, PatchCollection, PathCollection) -from matplotlib.patches import Patch +from matplotlib.patches import Patch, FancyArrowPatch from . import proj3d @@ -1665,3 +1665,25 @@ def norm(x): colors = np.asanyarray(color).copy() return colors + + +class Arrow3D(FancyArrowPatch): + """ + 3D FancyArrowPatch object. + """ + def __init__(self, posA, posB, *args, **kwargs): + """ + Parameters + ---------- + posA, posB : array-like + The coordinates of the arrow's start and end points. + """ + super().__init__((0,0), (0,0), *args, **kwargs) + self._verts3d = list(zip(posA, posB)) + + def do_3d_projection(self, renderer=None): + """Projects the points according to the renderer matrix.""" + xs3d, ys3d, zs3d = self._verts3d + xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, self.axes.M) + self.set_positions((xs[0], ys[0]), (xs[1], ys[1])) + return np.min(zs) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 32da8dfde7aa..b41d4c6979b5 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -4057,6 +4057,53 @@ def stem(self, x, y, z, *, linefmt='C0-', markerfmt='C0o', basefmt='C3-', stem3D = stem + @_preprocess_data() + def arrow3d(self, end, start=None, **kwargs): + """ + 3D plot of a single arrow + + Parameters + ---------- + end : 1D array + an array of shape (3,). + + start : 1D array, default: (0,0,0) + an array of shape (3,). + + data : indexable object, optional + DATA_PARAMETER_PLACEHOLDER + + **kwargs + All other keyword arguments are passed on to + `~mpl_toolkits.mplot3d.art3d.Arrow3D`. + + Returns + ------- + arrow : `~mpl_toolkits.mplot3d.art3d.Arrow3D` + + """ + had_data = self.has_data() + + if start is None: + start = np.zeros_like(end) + if np.shape(end) != (3,): + raise ValueError("end must be an array of length 3") + if np.shape(start) != (3,): + raise ValueError("start must be an array of length 3") + + # Set default arrow properties and update with any additional keyword args + arrow_props = dict( + mutation_scale=20, arrowstyle="-|>", shrinkA=0, shrinkB=0 + ) + arrow_props.update(kwargs) + + arrow = art3d.Arrow3D(start, end, **arrow_props) + self.add_artist(arrow) + xs, ys, zs = list(zip(start, end)) + self.auto_scale_xyz(xs, ys, zs, had_data) + + return arrow + def get_test_data(delta=0.05): """Return a tuple X, Y, Z with a test data set.""" diff --git a/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/arrow3d_custom_props.png b/lib/mpl_toolkits/mplot3d/tests/baseline_images/test_axes3d/arrow3d_custom_props.png new file mode 100644 index 0000000000000000000000000000000000000000..ac70fb025bfee481e3c4c5561682e0c0a84aec8d GIT binary patch literal 53816 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 a%k(Sm1sPxZlF~(ke++busJYq)g8m09gGpcj 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 e38df4f80ba4..d1fe8363120f 100644 --- a/lib/mpl_toolkits/mplot3d/tests/test_axes3d.py +++ b/lib/mpl_toolkits/mplot3d/tests/test_axes3d.py @@ -2740,3 +2740,30 @@ def test_axes3d_set_aspect_deperecated_params(): with pytest.raises(ValueError, match="adjustable"): ax.set_aspect('equal', adjustable='invalid_value') + + +@check_figures_equal() +def test_arrow3d_default(fig_test, fig_ref): + ax_ref = fig_ref.add_subplot(projection='3d') + start = [0, 0, 0] + end = [1, 2, 3] + ax_ref.arrow3d(end, start) + + ax_test = fig_test.add_subplot(projection='3d') + ax_test.arrow3d(end) + + +@mpl3d_image_comparison(['arrow3d_custom_props.png'], style='mpl20', + tol=0.02 if sys.platform == 'darwin' else 0) +def test_arrow3d_custom_props(): + fig = plt.figure() + ax = fig.add_subplot(projection='3d') + + start1 = [1, 2, 3] + end1 = [4, 5, 6] + ax.arrow3d(end1, start1, + arrowstyle="->, head_length=0.6, head_width=0.3", color='red') + + start2 = [2, 5, 7] + end2 = [4, 6, -8] + ax.arrow3d(end2, start2, color='violet', ls='--', lw=2)