matplotlib hexbin нормализовать
Я хотел бы сделать множественную карту плотности hexbin данных x y с matplotlib аналогично этой: http://matplotlib.org/1.4.0/examples/pylab_examples/hexbin_demo.html
Но я хотел бы разделить количество отсчетов на шестиугольник на заданное число(самое высокое значение peek из моих карт плотности), чтобы все мои участки denisty имели одинаковую окраску, а цветовая полоса была бы [0,1] диапазоном для всех участков.
Не мог бы кто-нибудь показать мне рабочий пример это?
Спасибо в предвкушении,
Янош
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 вызов вы должны предоставить массив
Обратите внимание, что, вероятно, имеет смысл очистить оси после первого вызова hexbin. Одна из проблем с этим подходом заключается в том, что у вас будут пустые ячейки (пустое пространство), где нет точек. Если вы хотите, чтобы фон был того же цвета, что и нулевое значение, вы можете добавитьC
, чтобы использовать опциюreduce_C_function
. В этом случаеC=np.ones_like(y) / hb.get_array().max()
- это все, что вам нужно, потому что вы просто суммируете значения.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 в единицах количества, но затем вы устанавливаете метки в нужном диапазоне. Лично я предпочитаю этот второй метод только потому, что он немного чище, но я могу представить случаи, когда первый более полезен.