Как получить значения в отдельных точках после нормализации по matplotlib - PullRequest
0 голосов
/ 11 октября 2018

Следующий код генерирует гексбиновый график после нормализации данных между заданным диапазоном.

from matplotlib.cm import viridis_r as glocmap
import numpy as np
import matplotlib.pyplot as plt

data = np.random.uniform(1.0, 10, size=(100,2))

ax1 plt.hexbin(data[:,0], data[:,1], bins=None,gridsize=(20,15), cmap=glocmap,
           vmin=0, vmax=100, alpha=0.75, mincnt=1.0)

cb = plt.colorbar(label='count')
cb.set_label('COUNT',size=20)
cb.ax.tick_params(labelsize=20) 
cb.set_alpha(1)

ax1.get_array()   #has length of 95
ax1._offsets       #2D array array of length 95

Я хочу знать значение счетчика для каждого значения координат из данных.Ось создает атрибут с именем _offsets, который при построении графика создает тот же график, что и график с plt.hexbin, поэтому я подумал, что это могут быть значения координат, но эти значения немного отличаются от значений в «данных».Под координатой я подразумеваю значения осей x и y.

EDIT : Как предлагается в комментариях, применение .get_array () к экземпляру оси дает массив, длина (95) которого равна длинеАтрибут ._offsets.Моя цель - найти «подсчеты» в соответствующих точках «данных».например, что будет значением 'count' в данных [0]?

hexbin plot from python code

1 Ответ

0 голосов
/ 12 октября 2018

Метод PolyCollection .get_array() возвращает количество отсчетов для каждого шестиугольника.Метод .get_offsets() возвращает центр каждого шестиугольника.

import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt

data = np.random.uniform(1.0, 10, size=(50,2))

pc = plt.hexbin(data[:,0], data[:,1], bins=None,gridsize=(7,4), cmap="viridis_r",
                vmin=0, vmax=5, mincnt=1.0)

cb = plt.colorbar(label='count')
cb.set_label('COUNT',size=20)
cb.ax.tick_params(labelsize=20) 
cb.set_alpha(1)

counts = pc.get_array() 
positions = pc.get_offsets() 

print(counts[:10])
print(positions[:10])

for c, (x,y) in zip(counts[:10],positions[:10]):
    plt.text(x,y,"{:d}".format(int(c)), ha="center", va="center")

plt.show()

выведет

[1. 1. 1. 2. 2. 2. 1. 2. 1. 3.]
[[1.04969905 1.41805371]
 [1.04969905 3.53403589]
 [1.04969905 7.76600025]
 [1.04969905 9.88198243]
 [2.28920799 5.65001807]
 [2.28920799 7.76600025]
 [2.28920799 9.88198243]
 [3.52871693 1.41805371]
 [3.52871693 3.53403589]
 [3.52871693 5.65001807]]

и покажет

enter image description here

Например, первый шестиугольник центрируется в x=1.04969905, y=1.41805371 и имеет одну точку в нем (количество == 1).Десятый шестиугольник центрируется в x=3.52871693, y=5.65001807 и имеет 3 точки (количество == 3).

...