python: построить тепловую карту (heatmap) с помощью matplotlib для данных, записанных в формате [x, y, z]
У меня есть данные некоторого 2D распределения, записанные в csv файле в виде списка x;y;z, при этом данные представляют собой разброс точек на плоскости {x; y}, а не жестко на сетке.
Подскажите как можно построить тепловую карту с помощью библиотеки matplotlib для таких данных
P.S.
и еще 1 вопрос - одна из осей (x) содержит информацию о времени в формате timestamp (unix time), как можно корректно вывести эту информацию на оси?
Когда у меня были данные в том же csv, но в виде сетки, то я сделал так:
# считать данные из файла
src_data = loadDataFromFile(file_path)
# сформировать numpy массив
x, y, z, = np.array([]), np.array([]), np.array([])
for record in src_data:
x = np.append(x, record[0])
y = np.append(y, record[1])
z = np.append(z, record[2])
# создать сетку заданного размера с интерполяцией данных
xi = np.linspace(x.min(), x.max(), 100)
yi = np.linspace(y.min(), y.max(), 100)
zi = griddata((x, y), z, (xi[None, :], yi[:, None]), method='cubic')
# построить график
px = 1 / plt.rcParams['figure.dpi']
fig, ax = plt.subplots(figsize=(1280 * px, 1024 * px))
plt.contourf(xi, yi, zi, 100, cmap=plt.cm.rainbow)
что работало, когда же пытался добавить время через
dates = []
for record in src_data:
dates.append(datetime.datetime.fromtimestamp(record[0]))
x = np.array(matplotlib.dates.date2num(x))
xfmt = matplotlib.dates.DateFormatter('%d.%m %H:%M')
ax.xaxis.set_major_formatter(xfmt)
то получалась какая-то фигня с тепловой картой
Как это все корректно сделать, подскажите пожалуйста?
Ответы (1 шт):
Методы contour и contourf работают с реглярными сетками. Для нерегулярных сеток есть методы tripcolor и tricontourf
Ниже пример двумерного графика функции f(r) = r*sin(10*r), где r - радиус вектор sqrt(x*x+y*y).
Эталонная картинка на регулярной сетке 20х20
import numpy as np
import matplotlib.pyplot as plt
X,Y = np.meshgrid(np.linspace(0,1,20), np.linspace(0,1,20))
R = np.sqrt(X*X + Y*Y)
Z = R*np.sin(10*R)
_ = plt.figure(figsize=(8,8))
plt.contourf(X,Y,Z, 40)
Картинки на нерегулярной сетке из 400 точек методами триангуляции:
import numpy as np
import matplotlib.pyplot as plt
x = np.random.rand(400)
y = np.random.rand(400)
r = np.sqrt(x*x + y*y)
z = r*np.sin(10*r)
_,((ax1, ax2), (ax3, ax4)) = plt.subplots(2,2, figsize=(20,19))
ax1.set_title("tripcolor")
ax1.tripcolor(x,y,z)
ax1.scatter(x,y)
ax2.set_title("График без точек")
ax2.tripcolor(x,y,z)
ax3.set_title("tricontourf")
ax3.tricontourf(x,y,z, 40)
ax3.scatter(x,y)
ax4.set_title("График без точек")
ax4.tricontourf(x,y,z, 40)

