Reputation: 63
I want to create plots from Python of 3D coordinate transformations. For example, I want to create the following image (generated statically by TikZ):
A bit of searching led me to the following program:
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.patches import FancyArrowPatch
from mpl_toolkits.mplot3d import proj3d
class Arrow3D(FancyArrowPatch):
def __init__(self, xs, ys, zs, *args, **kwargs):
FancyArrowPatch.__init__(self, (0, 0), (0, 0), *args, **kwargs)
self._verts3d = xs, ys, zs
def draw(self, renderer):
xs3d, ys3d, zs3d = self._verts3d
xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
self.set_positions((xs[0], ys[0]), (xs[1], ys[1]))
FancyArrowPatch.draw(self, renderer)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
arrow_prop_dict = dict(mutation_scale=20, arrowstyle='->', shrinkA=0, shrinkB=0)
a = Arrow3D([0, 1], [0, 0], [0, 0], **arrow_prop_dict, color='r')
ax.add_artist(a)
a = Arrow3D([0, 0], [0, 1], [0, 0], **arrow_prop_dict, color='b')
ax.add_artist(a)
a = Arrow3D([0, 0], [0, 0], [0, 1], **arrow_prop_dict, color='g')
ax.add_artist(a)
ax.text(0.0, 0.0, -0.1, r'$o$')
ax.text(1.1, 0, 0, r'$x$')
ax.text(0, 1.1, 0, r'$y$')
ax.text(0, 0, 1.1, r'$z$')
ax.view_init(azim=-90, elev=90)
ax.set_axis_off()
plt.show()
The result doesn't look like what one normally sees in books:
Furthermore, when I include the axes, the origin is not at the intersection of the three planes, which is where I expect it to be.
Upvotes: 6
Views: 5708
Reputation: 11
You may change the view of your 3D axes by changing the following line :
ax.view_init(azim=-90, elev=90)
to
ax.view_init(azim=20, elev=10)
to reproduce your TikZ plot, or change the view angles to any other values as you prefer.
Upvotes: 1