簡體   English   中英

使用mplot3d繪制凹面形狀(鏡頭焦點)

[英]Plotting concave shape (lens focus) using mplot3d

我目前正在嘗試使用matplotlib(特別是mplot3d工具箱)來可視化鏡頭的焦點形狀。 我從將橢圓擬合到一組在不同焦距下的顯微鏡圖像中獲得了數據,這些焦距分別是主要的major半徑和次要的minor半徑,以及所述橢圓的旋轉角度ang 由此,我生成了xyz數組,其中包含像這樣的橢圓的坐標。

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_surfacemeshgrid / 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()

使用griddata的數據集的表面圖

而且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()

使用trisurf的數據集的表面圖

有人可以建議一種在曲面圖中正確顯示我的數據集的高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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM