Построение тепловой карты 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)