Создание шестиугольного графика с элементами, взвешенными в питоне

Используя matplotib в python, можно создать простую гистограмму, предоставив список элементов для построения вместе со списком весов, так что вклад каждого элемента в ячейку, к которой он принадлежит, регулируется в соответствии с его весом, например

import matplotlib.pyplot as plt

...

plt.hist(items, weights = weightsOfItems)

Я пытаюсь построить шестиугольную гистограмму двух значений друг против друга, что можно сделать с помощью

plt.hexbin(xValues, yValues)

Как и прежде, я хотел бы, чтобы вклады каждой пары в бин, к которому она принадлежит, были скорректированы в соответствии со списком весов. Из hexbin документации кажется, что я должен это сделать вводя параметр C, т.е.

plt.hexbin(xValues, yValues, C = weightsOfValues)

Однако при этом получаются совершенно неверные графики. В настоящее время я прибегнул к первой выборке моих xValues ​​и yValues ​​в соответствии с весами, чтобы получить xSamples и ySamples. Этот процесс, однако, требует очень много времени, а также означает, что я не использую все доступные данные, поскольку избавляюсь от значений xValues ​​и yValues, не включенных в образцы.

Итак, кто-нибудь знает способ создания гистограммы шестиугольных ячеек, в которой вклад значений в соответствующие ячейки корректируется в соответствии с заданными весами?


person Reza Rohani    schedule 19.07.2016    source источник


Ответы (1)


Согласно документации:

Если указано C, оно указывает значения в координате (x[i],y[i]). Эти значения накапливаются для каждого шестиугольного бина, а затем уменьшаются в соответствии с reduce_C_function, который по умолчанию соответствует функции среднего значения numpy (np.mean). (Если указано C, это также должна быть одномерная последовательность той же длины, что и x и y.)

Это означает, что для каждого бина сохраняются соответствующие значения C, а затем к ним применяется reduce_C_function. Поскольку функция по умолчанию — np.mean, результатом будет не то, что вы хотите получить, а среднее значение вместо суммы. Чтобы на самом деле получить сумму всех весов, это должно быть изменено на np.sum, чтобы суммировать значения C для каждого (x,y) в ячейке вместо их усреднения.

Этот пример показывает разницу с простыми данными:

N = 10**5
x = np.random.normal(size=N)
y = np.random.normal(size=N)
plt.figure(figsize=(12,4)); plt.subplot(131)
plt.hexbin(x,y); plt.colorbar()
plt.subplot(132)
plt.hexbin(x,y,C=np.ones(N)); plt.colorbar()
plt.subplot(133)
plt.hexbin(x,y,C=np.ones(N),reduce_C_function=np.sum)
plt.colorbar(); plt.tight_layout()

Теперь веса установлены на 1 для всех значений (сгенерированных из распределения Гаусса), так что правильный алгоритм для взвешенных гистограмм должен возвращать то же самое, что и невзвешенная гистограмма. На выходе получаются следующие графики:

Другая функция уменьшения_C_

Левая панель представляет собой невзвешенный график, показывающий 2D-гауссову диаграмму, средняя панель представляет собой поведение по умолчанию C, усредняющее все C значений на бин, таким образом, имея количество 1 во всех бинах, а правая панель представляет собой поведение с np.sum, где извлекается 2D-гауссиан.

person OriolAbril    schedule 07.04.2018