我想用Python创建三维坐标转换图。例如,我想创建以下图像(由TikZ静态生成):
一些搜索引导我进入以下程序:
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()
结果并不像人们通常在书中看到的那样:
此外,当我包含轴时,原点不在三个平面的交点处,这是我预期的位置。
答案 0 :(得分:0)
您可以通过更改以下行来更改 3D 轴的视图:
ax.view_init(azim=-90, elev=90)
到
ax.view_init(azim=20, elev=10)
重现您的 TikZ 图,或根据您的喜好将视角更改为任何其他值。