从三个列表绘制热图:X、Y、强度
Plotting a heat map from three lists: X, Y, Intensity
当我有 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
但它需要一个形状对象,我不确定如何将这些列表转换为 NumPy 数组。
我试过了:
i,j = np.meshgrid(x,y)
arr = np.array(z)
plt.pcolormesh(i,j,arr)
plt.show()
它告诉我:
IndexError: too many indices
有人能阻止我用头撞键盘吗?
好的,这需要几个步骤。
首先,一种更简单的读取数据文件的方法是使用 numpy.genfromtxt
。您可以使用 delimiter
参数将分隔符设置为逗号。
接下来,我们要制作 x
和 y
的二维网格,因此我们只需要将它们的唯一值存储到数组中以提供给 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()
要将列表转换为 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)
索引错误是因为 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 值,然后简单地将您的向量重新整形为二维数组。
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()
数据透视方法将使用索引和列中的唯一值来构造一个 table,并将缺失的测量值设置为 NaN。然后可以将 table 绘制为热图。
当我有 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
但它需要一个形状对象,我不确定如何将这些列表转换为 NumPy 数组。
我试过了:
i,j = np.meshgrid(x,y)
arr = np.array(z)
plt.pcolormesh(i,j,arr)
plt.show()
它告诉我:
IndexError: too many indices
有人能阻止我用头撞键盘吗?
好的,这需要几个步骤。
首先,一种更简单的读取数据文件的方法是使用 numpy.genfromtxt
。您可以使用 delimiter
参数将分隔符设置为逗号。
接下来,我们要制作 x
和 y
的二维网格,因此我们只需要将它们的唯一值存储到数组中以提供给 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()
要将列表转换为 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)
索引错误是因为 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 值,然后简单地将您的向量重新整形为二维数组。
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()
数据透视方法将使用索引和列中的唯一值来构造一个 table,并将缺失的测量值设置为 NaN。然后可以将 table 绘制为热图。