创建一个xyz高程数据的曲面图。

10
我正在尝试使用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坐标的高度。
我使用pandas读取数据,然后将列转换为单独的x、y、z NumPy一维数组。到目前为止,我已经成功创建了一个简单的三维散点图,使用for循环迭代每个一维数组的每个索引,但这需要很长时间,看起来效率相当低下。
我尝试使用scipy.interpolate.griddata和plt.plot_surface,但对于z数据,我总是得到一个错误,即数据应该是一个二维数组,但我无法弄清楚为什么或者应该如何将其转换为二维数据。我假设,鉴于我有xyz数据,应该有一种简单的方法来创建一个表面。是否有简单的方法?
3个回答

8

使用来自matplotlib的函数plot_trisurfscatter,可以绘制类似于给定图形X Y Z数据。

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轴对齐。


2
import numpy as np  
import matplotlib.pyplot as plt  
import mpl_toolkits.mplot3d 
import pandas as pd 
 
df = pd.read_csv("/content/1.csv") 
X = df.iloc[:, 0] 
Y = df.iloc[:, 1] 
Z = df.iloc[:, 2] 
 
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()

以下是我的输出图像 - 我有很多数据点: 在此输入图像描述


-1

有一种更简单的方法可以实现你的目标,而不需要使用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()

plot example


5
谢谢您的回复。当我尝试使用我的 x、y、z 数据时,它也显示 Z 必须是二维的。我的 z 数据是高度值,因此不能由输入的 x 和 y 计算得出。 - sfluck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接