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 шт):

Автор решения: Pak Uula

Методы 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)

f(r) = sin(10r)

Картинки на нерегулярной сетке из 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)

введите сюда описание изображения

→ Ссылка