下の図は、matplotlibで3次元プロットした例ですが、遠近感(perspective effect)が観られます。
しばしば、そのような遠近感の効果をなくして3次元プロットしてみたいという要求があります。
言い換えると、透視投影(perspective projection)から平行投影(orthogonal projection)に変更したいわけです。調べてみたところ、mpl_toolkits.mplot3dの中のproj3dにあるpersp_transformation関数を書き換えればよいということです。
ということで、以下のようにしてみました。
#!/usr/bin/env python
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy
#--------- Patch for Orthogonal Projection of 3Dplot ------
from mpl_toolkits.mplot3d import proj3d
def orthogonal_transformation(zfront, zback):
a = 2/(zfront-zback)
b = -1*(zfront+zback)/(zfront-zback)
c = zback
return numpy.array([[1,0,0,0],
[0,1,0,0],
[0,0,a,b],
[0,0,0,c]])
proj3d.persp_transformation = orthogonal_transformation
#-----------------------------------------------------
#---------- make canvas for figure -------------
fig = plt.figure(figsize=(6, 6), facecolor='w')
#---------- 3D Plot ----------------
ax = fig.add_subplot(111, projection='3d', axisbg='w')
# making sample data
x = numpy.arange(-3, 3, 0.25)
y = numpy.arange(-3, 3, 0.25)
xm, ym = numpy.meshgrid(x, y)
z = numpy.exp(-1*xm**2) * numpy.exp(-1*ym**2)
# draw x, y, z labels
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
# plot 3d
surf = ax.plot_surface(xm, ym, z, rstride=1, cstride=1,
linewidth=1, antialiased=True)
# set view point
ax.view_init(elev=30, azim=-45)
# display the figures
plt.show()
このスクリプトでプロットすると、下のようになりました。

0 件のコメント:
コメントを投稿