从三个列表绘制热图X,Y,强度

fiz*_*fiz 8 python matplotlib heatmap

当我有x,y,强度时,我不知道如何创建热图(或等高线图).我有一个看起来像这样的文件:

0,1,6
0,2,10
....
Run Code Online (Sandbox Code Playgroud)

至今:

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])
Run Code Online (Sandbox Code Playgroud)

尝试使用pcolormesh,但它想要一个形状对象,我不确定如何将这些列表转换为numpy数组.

我试过了:

i,j = np.meshgrid(x,y)
arr = np.array(z)
plt.pcolormesh(i,j,arr)
plt.show()
Run Code Online (Sandbox Code Playgroud)

它告诉我:

IndexError: too many indices
Run Code Online (Sandbox Code Playgroud)

有人可以阻止我对着键盘砸我的头吗?

tmd*_*son 8

好的,这有几个步骤.

首先,一种更简单的方法来读取您的数据文件numpy.genfromtxt.您可以将分隔符设置为带delimiter参数的逗号.

接下来,我们要的二维网格xy,所以我们只是需要存储从那些阵列喂以独特的价值观numpy.meshgrid.

最后,我们可以使用这两个数组的长度来重塑我们的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()
Run Code Online (Sandbox Code Playgroud)


Vad*_*kov 6

如果您没有常规网格(即 x 和 y 的每个网格网格值的 z 值),您可以使用基于熊猫数据框的更通用的方法:

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()
Run Code Online (Sandbox Code Playgroud)

数据透视方法将使用索引和列中的唯一值来构造一个表,其中缺失测量值设置为 NaN。然后可以将该表绘制为热图。