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

2024-09-28 18:59:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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,但它需要一个shape对象,我不确定如何将这些列表转换为numpy数组。

我试过:

i,j = np.meshgrid(x,y)
arr = np.array(z)
plt.pcolormesh(i,j,arr)
plt.show()

它告诉我:

IndexError: too many indices

有人能阻止我用键盘猛击我的头吗?


Tags: 文件inforwithnplinepltword
3条回答

索引错误是因为pcolormesh需要一个2D数组,而arr是一个1D向量。如果我理解正确,你的输入文件有

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)

好吧,这有几个步骤。

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

接下来,我们要制作一个由xy组成的二维网格,因此我们只需要存储从这些到数组的唯一值,以馈送到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()

如果没有规则网格(即每个网格值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()

pivot方法将使用索引和列中的唯一值来构造一个将缺少度量值设置为NaN的表。然后可以将表格绘制为热图。

相关问题 更多 >