11

次の形式のファイルのmatplotlibを使用して等高線図を作成しようとしています。

x1 y1 z1

x2 y2 z2

numpy.loadtxtを使用してロードし、ベクトルを取得できます。これまでのところ、問題はありません。

私はこれを読んでプロットの方法を学び、コピーペーストで再現できるので、私のインストールに間違いはないと確信しています:

http://matplotlib.org/examples/pylab_examples/griddata_demo.html

xとyをベクトルとして入力し、zを配列として入力する必要があることを理解しています。これは、griddataで実行できます。これは私がこのサイトで見つけたものでもあります。

ドキュメントには次のように書かれています。

zi = griddata(x、y、z、xi、yi)は、z = f *(* x、y)の形式の表面を(通常)不均一な間隔のベクトル(x、y、z)のデータに適合させます。griddata()は、(xi、yi)で指定されたポイントでこのサーフェスを補間して、ziを生成します。xiとyiは、通常のグリッドを記述する必要があり、1Dまたは2Dのいずれかですが、単調に増加する必要があります。

例のために、私はこのコードを書きました:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as ml

x=np.linspace(1.,10.,20)
y=np.linspace(1.,10.,20)
z=np.linspace(1.,2.,20)

xi=np.linspace(1.,10.,10)
yi=np.linspace(1.,10.,10)

zi = ml.griddata(x,y,z,xi,yi)

ただし、griddataに関しては、次のエラーが発生します。IndexError:無効なインデックス

それで、私は次のようにドキュメントの例を少し変更しようとしました:

from matplotlib.mlab import griddata
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-2.1,2.1,300)
y = np.linspace(-2.1,2.1,300)
z = x*np.exp(-x**2-y**2)
# define grid.
xi = np.linspace(-2.1,2.1,100)
yi = np.linspace(-2.1,2.1,200)
# grid the data.
zi = griddata(x,y,z,xi,yi,interp='linear')

そして、私は同じエラーを受け取ります。何が悪いのかわかりません。

ご協力いただきありがとうございます。

4

2 に答える 2

16

検討:

x = np.linspace(1., 10., 20)
y = np.linspace(1., 10., 20)
z = np.linspace(1., 2., 20)

これは、線に沿った特定のポイントでのz値がわかっていることを意味しますx=y

そこから、

zi = ml.griddata(x,y,z,xi,yi)

は、長方形グリッド内のすべてのポイント mlab.griddataの値を外挿するように求めています。z

zこの線に沿ってどのように変化するかについては多くの情報を提供しzましたが、垂直方向(x = y線から離れる方向)でどのように変化するかについての情報はありません。mlab.griddata推測を拒否したため、エラーが発生しています。

x最初のyデータがよりランダムに分散されると、より良い結果が得られます。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as ml

ndata = 10
ny, nx = 100, 200
xmin, xmax = 1, 10
ymin, ymax = 1, 10
# x = np.linspace(1, 10, ndata)
# y = np.linspace(1, 10, ndata)

x = np.random.randint(xmin, xmax, ndata)
y = np.random.randint(ymin, ymax, ndata)
z = np.random.random(ndata)

xi = np.linspace(xmin, xmax, nx)
yi = np.linspace(ymin, ymax, ny)
zi = ml.griddata(x, y, z, xi, yi)

plt.contour(xi, yi, zi, 15, linewidths = 0.5, colors = 'k')
plt.pcolormesh(xi, yi, zi, cmap = plt.get_cmap('rainbow'))

plt.colorbar() 
plt.scatter(x, y, marker = 'o', c = 'b', s = 5, zorder = 10)
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.show()

ここに画像の説明を入力してください


mlab.griddata線に沿ってグリッド全体に任意の方法でデータを外挿する場合は、2つの境界点をx=y追加して:(xmin, ymax, z[0])(xmax,ymin,z[-1])

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as ml

np.random.seed(8)
ndata = 10
ny, nx = 100, 200
xmin, xmax = 1, 10
ymin, ymax = 1, 10
x = np.linspace(1, 10, ndata)
y = np.linspace(1, 10, ndata)
z = np.random.random(ndata)
x = np.r_[x,xmin,xmax]
y = np.r_[y,ymax,ymin]
z = np.r_[z,z[0],z[-1]]
xi = np.linspace(xmin, xmax, nx)
yi = np.linspace(ymin, ymax, ny)


# Requires installation of natgrid
# http://sourceforge.net/projects/matplotlib/files/matplotlib-toolkits/
zi = ml.griddata(x, y, z, xi, yi, interp='nn')

# Or, without natgrid:
# zi = ml.griddata(x, y, z, xi, yi, interp='linear')

plt.contour(xi, yi, zi, 15, linewidths = 0.5, colors = 'k')
plt.pcolormesh(xi, yi, zi, cmap = plt.get_cmap('rainbow'))

plt.colorbar() 
plt.scatter(x, y, marker = 'o', c = 'b', s = 10, zorder = 10)
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.show()

ここに画像の説明を入力してください

于 2012-12-08T19:58:10.447 に答える
6

わかりました、私はついにそれをプロットするための解決策を見つけました。興味のある人のために、ここにトリックがあります:「最も近い」メソッドでScipyからのgriddataを使用してください。

from scipy.interpolate import griddata
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(1.,10.,20)
y=np.linspace(1.,10.,20)
z=z = np.random.random(20)
xi=np.linspace(1.,10.,10)
yi=np.linspace(1.,10.,10)

X,Y= np.meshgrid(xi,yi)
Z = griddata((x, y), z, (X, Y),method='nearest')
plt.contourf(X,Y,Z)
于 2012-12-08T20:42:50.457 に答える