簡體   English   中英

在 Python 中創建 xyz 高度數據的曲面圖

[英]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讀取數據,然后將列轉換為單獨的xyz NumPy 1D 數組。 到目前為止,我設法創建了一個簡單的 3D 散點圖,其中for循環遍歷每個 1D 數組的每個索引,但這需要很長時間並且看起來效率很低。

我嘗試使用scipy.interpolate.griddataplt.plot_surface ,但是對於z數據,我總是得到數據應該在 2D 數組中的錯誤,但我無法弄清楚為什么或如何它應該是 2D 數據。 我假設鑒於我有 xyz 數據,應該有一種方法可以簡單地從它創建一個表面。 有簡單的方法嗎?

使用matplotlib函數plot_trisurfscatter ,可以將給定的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
  • scatterc參數指定繪制在表面上的點的顏色

對於給定的數據文件,生成以下圖

在此處輸入圖片說明

注意:這里,地形是由給定的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM