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

14

当我有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

有人能帮我阻止我把头撞在键盘上吗?

4个回答

9

好的,这需要几个步骤。

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

接下来,我们想要创建一个xy的2D网格,因此我们需要仅存储这两个数组中的唯一值,并将其提供给numpy.meshgrid

最后,我们可以使用这两个数组的长度来重新塑造我们的z数组。

(注意:此方法假定您具有规则网格,每个网格点都有一个xyz)。

例如:

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()

7

如果您没有一个常规网格(即对于每个meshgrid的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
我有与上述提到的相同的问题。我有16,000个条目和16 GB的内存,由于数据量太大,表格无法适应。我不确定为什么会发生这种情况,是否有其他方法可以解决? - newbie

3

索引错误是因为pcolormesh期望一个二维数组,而你的arr是一个一维向量。如果我理解正确,你的输入文件格式如下:

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)

0

要将列表转换为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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接