и первоначальный вопрос был ... как преобразовать значения разброса в значения сетки, верно?
histogram2d
действительно рассчитывает частоту на ячейку, однако, если у вас есть данные на ячейку, отличные от частоты, вам потребуется дополнительная работа.
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
Итак, у меня есть набор данных с Z-результатами для координат X и Y. Однако я вычислял несколько точек за пределами области интереса (большие пробелы) и кучу точек в небольшой области интереса.
Да, здесь становится сложнее, но и веселее. Некоторые библиотеки (извините):
from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np
from scipy.interpolate import griddata
Сегодня pyplot - мой графический движок, cm - это диапазон цветовых карт с некоторым интересным выбором. numpy для расчетов и griddata для привязки значений к фиксированной сетке.
Последнее важно, особенно потому, что частота точек xy не одинаково распределена в моих данных. Во-первых, давайте начнем с некоторых границ, подходящих для моих данных и произвольного размера сетки. Исходные данные также имеют точки данных вне этих границ x и y.
#determine grid boundaries
gridsize = 500
x_min = -8
x_max = 2.5
y_min = -2
y_max = 7
Итак, мы определили сетку с 500 пикселями между минимальным и максимальным значениями x и y.
По моим данным, существует более 500 доступных значений в области повышенного интереса; в то время как в области низкого интереса нет даже 200 значений в общей сетке; между графическими границами x_min
и x_max
есть еще меньше.
Таким образом, для получения хорошей картины задача состоит в том, чтобы получить среднее значение для высоких процентных значений и заполнить пробелы в других местах.
Я сейчас определяю свою сетку. Для каждой пары хх-уу я хочу иметь цвет.
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
Почему странная форма? scipy.griddata хочет иметь форму (n, D).
Griddata вычисляет одно значение для каждой точки в сетке с помощью предварительно определенного метода. Я выбираю «ближайший» - пустые точки сетки будут заполнены значениями от ближайшего соседа. Это выглядит так, как будто области с меньшим количеством информации имеют большие ячейки (даже если это не так). Можно выбрать интерполяцию «линейно», тогда области с меньшим количеством информации выглядят менее четкими. Дело вкуса, правда.
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])
И хоп, мы передаем Matplotlib для отображения сюжета
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()
Вокруг заостренной части V-образной формы вы видите, что я провел много вычислений во время поиска точки обзора, в то время как менее интересные детали почти везде имеют более низкое разрешение.