我目前正在尝试使用matplotlib来可视化镜头的焦距形状,特别是mplot3d工具箱。我将椭圆拟合到一组不同焦距的显微镜图像上,作为主要major和次要minor半径,以及这些椭圆的旋转角ang。由此,我生成了包含椭圆坐标的x、y和z数组,如下所示。
i = 100
omega = np.linspace(0, 2 * np.pi, i, endpoint=True)
x = [major * np.cos(omega) * np.cos(np.deg2rad(ang + 90)) - minor * np.sin(omega) * np.sin(np.deg2rad(ang + 90)) for major, minor, ang in zip(maj_avg, min_avg, ang_avg)]
y = [major * np.cos(omega) * np.sin(np.deg2rad(ang + 90)) + minor * np.sin(omega) * np.cos(np.deg2rad(ang + 90)) for major, minor, ang in zip(maj_avg, min_avg, ang_avg)]
z = [np.full(i, zi) for zi in zs]如果我现在在3D空间中绘制单个椭圆,一切都会按预期进行。
fig = plt.figure(figsize=(16, 12))
ax = fig.add_subplot(111, projection='3d')
for x_arr, y_arr, z_arr in zip(x, y, z):
ax.plot(x_arr, y_arr, z_arr)
plt.show()

我正在尝试做的是从这个数据集生成一个曲面图,它显示了透镜的焦点形状。到目前为止,我尝试了plot_surface和meshgrid/griddata,如下所示:
xi = np.arange(-300, 300, 0.1)
yi = np.arange(-300, 300, 0.1)
xgrid, ygrid = np.meshgrid(xi, yi)
zgrid = griddata(np.ravel(x), np.ravel(y), np.ravel(z), xi, yi, interp='linear')
fig = plt.figure(figsize=(16, 12))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(xgrid, ygrid, zgrid)
plt.show()

同样,plot_trisurf也给出了同样不令人满意的结果:
triang = mtri.Triangulation(np.ravel(x), np.ravel(y))
fig = plt.figure(figsize=(16, 12))
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(triang, np.ravel(z), cmap=plt.cm.CMRmap)
plt.show()

有人能建议一种方法在曲面图中正确显示我的数据集的高z区域吗?
发布于 2018-02-09 04:11:00
问题是,您正在尝试插值栅格上的参数曲线。由于要绘制的形状是非双射的,非猜想的,所以你会得到一个完全混乱的图形。

您可以直接绘制这些点,而不是尝试插值这些点。
X = np.array(x)
Y = np.array(y)
Z = np.array(z)
ax.plot_surface(X,Y,Z, cmap="RdYlBu")
plt.show()

完整的复制示例:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
maj_avg = 50*(np.linspace(0,1,20)-0.6)**2+50
min_avg = 60*(np.linspace(0,1,20)-0.7)**2+60
ang_avg = np.linspace(0,90,20)
zs = np.arange(0,40,2)
i = 100
omega = np.linspace(0, 2 * np.pi, i, endpoint=True)
x = [major * np.cos(omega) * np.cos(np.deg2rad(ang + 90)) \
- minor * np.sin(omega) * np.sin(np.deg2rad(ang + 90)) \
for major, minor, ang in zip(maj_avg, min_avg, ang_avg)]
y = [major * np.cos(omega) * np.sin(np.deg2rad(ang + 90)) \
+ minor * np.sin(omega) * np.cos(np.deg2rad(ang + 90)) \
for major, minor, ang in zip(maj_avg, min_avg, ang_avg)]
z = [np.full(i, zi) for zi in zs]
fig = plt.figure(figsize=(16, 12))
ax = fig.add_subplot(111, projection='3d')
#for x_arr, y_arr, z_arr in zip(x, y, z):
# ax.plot(x_arr, y_arr, z_arr)
X = np.array(x)
Y = np.array(y)
Z = np.array(z)
ax.plot_surface(X,Y,Z, cmap="RdYlBu")
plt.show()https://stackoverflow.com/questions/48690777
复制相似问题