2013-03-23 89 views
2

我想從一個大文件中繪製一些數據。 數據具有以下形式:「輸入x和y必須是1D或2D」matplotlib中的錯誤

0.025876 139 0 
0.030881 140 0 
0.030982 141 0 
0.035602 142 0 
0.035521 143 0 
0.038479 144 0 
0.040668 145 0 
0.040121 146 0 
0.037953 147 0 
0.039027 148 0 
0.038338 149 0 
0.047557 139 1 
0.045105 140 1 
0.044943 141 1 
0.042370 142 1 
0.042025 143 1 
0.038946 144 1 
0.037953 145 1 
0.033373 146 1 
0.030070 147 1 
0.029118 148 1 
0.025552 149 1 

原則上,每行對應於一個三維點,我會「只是」想繪製從這些點類似於什麼我可以用做產生的三維表面在gnuplot中爲那些瞭解它的人繪製splot函數。

你打算在網上找到一個答案,我的問題,我試圖與matplolib輪廓功能下列事情:

#!/usr/bin/python 

from numpy import * 
import pylab as p 
import sys 
import mpl_toolkits.mplot3d.axes3d as p3 

s = str(sys.argv[1]) 
f = open(s) 
z,y,x = loadtxt(f, unpack = True) 
f.close 
#x = [1,2,3] 
#y = [1,2,3] 
#z = [1,8,16] 
data = zip(x,y,z) 

#map data on the plane 
X, Y = meshgrid(arange(0, 89, 1), arange(0, 300, 1)) 
Z = zeros((len(X),len(Y)),'Float32') 
for x_,y_,z_ in data: 
    Z[x_, y_] = z_ #this should work, but only because x and y are integers 
      #and arange was done with a step of 1, starting from 0 

fig=p.figure() 
ax = p3.Axes3D(fig) 
ax.contourf(X,Y,Z) 
ax.set_xlabel('X') 
ax.set_ylabel('Y') 
ax.set_zlabel('Z') 
p.show() 

這段代碼工作實際罰款的向量x,y和z評論在上面的代碼中加上一個hashtag。

但是我知道,我正在嘗試使用上面給出的數據,我在matplotlib中得到「輸入x和y必須是1D或2D」錯誤。

我讀過這可能與Z不具有與X或Y相同形狀的事實有關......但我不確定如何處理此問題。

順便說一句,你可能已經意識到,我是一個Python新手,我很抱歉如果代碼對你們中的一些人來說很醜。

無論如何,任何幫助將非常受歡迎。

謝謝!

法比安斯基

+0

X和Z的形狀是不一樣的,嘗試:'零(X.shape), '浮點32')'。 – HYRY 2013-03-23 13:08:30

+0

我道歉......我不知道把X.shape位放在哪裏。我寫Z =零(X.shape,'Float32')? – gatsu 2013-03-23 13:29:42

回答

1

使用scipy.interpolate.griddata

import io 
import sys 
import numpy as np 
import matplotlib.pyplot as plt 
import mpl_toolkits.mplot3d.axes3d as axes3d 
import scipy.interpolate as interpolate 

content = '''0.025876 139 0 
0.030881 140 0 
0.030982 141 0 
0.035602 142 0 
0.035521 143 0 
0.038479 144 0 
0.040668 145 0 
0.040121 146 0 
0.037953 147 0 
0.039027 148 0 
0.038338 149 0 
0.047557 139 1 
0.045105 140 1 
0.044943 141 1 
0.042370 142 1 
0.042025 143 1 
0.038946 144 1 
0.037953 145 1 
0.033373 146 1 
0.030070 147 1 
0.029118 148 1 
0.025552 149 1''' 

data = np.genfromtxt(io.BytesIO(content), dtype=None, names='x, y, z') 

# Or, to read from a file: 
# data = np.genfromtxt(filename, dtype=None, names='x, y, z') 

x, y, z = data['x'], data['y'], data['z'] 
N = 20 
xi = np.linspace(x.min(), x.max(), N) 
yi = np.linspace(y.min(), y.max(), N) 

X, Y = np.meshgrid(xi, yi) 
Z = interpolate.griddata((x, y), z, (X, Y), method='nearest') 

fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1, projection='3d') 
ax.scatter(data['x'], data['y'], data['z']) 
ax.plot_wireframe(X, Y, Z, rstride=1, cstride=1) 
# ax.plot_surface(X, Y, Z) 
plt.show() 

產生

enter image description here


相關鏈接:

+0

非常感謝!有沒有辦法直接從文件中導入內容?就像我在第一個代碼中試圖做的一樣?我試圖使用「content = np.loadtxt(f)」,其中f指向一個數據文件,但格式似乎不太好... – gatsu 2013-03-23 13:55:11

+0

是的,使用'data = np.genfromtxt(filename,...) 。我已經編輯了上面的代碼來展示我的意思。 'np.genfromtxt'可以帶一個類似文件的對象(例如'io.BytesIO(...)')或一個被解釋爲數據文件路徑的字符串。這是一個鏈接,更多地解釋[np.genfromtxt](http://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html#numpy-genfromtxt)。 – unutbu 2013-03-23 13:58:01

+0

非常感謝你,真的! – gatsu 2013-03-23 15:02:44