Построение тепловой карты X, Y, интенсивности из трех списков

Я не понимаю,как создать тепловую карту (или контурный график), когда у меня есть 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 ответов


хорошо, есть несколько шагов к этому.

во-первых, гораздо более простой способ, чтобы прочитать файл данных с numpy.genfromtxt. Вы можете установить разделитель как запятую с


ошибка индекса возникает из-за того, что pcolormesh ожидает 2D-массив, а ваш arr - это вектор 1Д. Также, если я правильно понимаю, ваш входной файл имеет форму

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)

если у вас нет регулярной сетки (т. е. значения z для каждого значения meshgrid x и y), вы можете использовать более общий метод, основанный на кадрах данных 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. Затем таблицу можно построить в виде тепловой карты.


чтобы преобразовать список в массив 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)