e a pergunta inicial era ... como converter valores de dispersão em valores de grade, certo?
histogram2d
conta a frequência por célula; no entanto, se você tiver outros dados por célula além da frequência, precisará de mais trabalho.
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
Então, eu tenho um conjunto de dados com resultados Z para as coordenadas X e Y. No entanto, eu estava calculando alguns pontos fora da área de interesse (grandes lacunas) e montes de pontos em uma pequena área de interesse.
Sim, aqui fica mais difícil, mas também mais divertido. Algumas bibliotecas (desculpe):
from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np
from scipy.interpolate import griddata
Hoje, o pyplot é meu mecanismo gráfico, cm é uma variedade de mapas de cores com algumas opções interessantes. numpy para os cálculos e dados de grade para anexar valores a uma grade fixa.
O último é importante, especialmente porque a frequência dos pontos xy não é igualmente distribuída nos meus dados. Primeiro, vamos começar com alguns limites adequados aos meus dados e um tamanho de grade arbitrário. Os dados originais possuem pontos de dados também fora desses limites x e y.
#determine grid boundaries
gridsize = 500
x_min = -8
x_max = 2.5
y_min = -2
y_max = 7
Portanto, definimos uma grade com 500 pixels entre os valores mínimo e máximo de x e y.
Nos meus dados, existem muito mais que os 500 valores disponíveis na área de alto interesse; considerando que na área de baixo interesse não existem nem 200 valores na grade total; entre os limites gráficos dex_min
e x_max
há ainda menos.
Portanto, para obter uma boa imagem, a tarefa é obter uma média dos altos valores de juros e preencher as lacunas em outros lugares.
Eu defino minha grade agora. Para cada par xx-yy, quero ter uma cor.
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 que a forma estranha? scipy.griddata quer uma forma de (n, D).
Griddata calcula um valor por ponto na grade, por um método predefinido. Eu escolhi "mais próximo" - pontos de grade vazios serão preenchidos com valores do vizinho mais próximo. Parece que as áreas com menos informações têm células maiores (mesmo que não seja o caso). Pode-se optar por interpolar "linear", então áreas com menos informações parecem menos nítidas. Questão de gosto, realmente.
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 pulamos, entregamos ao matplotlib para exibir o gráfico
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()
Em torno da parte pontiaguda da V-Shape, você vê que fiz muitos cálculos durante minha busca pelo ponto ideal, enquanto as partes menos interessantes em quase todos os lugares têm uma resolução mais baixa.