用于平滑三维曲面的X Y Z数据

2024-09-27 09:34:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从X,Y,Z(lan,long,depth)生成一个三维曲面

我使用3D散射,得到这样的散射scatter plot

所以我想做一个3d曲面,从它附近的X和Y位置进行插值,图形会生成平滑的3d曲线,我就是这样做的

3d surface

这是我的密码

 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


Tags: fromimportifnpcolumnmathxlsxsheet

热门问题