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

2024-10-01 09:19:01 发布

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

我试图用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读入数据,然后将列转换为单个的xyzNumPy1D数组。到目前为止,我成功地创建了一个简单的3D散点图,其中一个for循环遍历每个1D数组的每个索引,但这需要很长时间,而且看起来效率很低。在

我尝试过使用scipy.interpolate.griddataplt.plot_surface,但是对于z数据,我总是会得到一个错误,即数据应该在二维数组中,但我无法弄清楚为什么它应该是2D数据。假设我有xyz数据,应该有一种方法可以简单地从它创建一个曲面。有简单的方法吗?在


Tags: 数据方法pandasfor高度thatscipy数组
2条回答

使用来自matplotlib的函数^{}^{},给定的X Y Z数据可以类似于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中,用于控制外观的参数。e、 g.alpha用于控制表面不透明度
  • scatter中,c参数指定绘制在曲面上的点的颜色

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

enter image description here

注意:在这里,地形是由给定的一组三维点的三角剖分形成的。所以,在绘图中沿曲面的等高线并没有和X轴和Y轴对齐

有一个更简单的方法来实现你的目标,不使用熊猫。在

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

相关问题 更多 >