在Python中创建xyz高度数据的表面图

时间:2018-08-17 08:42:43

标签: python surface geography topography

我正在尝试在python中创建山脉的表面图,其中有一些xyz数据。最终结果应类似于that。该文件的格式如下:

616000.0 90500.0 3096.712
616000.0 90525.0 3123.415
616000.0 90550.0 3158.902
616000.0 90575.0 3182.109
616000.0 90600.0 3192.991
616025.0 90500.0 3082.684
616025.0 90525.0 3116.597
616025.0 90550.0 3149.812
616025.0 90575.0 3177.607
616025.0 90600.0 3191.986

,依此类推。第一列代表x坐标,中间一列代表y坐标,z属于xy坐标的高度。

我使用pandas读取数据,然后将列转换为单独的xyz NumPy一维数组。到目前为止,我设法创建了一个带有for循环的简单3D散点图,该循环遍历每个1D数组的每个索引,但是这要花一些时间,而且看起来效率很低。

我曾尝试使用scipy.interpolate.griddataplt.plot_surface,但是对于z数据,我总是会得到一个错误,那就是数据应该在2D数组中,但是我不知道为什么或应该是2D数据的方式。我假设给定我有xyz数据,应该有一种方法可以简单地从中创建表面。有没有简单的方法?

2 个答案:

答案 0 :(得分:0)

有一种无需使用熊猫即可轻松实现目标的方法。

import numpy as np 
import matplotlib.pyplot as plt 
import mpl_toolkits.mplot3d

x, y = np.mgrid[-2 : 2 : 20j, -2 : 2 : 20j]
z = 50 * np.sin(x + y)                     # test data
output = plt.subplot(111, projection = '3d')   # 3d projection
output.plot_surface(x, y, z, rstride = 2, cstride = 1, cmap = plt.cm.Blues_r)
output.set_xlabel('x')                         # axis label
output.set_xlabel('y')
output.set_xlabel('z')

plt.show()

plot example

答案 1 :(得分:0)

在给定matplotlib的情况下,可以使用X Y Z中的函数plot_trisurfscatter来绘制given plot

import sys
import csv
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d

# Read CSV
csvFileName = sys.argv[1]
csvData = []
with open(csvFileName, 'r') as csvFile:
    csvReader = csv.reader(csvFile, delimiter=' ')
    for csvRow in csvReader:
        csvData.append(csvRow)

# Get X, Y, Z
csvData = np.array(csvData)
csvData = csvData.astype(np.float)
X, Y, Z = csvData[:,0], csvData[:,1], csvData[:,2]

# Plot X,Y,Z
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(X, Y, Z, color='white', edgecolors='grey', alpha=0.5)
ax.scatter(X, Y, Z, c='red')
plt.show()

在这里

  • 包含X Y Z数据的文件,作为上述脚本的参数提供
  • plot_trisurf中的
  • ,用于控制外观的参数。例如alpha用于控制表面的不透明度
  • scatter中,c参数指定在表面上绘制的点的颜色

对于给定的数据文件,将生成以下图

enter image description here

注意:在这里,地形是由给定3D点集的三角剖分形成的。因此,绘图中沿曲面的轮廓未与X轴和Y轴对齐