我正在尝试用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 1D数组。到目前为止,我成功地创建了一个简单的3D散点图,使用一个for循环迭代每个一维数组的每个索引,但这需要很长时间,而且看起来效率很低。
我尝试过使用scipy.interpolate.griddata和plt.plot_surface,但是对于z数据,我总是得到一个错误,认为数据应该在2D数组中,但是我不知道为什么或者应该如何成为2D数据。我假设我有xyz数据,应该有一种方法可以简单地从它创建一个表面。有没有简单的方法?
发布于 2019-03-08 23:42:37
使用matplotlib中的函数plot_trisurf和scatter,可以像绘制given plot一样绘制给定的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参数指定在表面上绘制的点的颜色
对于给定的数据文件,将生成以下图

注意:在这里,地形是通过对给定的一组3D点进行三角测量而形成的。因此,地块中沿表面的等高线不与X轴和Y轴对齐
发布于 2022-01-15 13:57:13
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
发布于 2018-08-17 16:57:51
有一种更简单的方法来实现你的目标,而不是使用熊猫。
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()

https://stackoverflow.com/questions/51891538
复制相似问题