首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mplot3d绘制凹面形状(镜头焦点)

使用mplot3d绘制凹面形状(镜头焦点)
EN

Stack Overflow用户
提问于 2018-02-09 00:53:18
回答 1查看 343关注 0票数 1

我目前正在尝试使用matplotlib来可视化镜头的焦距形状,特别是mplot3d工具箱。我将椭圆拟合到一组不同焦距的显微镜图像上,作为主要major和次要minor半径,以及这些椭圆的旋转角ang。由此,我生成了包含椭圆坐标的xyz数组,如下所示。

代码语言:javascript
复制
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空间中绘制单个椭圆,一切都会按预期进行。

代码语言:javascript
复制
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_surfacemeshgrid/griddata,如下所示:

代码语言:javascript
复制
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也给出了同样不令人满意的结果:

代码语言:javascript
复制
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区域吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-09 04:11:00

问题是,您正在尝试插值栅格上的参数曲线。由于要绘制的形状是非双射的,非猜想的,所以你会得到一个完全混乱的图形。

您可以直接绘制这些点,而不是尝试插值这些点。

代码语言:javascript
复制
X = np.array(x)
Y = np.array(y)
Z = np.array(z)
ax.plot_surface(X,Y,Z, cmap="RdYlBu")
plt.show()

完整的复制示例:

代码语言:javascript
复制
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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48690777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档