Python 如何在mplot3d中禁用透视?
在mplot3d中打印时,是否可以禁用透视图,即使用正交投影?注意:这已更新,请参见 在某种程度上,您可以在打印之前运行以下代码片段:Python 如何在mplot3d中禁用透视?,python,matplotlib,mplot3d,Python,Matplotlib,Mplot3d,在mplot3d中打印时,是否可以禁用透视图,即使用正交投影?注意:这已更新,请参见 在某种程度上,您可以在打印之前运行以下代码片段: import numpy from mpl_toolkits.mplot3d import proj3d def orthogonal_proj(zfront, zback): a = (zfront+zback)/(zfront-zback) b = -2*(zfront*zback)/(zfront-zback) return num
import numpy
from mpl_toolkits.mplot3d import proj3d
def orthogonal_proj(zfront, zback):
a = (zfront+zback)/(zfront-zback)
b = -2*(zfront*zback)/(zfront-zback)
return numpy.array([[1,0,0,0],
[0,1,0,0],
[0,0,a,b],
[0,0,0,zback]])
proj3d.persp_transformation = orthogonal_proj
它目前是一个未解决的问题。这是matplot 2.2.2版之后的正式版本 因此,对于绘制透视正交图,您必须添加
proj_type='ortho'
,然后您应该有如下内容:
fig.add_subplot(121, projection='3d', proj_type = 'ortho')
示例图片
]
示例取自官方示例并经过编辑
'''
======================
3D surface (color map)
======================
Demonstrates plotting a 3D surface colored with the coolwarm color map.
The surface is made opaque by using antialiased=False.
Also demonstrates using the LinearLocator and custom formatting for the
z axis tick labels.
'''
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np
# Make data.
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
# Plot the surface.
fig = plt.figure(figsize=(16,4))
ax.view_init(40, 60)
ax = fig.add_subplot(121, projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,
linewidth=0, antialiased=False)
ax.set_zlim(-1.01, 1.01)
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
ax = fig.add_subplot(122, projection='3d', proj_type = 'ortho')
# Plot the surface.
surf = ax.plot_surface(X, Y, Z, cmap=cm.viridis, linewidth=0, antialiased=False)
ax.set_zlim(-1.01, 1.01)
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
plt.show()
成功了,谢谢!虽然轴的方向看起来相反,但这可能可以通过使用此变换矩阵中的符号/顺序来解决。看起来,在最后一行的第三列中放置一个较小的负数(例如-0.0001)而不是零有助于避免矩阵奇异性问题,解决了一个奇怪的轴方向反转问题。然后我怎么才能回到远景呢?@AhmadSultan:我想你需要先存储原始投影,然后再替换它,比如
persp_proj=proj3d.persp_transformation
,然后再分配正交投影。但从2.2.2版开始,你可以只设置项目类型(“persp”)。@uhoh我在顶部添加了一个注释来查看下面的答案。这个答案是目前有效的答案,谢谢!!