我正在尝试在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
读取数据,然后将列转换为单独的x
,y
,z
NumPy
一维数组。到目前为止,我设法创建了一个带有for
循环的简单3D散点图,该循环遍历每个1D数组的每个索引,但是这要花一些时间,而且看起来效率很低。
我曾尝试使用scipy.interpolate.griddata
和plt.plot_surface
,但是对于z
数据,我总是会得到一个错误,那就是数据应该在2D数组中,但是我不知道为什么或应该是2D数据的方式。我假设给定我有xyz数据,应该有一种方法可以简单地从中创建表面。有没有简单的方法?
答案 0 :(得分:0)
有一种无需使用熊猫即可轻松实现目标的方法。
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()
答案 1 :(得分:0)
在给定matplotlib
的情况下,可以使用X Y Z
中的函数plot_trisurf
和scatter
来绘制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轴对齐