您可以通過設置正交投影,初始化視圖以面對所需平面,以及沿與選定視平面正交的軸移除不需要的繪圖元素,來模擬一個帶有Axes3d
的二維圖。另外,您可以使用zdir
關鍵字參數繪製2D元素。
這裏的matplotlib 3D圖的例子之一我修改演示
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
# Enable orthographic projection
# https://stackoverflow.com/questions/23840756/how-to-disable-perspective-in-mplot3d
from mpl_toolkits.mplot3d import proj3d
def orthogonal_proj(zfront, zback):
a = (zfront+zback)/(zfront-zback)
b = -2*(zfront*zback)/(zfront-zback)
return np.array([[1,0,0,0],
[0,1,0,0],
[0,0,a,b],
[0,0,-0.000001,zback]])
proj3d.persp_transformation = orthogonal_proj
fig = plt.figure()
ax = fig.gca(projection='3d')
# Init view to YZ plane
ax.view_init(azim=0, elev=0)
# Hide the X axis
ax.w_xaxis.line.set_lw(0.)
ax.set_xticks([])
# Change YZ plane colour to white
ax.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))
# 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.
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,
linewidth=0, antialiased=False)
ax.set_zlim(-1.1, 1.1)
ax.set_ylabel('y')
ax.set_zlabel('z')
# Plot 2D elements with zdir argument
# https://stackoverflow.com/questions/29549905/pylab-3d-scatter-plots-with-2d-projections-of-plotted-data
stepsize = 0.1
t = np.arange(-4, 4+stepsize, step=stepsize)
ax.plot(t, 0.5*np.sin(t), 'k', zdir='x', linewidth=1.0)
ax.text(0, 0, 1, 'Text', zdir='y', ha='center', va='top')
plt.show()
也許答案[這個問題]的一個(https://stackoverflow.com/questions/33084853/ set-matplotlib-view-to-the-normal-to-the-xy-plane-in-python)會做你想做的事 – user3419537
不完全。該角度已經在頂部圖片中正確設置。問題是,我想在上面的2D中繪製其他的東西。所以我真的想要2D –
Matplotlib本身不是3D引擎。因爲渲染是錯誤的。您只能在前三角形上使用tripcolor。但是這可能意味着你需要檢查哪些三角形的頂點大於某個'x',並繪製所有其他三角形。取決於音量的「形狀」,這可能會更好或更差,但假設沒有適當的像素逐像素深度檢查。如果形狀太複雜,則可能需要構建自己的小型渲染算法(可能使用imshow或類似方法)。 – armatita