[英]Create a surface plot of xyz altitude data in Python
我正在嘗試在 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
1D 數組。 到目前為止,我設法創建了一個簡單的 3D 散點圖,其中for
循環遍歷每個 1D 數組的每個索引,但這需要很長時間並且看起來效率很低。
我嘗試使用scipy.interpolate.griddata
和plt.plot_surface
,但是對於z
數據,我總是得到數據應該在 2D 數組中的錯誤,但我無法弄清楚為什么或如何它應該是 2D 數據。 我假設鑒於我有 xyz 數據,應該有一種方法可以簡單地從它創建一個表面。 有簡單的方法嗎?
使用matplotlib
函數plot_trisurf
和scatter
,可以將給定的XYZ
數據繪制成類似於給定的 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()
這里,
XYZ
數據的文件plot_trisurf
,用於控制外觀的參數。 例如用於控制表面不透明度的alpha
scatter
, c
參數指定繪制在表面上的點的顏色對於給定的數據文件,生成以下圖
注意:這里,地形是由給定的 3D 點集的三角剖分形成的。 因此,圖中沿表面的輪廓未與 X 軸和 Y 軸對齊
有一種更簡單的方法可以在不使用熊貓的情況下實現您的目標。
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()
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()
下面是我的輸出圖像 - 我有很多數據點:在此處輸入圖像描述
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.