Genera una mappa di calore in matplotlib utilizzando un set di dati a dispersione
-
29-10-2019 - |
Domanda
La mia domanda è quasi esattamente simile a Questo. Tuttavia, Non sono soddisfatto delle risposte, perché voglio generare una mappa di calore reale, senza binnare esplicitamente i dati.
Per essere precisi, vorrei visualizzare la funzione che è il risultato di una convoluzione tra i dati di dispersione e un kernel personalizzato, come 1/x^2.
Come dovrei implementarlo con matplotlib?
MODIFICARE: Fondamentalmente, quello che ho fatto è questo. Il risultato è qui. Vorrei mantenere tutto, l'asse, il titolo, le etichette e così via. Fondamentalmente cambia la trama per essere come ho descritto, pur reimplementando il meno possibile.
Soluzione
Converti i dati delle serie temporali in un formato numerico con matplotlib.dats.date2num. Posare una griglia rettangolare che si estende per le gamme X e Y e fai la tua convoluzione su quella trama. Crea un diagramma pseudo-colorato della tua convoluzione e quindi riformatta le etichette X per essere date.
La formattazione dell'etichetta è un po 'disordinata, ma ragionevolmente bene documentato. È solo necessario sostituire l'autodadaformati con dataformatter e una stringa di formattazione appropriata.
Dovrai modificare le costanti nella convoluzione per i tuoi dati.
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()