I had a similar problem, and bashed together the following solution:
import numpy as np
import math
from math import sin, cos
from mpl_toolkits.mplot3d import proj3d
def plot_arc3d(vector1, vector2, radius=0.2, fig=None, colour='C0'):
""" Plot arc between two given vectors in 3D space. """
""" Confirm correct input arguments """
assert len(vector1) == 3
assert len(vector2) == 3
""" Calculate vector between two vector end points, and the resulting spherical angles for various points along
this vector. From this, derive points that lie along the arc between vector1 and vector2 """
v = [i-j for i, j in zip(vector1, vector2)]
v_points_direct = [(vector2[0]+v[0]*l, vector2[1]+v[1]*l, vector2[2]+v[2]*l) for l in np.linspace(0, 1)]
v_phis = [math.atan2(v_point[1], v_point[0]) for v_point in v_points_direct]
v_thetas = [math.acos(v_point[2]/np.linalg.norm(v_point)) for v_point in v_points_direct]
v_points_arc = [(radius*sin(theta)*cos(phi), radius*sin(theta)*sin(phi), radius*cos(theta))
for theta, phi in zip(v_thetas, v_phis)]
v_points_arc.append((0, 0, 0))
if fig is None:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
else:
ax = fig.gca()
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
""" Plot polygon (face colour must be set afterwards, otherwise it over-rides the transparency)
https://stackoverflow.com/questions/18897786/transparency-for-poly3dcollection-plot-in-matplotlib """
points_collection = Poly3DCollection([v_points_arc], alpha=0.4)
points_collection.set_facecolor(colour)
ax.add_collection3d(points_collection)
return fig