2016-10-13 6 views
0

こんにちは私は、.datファイルからプロットすることで、3DサーフェスプロットをPythonで実行しようとしています。私はかなりの問題を抱えています。私は最終的にエラーメッセージを生成しないコードを持っていますが、.datファイルが空ではないにもかかわらずプロットには何も表示されません。私のコードは以下の通りです。.datファイルの3Dサーフェスプロット

3Dサーフェスプロットを使用して.datファイルからデータをプロットするにはどうすればよいですか?私のデータは3つの列として.datファイルに書式設定されています。助けてくれてありがとう!

更新:.datファイルが空ではなく、3D散布図で同じ.datファイルをプロットすることはできますが、この3Dサーフェスプロットコードでは機能しません。 .datファイルには、次のようなもの(数字のわずか3列)になります。

1 2 6 
3 8 7 
4 9 3 
5 2 5 


from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
import matplotlib.pyplot as plt 
from matplotlib.mlab import griddata 
import numpy as np 

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

data = np.genfromtxt('file.dat') 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 

xi = np.linspace(min(x), max(x),0.1) 
yi = np.linspace(min(y), max(y),0.1) 

X, Y = np.meshgrid(xi, yi) 
Z = griddata(x, y, z, xi, yi, interp='linear') 

ax.set_xlabel('$x$', fontsize = 14) 
ax.set_ylabel('$y$', fontsize = 14) 
ax.set_zlabel('$z$', fontsize = 14) 
ax.set_title('result..', fontsize = 14) 

surf = ax.plot_surface(X, Y, Z, linewidth=1, antialiased=True) 

ax.set_zlim3d(0,1) 

plt.show() 
+0

データを投稿した場合、または少なくとも最初の10行ほどの回答を得ることができます。データを共有できない場合は、いくつかの人工データ(たとえばnp.randomを使用)で問題を再現することが最善です。 – lanery

+0

'np.genfromtxt(...)'行の後に 'print data.shape'を実行することで' data'が実際に空でないことを確認できますか? –

+0

@MarijnvanVlietありがとう、私は今、それを試してみました。それは(6561,3)を印刷します。注:3D散布図を使ってこの.datファイルをプロットできますが、2番目は3Dサーフェスプロットコードで同じ.datファイルを実行しようとしています。プロットには何も表示されません。助言がありますか?再度、感謝します! –

答えて

1

私の推測であなたの問題はあなたが私は気付かなかったことnp.linspaceで作っているという些細な間違いに降りてくるということであるとき、Iコメントしました。 np.linspaceの3番目の引数は、配列内の点の数であり、点間の間隔ではありません(np.arange)。

私が間違っている場合は、ここで完全な実例を示します(http://matplotlib.org/examples/pylab_examples/griddata_demo.htmlから変更)。この例を実行してもサーフェスプロットが表示されない場合は、より基本的な問題ですあなたはmatplotlibとしています。

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
import matplotlib.pyplot as plt 
from matplotlib.mlab import griddata 
import numpy as np 

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

#data = np.genfromtxt('file.dat') 
npts = 1000 
x = np.random.uniform(-2, 2, npts) 
y = np.random.uniform(-2, 2, npts) 
z = x*np.exp(-x**2 - y**2) 

xi = np.linspace(min(x), max(x), 100) # <-- note change to 100 
yi = np.linspace(min(y), max(y), 100) # <-- note change to 100 

X, Y = np.meshgrid(xi, yi) 
Z = griddata(x, y, z, xi, yi, interp='linear') 

surf = ax.plot_surface(X, Y, Z, rstride=5, cstride=5, cmap=cm.viridis, 
         linewidth=1, antialiased=True) 

ax.set_zlim3d(np.min(Z), np.max(Z)) 
fig.colorbar(surf) 

enter image description here

ax.set_zlim3d(0,1)のご使用も問題になる可能性があることに注意してください。私はあなたのデータがプロットされる前にあなたの軸の限界を設定することをお勧めしません。

関連する問題