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

时间:2015-11-26 15:56:24

标签: python matplotlib heatmap

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

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

4 个答案:

答案 0 :(得分:6)

好的,还有几个步骤。

首先,更简单的方法是使用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()

答案 1 :(得分:2)

索引错误源于pcolormesh在@using (Html.BeginForm("", "User", FormMethod.Post, new { enctype = "multipart/form-data", @class = "form-horizontal" })) { // @Html.AntiForgeryToken() <table> <tr> <td> @Html.LabelFor(x => x.UserName) </td> <td> @Html.EditorFor(x => x.UserName) </td> </tr> <tr> <td> @Html.LabelFor(x => x.Password) </td> <td> @Html.EditorFor(x => x.Password) </td> </tr> <tr> <td colspan="2"> <input type="submit" value="login" onclick="return Upload();"> </td> </tr> <tr> <td colspan="2"> @Html.TextBoxFor(x => x.Resume, new { type = "file" }) </td> </tr> <tr> <td colspan="2"> @Html.ValidationSummary(true) </td> </tr> </table> } 是1D向量时期望2D数组的事实。另外,如果我理解正确,您的输入文件的格式为

    [HttpPost]
    public ActionResult Index(UserLoginModel obj)

在这种情况下,arr将无效,因为它需要0,1,z 0,2,z ... 0,ymax,z ... 1,1,z 1,2,z ... xmax,ymax,z 之类的内容,即没有重复值的向量。

在你的情况下,你需要找出有多少不同的x和y值,然后简单地将你的矢量重塑成2D数组。

meshgrid(x,y)

答案 2 :(得分:1)

如果您没有常规网格(即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的表。然后可以将该表绘制为热图。

答案 3 :(得分: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)