В настоящее время я пытаюсь визуализировать фокусную форму линзы, используя 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]
Если я теперь нарисую отдельные эллипсы в трехмерном пространстве, все будет работать, как задумано.
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 моего набора данных на поверхностных графиках?