web-dev-qa-db-ja.com

3つのリストからヒートマップX、Y、強度をプロットする

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

誰かが私の頭をキーボードにぶつけるのを止めてもらえますか?

8
fiz

OK、これにはいくつかの手順があります。

まず、データファイルを読み取るためのはるかに簡単な方法は numpy.genfromtxt を使用することです。区切り文字は、delimiter引数を使用してコンマに設定できます。

次に、xyの2Dメッシュを作成したいので、それらから配列に一意の値を格納して、numpy.meshgridにフィードする必要があります。

最後に、これら2つの配列の長さを使用して、z配列の形状を変更できます。

(注:このメソッドは、グリッド上のすべてのポイントにxy、および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()
6
tmdavison

インデックスエラーは、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)
_
2
thomas

通常のグリッド(つまり、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に設定されたテーブルを作成します。その後、テーブルをヒートマップとしてプロットできます。

1
Vadim Smolyakov

リストを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)
0
ljetibo