【问题标题】:Plotting a heat map from three lists: X, Y, Intensity从三个列表中绘制热图:X、Y、强度
【发布时间】:2016-02-29 18:56:18
【问题描述】:

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

有人能阻止我用头撞键盘吗?

【问题讨论】:

    标签: python matplotlib heatmap


    【解决方案1】:

    好的,这有几个步骤。

    首先,读取数据文件的一种更简单的方法是使用numpy.genfromtxt。您可以使用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()
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我遇到了上面提到的同样的问题。我有 16,000 个条目和 16 GB 内存,因为数据量大,表不适合。我不知道为什么会这样,有没有其他方法可以做到这一点?
      【解决方案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)
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2023-02-26
          • 1970-01-01
          • 2018-10-31
          • 1970-01-01
          • 1970-01-01
          • 2016-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多