e la domanda iniziale era ... come convertire i valori di dispersione in valori di griglia, giusto?
histogram2d
conta la frequenza per cella, tuttavia, se si dispone di altri dati per cella oltre alla sola frequenza, è necessario un lavoro aggiuntivo da eseguire.
x = data_x # between -10 and 4, log-gamma of an svc
y = data_y # between -4 and 11, log-C of an svc
z = data_z #between 0 and 0.78, f1-values from a difficult dataset
Quindi, ho un set di dati con risultati Z per le coordinate X e Y. Tuttavia, stavo calcolando alcuni punti al di fuori dell'area di interesse (grandi lacune) e cumuli di punti in una piccola area di interesse.
Sì, qui diventa più difficile ma anche più divertente. Alcune librerie (scusate):
from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np
from scipy.interpolate import griddata
pyplot è il mio motore grafico oggi, cm è una gamma di mappe a colori con qualche scelta iniziale. intontito per i calcoli e griddata per allegare valori a una griglia fissa.
L'ultimo è importante soprattutto perché la frequenza dei punti xy non è equamente distribuita nei miei dati. Innanzitutto, iniziamo con alcuni limiti che si adattano ai miei dati e una dimensione della griglia arbitraria. I dati originali hanno punti dati anche al di fuori dei limiti xey.
#determine grid boundaries
gridsize = 500
x_min = -8
x_max = 2.5
y_min = -2
y_max = 7
Quindi abbiamo definito una griglia con 500 pixel tra i valori minimo e massimo di xe y.
Nei miei dati, ci sono molti più dei 500 valori disponibili nell'area di grande interesse; che nella zona a basso interesse non vi sono nemmeno 200 valori nella griglia totale; tra i confini grafici di x_min
e x_max
ce ne sono ancora di meno.
Quindi, per ottenere una bella foto, il compito è quello di ottenere una media per gli alti valori di interesse e colmare le lacune altrove.
Definisco la mia griglia ora. Per ogni coppia xx-yy, voglio avere un colore.
xx = np.linspace(x_min, x_max, gridsize) # array of x values
yy = np.linspace(y_min, y_max, gridsize) # array of y values
grid = np.array(np.meshgrid(xx, yy.T))
grid = grid.reshape(2, grid.shape[1]*grid.shape[2]).T
Perché la strana forma? scipy.griddata vuole una forma di (n, D).
Griddata calcola un valore per punto nella griglia, con un metodo predefinito. Scelgo "più vicino": i punti della griglia vuoti verranno riempiti con i valori del vicino più vicino. Sembra che le aree con meno informazioni abbiano celle più grandi (anche se non è così). Si potrebbe scegliere di interpolare "lineare", quindi le aree con meno informazioni sembrano meno nitide. Questione di gusti, davvero.
points = np.array([x, y]).T # because griddata wants it that way
z_grid2 = griddata(points, z, grid, method='nearest')
# you get a 1D vector as result. Reshape to picture format!
z_grid2 = z_grid2.reshape(xx.shape[0], yy.shape[0])
E hop, passiamo a matplotlib per visualizzare la trama
fig = plt.figure(1, figsize=(10, 10))
ax1 = fig.add_subplot(111)
ax1.imshow(z_grid2, extent=[x_min, x_max,y_min, y_max, ],
origin='lower', cmap=cm.magma)
ax1.set_title("SVC: empty spots filled by nearest neighbours")
ax1.set_xlabel('log gamma')
ax1.set_ylabel('log C')
plt.show()
Intorno alla parte appuntita della V-Shape, vedi che ho fatto molti calcoli durante la mia ricerca del punto debole, mentre le parti meno interessanti quasi ovunque hanno una risoluzione inferiore.