import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
# 가상 워피지 데이터 생성 (볼록형태 + 약간의 노이즈)
N = 101 # 측정 mesh 크기
x = np.linspace(-100, 100, N)
y = np.linspace(-70, 70, N)
X, Y = np.meshgrid(x, y)
for i in range(7):
z_true=warpage_data(i,X,Y)
# 이차 곡면 (ex: 볼록 워피지) + 노이즈
noise = np.random.normal(scale=0.01, size=X.shape) # 측정 노이즈
Z = z_true + noise
# --- 평면 기울기 보정(plane subtraction) ---
xy1 = np.stack([X.ravel(), Y.ravel(), np.ones(N*N)], axis=1)
fit_coef, _, _, _ = np.linalg.lstsq(xy1, Z.ravel(), rcond=None) # [a, b, c]
plane = (fit_coef[0] * X) + (fit_coef[1] * Y) + fit_coef[2]
Z_corr = Z - plane # 보정 워피지
# 3D 플롯(원본/보정 후)
fig = plt.figure(figsize=(10, 5))
# ----------------------------
ax0 = fig.add_subplot(1, 3, 1, projection='3d')
ax0.plot_surface(X, Y, plane, color='gray', alpha=0.3, linewidth=0, antialiased=False)
c_surf0 = ax0.plot_surface(X, Y, Z, cmap='jet')
# 축, 눈금, 면 모두 숨기기
for axis in [ax0.xaxis, ax0.yaxis, ax0.zaxis]:
axis.pane.set_visible(False) # xy, yz, xz 평면 숨김
axis.line.set_color((1.0, 1.0, 1.0, 0.0)) # 축 라인 숨김
ax0.set_xticks([])
ax0.set_yticks([])
ax0.set_zticks([])
ax0.set_xlabel("")
ax0.set_ylabel("")
ax0.set_zlabel("")
ax0.set_title('Original Warpage')
# fig.colorbar(c_surf0, ax=ax0, shrink=0.5, aspect=10) # color bar 출력
print(Z.max()-Z.min())
# -------------------------
ax1 = fig.add_subplot(1, 3, 2, projection='3d')
ax1.plot_surface(X, Y, np.zeros_like(X), color='gray', alpha=0.3, linewidth=0, antialiased=False)
c_surf1 = ax1.plot_surface(X, Y, Z_corr, cmap='jet')
for axis in [ax1.xaxis, ax1.yaxis, ax1.zaxis]:
axis.pane.set_visible(False)
axis.line.set_color((1.0, 1.0, 1.0, 0.0))
ax1.set_xticks([])
ax1.set_yticks([])
ax1.set_zticks([])
ax1.set_xlabel("")
ax1.set_ylabel("")
ax1.set_zlabel("")
ax1.set_title('Planarity Corrected')
# fig.colorbar(c_surf1, ax=ax1, shrink=0.5, aspect=10) # color bar 출력
print(Z_corr.max()-Z_corr.min())
#-------------------
Z_DISPLAY_SCALE=3
ax2 = fig.add_subplot(1, 3, 3, projection='3d')
ax2.plot_surface(X, Y, np.zeros_like(X), color='gray', alpha=0.3, linewidth=0, antialiased=False)
Z_normal=(Z_corr-Z_corr.min())/(Z_corr.max()-Z_corr.min())
c_surf2 = ax2.plot_surface(X, Y, Z_normal, cmap='jet')
ax2.set_zlim(0, Z_normal.max()*Z_DISPLAY_SCALE)
for axis in [ax2.xaxis, ax2.yaxis, ax2.zaxis]:
axis.pane.set_visible(False)
axis.line.set_color((1.0, 1.0, 1.0, 0.0))
ax2.set_xticks([])
ax2.set_yticks([])
ax2.set_zticks([])
ax2.set_xlabel("")
ax2.set_ylabel("")
ax2.set_zlabel("")
ax2.set_title('+ Nomarlization')
# fig.colorbar(c_surf1, ax=ax1, shrink=0.5, aspect=10) # color bar 출력
print(Z_normal.max()-Z_normal.min())
# ---------------------
# 소수점 둘째자리까지 표시
cbar = fig.colorbar(c_surf0, ax=ax0,shrink=0.5, aspect=10)
cbar.ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.2f'))
cbar = fig.colorbar(c_surf1, ax=ax1, shrink=0.5, aspect=10)
cbar.ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.2f'))
cbar = fig.colorbar(c_surf1, ax=ax2, shrink=0.5, aspect=10) # 컬러바는 surf1을 썼음. 표준화시켜서 항상 1이기 때문에.
cbar.ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.2f'))
plt.show()
댓글 영역