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

Posted

技术标签:

【中文标题】在 Python 中创建 xyz 高度数据的曲面图【英文标题】:Create a surface plot of xyz altitude data in Python 【发布时间】:2019-01-24 06:27:32 【问题描述】:

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

我尝试使用scipy.interpolate.griddataplt.plot_surface,但对于z 数据,我总是得到数据应该在二维数组中的错误,但我不知道为什么或如何它应该是二维的数据。我假设鉴于我有 xyz 数据,应该有一种方法可以简单地从它创建一个表面。有没有简单的方法?

【问题讨论】:

【参考方案1】:

使用来自matplotlib 的函数plot_trisurfscatter,给定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 中,用于控制外观的参数。例如alpha 用于控制表面的不透明度 在scatterc 参数中指定绘制在表面上的点的颜色

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

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

【讨论】:

【参考方案2】:

有一种更简单的方法可以在不使用 pandas 的情况下实现您的目标。

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()

【讨论】:

您好,感谢您的回答。当我尝试使用我的 x,y,z 数据时,它还说 Z 必须是二维的。我的 z 数据是高度值,因此它们不能通过输入 x 和 y 计算。

以上是关于在 Python 中创建 xyz 高度数据的曲面图的主要内容,如果未能解决你的问题,请参考以下文章

在 Plotly 中创建 3D 曲面图

如何在python中创建3D高度图

Matlab中的矢量化代码

使用 R 绘制带有等高线图叠加的 3D 曲面图

python用matpiotilb画三维曲面图

如何在python中创建堆叠的条形图[重复]