Создать тепловую карту в MatPlotLib, используя набор данных разброса - PullRequest
4 голосов
/ 17 июня 2011

Мой вопрос почти в точности похож на этот . Однако , я не удовлетворен ответами, потому что я хочу сгенерировать фактическую тепловую карту, без явного объединения данных.

Чтобы быть точным, я хотел бы отобразить функцию, котораяявляется результатом свертки между данными разброса и пользовательским ядром, например 1 / x ^ 2.

Как мне реализовать это с помощью matplotlib?

EDIT В основном то, что я сделал, это это .Результат здесь .Я хотел бы сохранить все, ось, заголовок, метки и так далее.По сути, просто измените сюжет так, как я описал, и при этом измените как можно меньше.

1 Ответ

13 голосов
/ 17 июня 2011

Преобразуйте данные временных рядов в числовой формат с помощью matplotlib.dats.date2num.Положите прямоугольную сетку, которая охватывает ваши диапазоны x и y, и сделайте свертку на этом графике.Создайте псевдоцветный график своей свертки, а затем переформатируйте метки x, чтобы они стали датами.

Форматирование метки немного грязное, но достаточно хорошо задокументировано .Вам просто нужно заменить AutoDateFormatter на DateFormatter и соответствующую строку форматирования.

Вам необходимо настроить константы в свертке для ваших данных.

import numpy as np
import datetime as dt
import pylab as plt
import matplotlib.dates as dates

t0 = dt.date.today()
t1 = t0+dt.timedelta(days=10)

times = np.linspace(dates.date2num(t0), dates.date2num(t1), 10)
dt = times[-1]-times[0]
price =  100 - (times-times.mean())**2
dp = price.max() - price.min()
volume = np.linspace(1, 100, 10)

tgrid = np.linspace(times.min(), times.max(), 100)
pgrid = np.linspace(70, 110, 100)
tgrid, pgrid = np.meshgrid(tgrid, pgrid)
heat = np.zeros_like(tgrid)

for t,p,v in zip(times, price, volume):
    delt = (t-tgrid)**2
    delp = (p-pgrid)**2
    heat += v/( delt + delp*1.e-2 + 5.e-1 )**2

fig = plt.figure()
ax = fig.add_subplot(111)
ax.pcolormesh(tgrid, pgrid, heat, cmap='gist_heat_r')

plt.scatter(times, price, volume, marker='x')

locator = dates.DayLocator()
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(dates.AutoDateFormatter(locator))
fig.autofmt_xdate()

plt.show()

Script output

...