matplotlib hexbin нормализовать


Я хотел бы сделать множественную карту плотности hexbin данных x y с matplotlib аналогично этой: http://matplotlib.org/1.4.0/examples/pylab_examples/hexbin_demo.html

Но я хотел бы разделить количество отсчетов на шестиугольник на заданное число(самое высокое значение peek из моих карт плотности), чтобы все мои участки denisty имели одинаковую окраску, а цветовая полоса была бы [0,1] диапазоном для всех участков.

Не мог бы кто-нибудь показать мне рабочий пример это?

Спасибо в предвкушении,

Янош

1 3

1 ответ:

Я вижу два возможных способа сделать это.

Метод 1

Первый-вызвать hexbin, чтобы получить максимальное значение, а затем выполнить другой вызов hexbin, используя параметр reduce_C_function input для масштабирования данных. Проблема с выполнением нормализации заключается в том, что вы не знаете, сколько точек находится в каждой ячейке, пока не будет создан hexbin. Работа с данными в Примере, на который вы ссылаетесь (но только создаете линейно-масштабный график) это будет что-то вроде:
plt.subplot(111)
hb = plt.hexbin(x,y, cmap=plt.cm.YlOrRd_r)
plt.cla()
plt.hexbin(x, y,
           C=np.ones_like(y, dtype=np.float) / hb.get_array().max(),
           cmap=plt.cm.YlOrRd_r,
           reduce_C_function=np.sum)
plt.axis([xmin, xmax, ymin, ymax])
cb = plt.colorbar()

Во втором hexbin вызов вы должны предоставить массив C, чтобы использовать опцию reduce_C_function. В этом случае C=np.ones_like(y) / hb.get_array().max() - это все, что вам нужно, потому что вы просто суммируете значения.

Обратите внимание, что, вероятно, имеет смысл очистить оси после первого вызова hexbin. Одна из проблем с этим подходом заключается в том, что у вас будут пустые ячейки (пустое пространство), где нет точек. Если вы хотите, чтобы фон был того же цвета, что и нулевое значение, вы можете добавить plt.gca().set_axis_bgcolor(plt.cm.YlOrRd_r(0)).

Метод 2

Другой подход было бы просто использовать автоматическое масштабирование, присущее hexbin, и просто переназначить цветовую панель. Например:

plt.subplot(111)
hb = plt.hexbin(x,y, cmap=plt.cm.YlOrRd_r)
plt.axis([xmin, xmax, ymin, ymax])
cb = plt.colorbar()
cb.set_ticks(np.linspace(hb.get_array().min(), hb.get_array().max(), 6))
cb.set_ticklabels(np.linspace(0, 1., 6))

Обратите внимание, что необходимо использовать задатчик тиков colorbar в единицах количества, но затем вы устанавливаете метки в нужном диапазоне. Лично я предпочитаю этот второй метод только потому, что он немного чище, но я могу представить случаи, когда первый более полезен.