首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中创建xyz高程数据的曲面图

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

Stack Overflow用户
提问于 2018-08-17 16:42:43
回答 3查看 20.9K关注 0票数 8

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

代码语言:javascript
复制
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 1D数组。到目前为止,我成功地创建了一个简单的3D散点图,使用一个for循环迭代每个一维数组的每个索引,但这需要很长时间,而且看起来效率很低。

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

EN

回答 3

Stack Overflow用户

发布于 2019-03-08 23:42:37

使用matplotlib中的函数plot_trisurfscatter,可以像绘制given plot一样绘制给定的X Y Z数据。

代码语言:javascript
复制
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轴对齐

票数 5
EN

Stack Overflow用户

发布于 2022-01-15 13:57:13

代码语言:javascript
复制
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()

我的输出图像如下-我有很多数据点: enter image description here

票数 1
EN

Stack Overflow用户

发布于 2018-08-17 16:57:51

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

代码语言:javascript
复制
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()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51891538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档