Я хочу сделать трехмерную поверхность из X, Y, Z (lan, long, deep).
Я использую 3D-разброс и получаю разброс, как этот график разброса .
Итак, я хочу создать трехмерную поверхность с интерполяцией из положения X и Y рядом с ней, и график создаст гладкую трехмерную кривую, и я делаю так
3d поверхность
Вот мой код
from openpyxl import load_workbook
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import math
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
from scipy import interpolate
from scipy.interpolate import interp2d
kebenaran = True
kebenaranz = True
wb = load_workbook(filename = 'olda.xlsx')
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
sheet = wb['Sheet1']
SumbuX = []
SumbuX2 = []
SumbuY = []
SumbuY2 = []
SumbuZ = []
i = 3
while (kebenaran):
DatX = sheet.cell(row=i, column=11).value
DatY = sheet.cell(row=i, column=12).value
DatZ = sheet.cell(row=i, column=5).value
if DatX == None :
kebenaran = False
else :
SumbuX.append(DatX)
SumbuY.append(DatY)
SumbuZ.append(DatZ)
i = i + 1
x1 = math.floor(min(SumbuX))
y1 = math.floor(min(SumbuY))
x2 = math.ceil(max(SumbuX))
y2 = math.ceil(max(SumbuY))
X = np.linspace(x1, x2, 3342)
Y = np.linspace(y1, y2, 3342)
xm,ym = np.meshgrid(X, Y)
for i in range(len(SumbuZ)):
Xdot = math.ceil(SumbuX[i])
Ydot = math.ceil(SumbuY[i])
if Xdot < 0 :
CalcX = Xdot*2*(-1) + Xdot
if Ydot < 0:
CalcY = Ydot*2*(-1) + Ydot
else :
CalcY = Ydot*2 + Ydot
else :
CalcX = Xdot*2 + Xdot
if Ydot < 0:
CalcY = Ydot*2*(-1) + Ydot
else :
CalcY = Ydot*2 + Ydot
SumbuX2.append(CalcX)
SumbuY2.append(CalcY)
arrX = np.asarray(SumbuX2)
arrY = np.asarray(SumbuY2)
arrZ = np.asarray(SumbuZ)
panjangZ = len(arrZ)
dot = np.column_stack((arrX,arrY))
grid_z0 = interpolate.griddata(dot, arrZ, (xm, ym), method='nearest')
surf = ax.plot_surface(X, Y, grid_z0)
plt.show()
, а вот мои данные (olda.xlsx) https://github.com/irfanrah/BathymetryKapal/blob/master/15: 24: 46.xlsx (olda.xlsx, но у меня есть) переименовать его)
oldaimage