y la pregunta inicial fue ... ¿cómo convertir los valores de dispersión en valores de cuadrícula, ¿verdad?
histogram2d
sí cuenta la frecuencia por celda, sin embargo, si tiene otros datos por celda además de la frecuencia, necesitará un trabajo adicional para hacer.
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
Entonces, tengo un conjunto de datos con resultados Z para las coordenadas X e Y. Sin embargo, estaba calculando algunos puntos fuera del área de interés (grandes brechas) y montones de puntos en una pequeña área de interés.
Sí, aquí se vuelve más difícil pero también más divertido. Algunas bibliotecas (lo siento):
from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np
from scipy.interpolate import griddata
Pyplot es mi motor gráfico hoy, cm es una gama de mapas de colores con algunas opciones interesantes. numpy para los cálculos y datos de cuadrícula para adjuntar valores a una cuadrícula fija.
El último es importante, especialmente porque la frecuencia de los puntos xy no se distribuye por igual en mis datos. Primero, comencemos con algunos límites que se ajustan a mis datos y un tamaño de cuadrícula arbitrario. Los datos originales tienen puntos de datos también fuera de esos límites x e y.
#determine grid boundaries
gridsize = 500
x_min = -8
x_max = 2.5
y_min = -2
y_max = 7
Así que hemos definido una cuadrícula con 500 píxeles entre los valores mínimo y máximo de x e y.
En mis datos, hay muchos más de los 500 valores disponibles en el área de alto interés; Considerando que en el área de bajo interés, ni siquiera hay 200 valores en la cuadrícula total; entre los límites gráficos de x_min
y x_max
hay aún menos.
Entonces, para obtener una buena imagen, la tarea es obtener un promedio de los valores de alto interés y llenar los vacíos en otros lugares.
Defino mi grilla ahora. Para cada par xx-yy, quiero tener un color.
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
¿Por qué la forma extraña? scipy.griddata quiere una forma de (n, D).
Griddata calcula un valor por punto en la cuadrícula, por un método predefinido. Elijo "más cercano": los puntos de cuadrícula vacíos se rellenarán con valores del vecino más cercano. Esto parece que las áreas con menos información tienen celdas más grandes (incluso si no es el caso). Se podría elegir interpolar "lineal", luego las áreas con menos información se ven menos nítidas. Cuestión de gustos, de verdad.
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])
Y saltamos, pasamos a matplotlib para mostrar 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()
Alrededor de la parte puntiaguda de la forma de V, ves que hice muchos cálculos durante mi búsqueda del punto óptimo, mientras que las partes menos interesantes en casi todos los demás tienen una resolución más baja.