[英]Plotting concave shape (lens focus) using mplot3d
我目前正在尝试使用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
,我像这样尝试了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区域的方法吗?
问题是您正在尝试对网格上的参数曲线进行插值。 由于绘制的形状是非双射,非双射的,因此您会感到一团糟。
可以尝试直接绘制点,而不是尝试对这些点进行插值。
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.