X、y、intensityがある場合、ヒートマップ(または等高線図)を作成する方法がわかりません。私はこのようなファイルを持っています:
0,1,6
0,2,10
....
これまでのところ:
with open('eye_.txt', 'r') as f:
for line in f:
for Word in line.split():
l = Word.strip().split(',')
x.append(l[0])
y.append(l[1])
z.append(l[2])
Pcolormeshを使用してみましたが、シェイプオブジェクトが必要であり、これらのリストをnumpy配列に変換する方法がわかりません。
私は試した:
i,j = np.meshgrid(x,y)
arr = np.array(z)
plt.pcolormesh(i,j,arr)
plt.show()
それは私にそれを教えてくれます:
IndexError: too many indices
誰かが私の頭をキーボードにぶつけるのを止めてもらえますか?
OK、これにはいくつかの手順があります。
まず、データファイルを読み取るためのはるかに簡単な方法は numpy.genfromtxt
を使用することです。区切り文字は、delimiter
引数を使用してコンマに設定できます。
次に、x
とy
の2Dメッシュを作成したいので、それらから配列に一意の値を格納して、numpy.meshgrid
にフィードする必要があります。
最後に、これら2つの配列の長さを使用して、z
配列の形状を変更できます。
(注:このメソッドは、グリッド上のすべてのポイントにx
、y
、およびz
がある通常のグリッドがあることを前提としています)。
例えば:
import matplotlib.pyplot as plt
import numpy as np
data = np.genfromtxt('eye_.txt',delimiter=',')
x=data[:,0]
y=data[:,1]
z=data[:,2]
## Equivalently, we could do that all in one line with:
# x,y,z = np.genfromtxt('eye_.txt', delimiter=',', usecols=(0,1,2))
x=np.unique(x)
y=np.unique(y)
X,Y = np.meshgrid(x,y)
Z=z.reshape(len(y),len(x))
plt.pcolormesh(X,Y,Z)
plt.show()
インデックスエラーは、arr
が1Dベクトルであるのに対し、pcolormeshは2D配列を予期しているという事実から発生します。また、私が正しく理解していれば、入力ファイルの形式は
_0,1,z
0,2,z
...
0,ymax,z
...
1,1,z
1,2,z
...
xmax,ymax,z
_
その場合、meshgrid(x,y)
は、meshgrid(range(xmax),range(ymax))
のようなもの、つまり繰り返し値のないベクトルを期待するため、機能しません。
あなたの場合、異なるx値とy値がいくつあるかを調べてから、ベクトルを2D配列に再形成する必要があります。
_shape = np.unique(x).shape[0],np.unique(y).shape[0]
x_arr = x.reshape(shape)
y_arr = y.reshape(shape)
z_arr = z.reshape(shape)
plt.pcolormesh(x_arr,y_arr,z_arr)
_
通常のグリッド(つまり、xとyのメッシュグリッド値ごとにzの値)がない場合は、pandasデータフレームに基づくより一般的な方法を使用できます:
import pandas as pd
import seaborn as sns
import matplotlib.pypot as plt
data = pd.DataFrame(data={'x':x, 'y':y, 'z':z})
data = data.pivot(index='x', columns='y', values='z')
sns.heatmap(data)
plt.show()
ピボットメソッドは、インデックスと列の一意の値を使用して、欠落している測定値がNaNに設定されたテーブルを作成します。その後、テーブルをヒートマップとしてプロットできます。
リストをnumpy配列に変換するには、np.asarray
を使用できます。
ヒートマップを取得する簡単な方法は次のとおりです。この例を問題に適合させることができるはずです。
import matplotlib.pyplot as plt
import numpy as np
a = [[1,2,3], [3,4,5], [5,6,7], [7, 8, 9]]
b = np.asarray(a)
plt.pcolor(b)
plt.show()
リストのリストのようにデータを読み取るには、次の操作を実行できます。
a = []
for line in file.readlines():
a.append( map( int, line.split(',') ) )
要するに。より長いバージョンでは、次と同等です。
a = []
for line in file.readlines():
tmp = line.split(',')
inttmp = [int(x) for x in a]
a.append(inttmp)