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

新手上路,请多包涵

我正在尝试在 python 中创建一座山的表面图,其中我有一些 xyz 数据。最终结果应该看起来像 那样。该文件的格式如下:

 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坐标的高度。

I read in the data using pandas and then convert the columns to individual x , y , z NumPy 一维数组。到目前为止,我设法用 for 循环迭代每个 1D 数组的每个索引创建了一个简单的 3D 散点图,但这需要很长时间并且看起来效率很低。

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

原文由 sfluck 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 613
1 个回答

Using functions plot_trisurf and scatter from matplotlib , given X Y Z data can be plotted similar to 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 参数指定绘制在表面上的点的颜色

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

在此处输入图像描述

注意: 在这里,地形是由一组给定的 3D 点的三角测量形成的。因此,图中沿曲面的等高线未与 X 轴和 Y 轴对齐

原文由 programmer 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏