2014-02-17 93 views
0

我想使用定義的函數將輸入數據轉換爲matplotlib可以使用的網格數組。有關更大數據的示例,請查看我的griddata.zip文件。 這些數組看起來像例如:x = [0,1.0,2.0], y = [0.0,10.0,20.0], z = [0.0, 20.0, 50.0]這意味着它們具有相同的長度,z應該繪製在x-y網格上。:基本上,之前有一些努力來回答這個問題。可能的解決方案是由M4rtini給出:Python將大數據數組轉換爲matplotlib的網格

from numpy import linspace, meshgrid 
import numpy as np 
from pprint import pprint 
from scipy.interpolate import griddata 

def grid(x, y, z, resX=100, resY=100): 
    "Convert 3 column data to matplotlib grid" 
    grid_x, grid_y = np.mgrid[min(x): max(x):1j * resX, min(y): max(y):1j * resY] 
    Z = griddata(np.array(zip(x, y)), np.array(z), (grid_x, grid_y), method='nearest') 
    return grid_x, grid_y, Z 

x =[0,1.0,2.0] 
y = [0.0,10.0,20.0] 
z = [0.0, 20.0, 50.0] 

X,Y,Z = grid(x,y,z) 

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

ax.plot_surface(X,Y,Z) 
plt.show() 

情節輸出應該是這樣的大的數據文件:Image of Plot output

+0

我認爲這是不好的做法,命名變量和功能相同。也許你可以試試'print grid(x,y,z)',然後擔心輸出的格式。此外,我認爲你需要添加'從scipy.interpolate import griddata' – philshem

+0

謝謝,我更新了我的描述,但返回值是None。 – beneminzl

+0

你可以分享整個代碼,而不是分成兩部分。 – philshem

回答

0
from numpy import linspace, meshgrid 
import numpy as np 
from pprint import pprint 
from scipy.interpolate import griddata 

def grid(x, y, z, resX=100, resY=100): 
    "Convert 3 column data to matplotlib grid" 
    grid_x, grid_y = np.mgrid[min(x): max(x):1j * resX, min(y): max(y):1j * resY] 
    Z = griddata(np.array(zip(x, y)), np.array(z), (grid_x, grid_y), method='nearest') 
    return grid_x, grid_y, Z 


x =[0,1.0,2.0] 
y = [0.0,10.0,20.0] 
z = [0.0, 20.0, 50.0] 

X,Y,Z = grid(x,y,z) 

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

ax.plot_surface(X,Y,Z) 
plt.show() 

任何其他插值方法失敗,此測試數據。

enter image description here

+0

謝謝,因爲我最小的例子,這完美的作品,但我不明白爲什麼它不適用於這裏[鏈接](https://dl.dropboxusercontent.com/u/59720953/griddata。壓縮),任何想法? – beneminzl

+0

'from pylab import *'覆蓋scipy的griddata。由於pylab有它自己的griddata函數。這就是爲什麼你永遠不應該使用'從xx導入*'兩個進口中的一個需要改變。 – M4rtini

+0

對於這些數據,您也可以將該方法更改爲'linear'或'cubic'以獲得更好的結果。 – M4rtini