Python: Рассчитать среднее значение бина для маркеров точечной диаграммы - PullRequest
0 голосов
/ 08 января 2020

У меня есть три массива 1D (A, B, C) одинаковой длины / размера. Я строю график рассеяния B против A, где я закрашиваю каждую пулю графика рассеивания соответствующим значением в массиве C (см. Код ниже).

# Imports
import matplotlib.cm as cm
import matplotlib.colors as colors
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

# Create the Arrays
A = 10 * np.random.random_sample((20, 20))
B = 10 * np.random.random_sample((20, 20))
C = 100 * np.random.random_sample((20, 20))

A = A.reshape(20*20)
B = B.reshape(20*20)
C = C.reshape(20*20)

# Create the Colormap and Define Boundaries
cmap_C = cm.jet
cmap_C.set_bad(color='white')
bounds_C =  np.arange(0, 110, 10)
norm_C = mpl.colors.BoundaryNorm(bounds_C, cmap_C.N)

# Plot the Figure
plt.figure()
plt.scatter(A, B, c=C, marker='o', s=100, cmap=cmap_C, norm=norm_C)
plt.xlim([-1, 11])
plt.ylim([-1, 11])
plt.xticks(np.arange(0, 11, 1))
plt.yticks(np.arange(0, 11, 1))
plt.xlabel('A')
plt.ylabel('B')
plt.grid()
plt.colorbar(label='Value of C')
plt.show()

Некоторые маркеры перекрываются на рисунке так, мы не можем видеть их ясно. Поэтому теперь я хочу вычислить и построить среднее значение C для всех маркеров рассеянного графика в каждом целочисленном элементе размером 1 целое x 1 на рисунке так, чтобы каждая квадратная точка сетки была окрашена одним единственным цветом (эти элементы иллюстрируются сетка рисунка). Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Ниже приведено решение, которое работает для моих целей.

# Imports
import matplotlib.cm as cm
import matplotlib.colors as colors
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
from zipfile import ZipFile 

# Create the Arrays
xx = 5
yy = 5

A = 10 * np.random.random_sample((xx, yy))
B = 10 * np.random.random_sample((xx, yy))
C = 100 * np.random.random_sample((xx, yy))

A = A.reshape(xx*yy)
B = B.reshape(xx*yy)
C = C.reshape(xx*yy)

color_map = {(x, y): color for x, y, color in zip(A,B,C)}

xedges = np.arange(11)
yedges = np.arange(11)
H, xedges, yedges = np.histogram2d(A, B, bins=(xedges, yedges))
HT = H.T

ca = np.asarray(list(color_map))
print(ca)

cai = ca.astype(int)
print(cai)

# Extracting all dictionary values using loop + keys() 
res = [] 
for key in color_map.keys() : 
    res.append(color_map[key]) 

res = np.asarray(res)
resi = res.astype(int)
print(resi)

BMC = np.zeros([10, 10])

for i in np.arange(len(resi)):
    BMC[cai[i,1],cai[i,0]] = BMC[cai[i,1],cai[i,0]] + resi[i]
    print(cai[i])
    print(resi[i])
    print(BMC[cai[i,1],cai[i,0]])

print(HT)
print(BMC)
BMC = BMC/HT
print(BMC)

# Create the Colormap and Define Boundaries
cmap_C = cm.jet
cmap_C.set_bad(color='white')
bounds_C =  np.arange(-5, 115, 10)
norm_C = mpl.colors.BoundaryNorm(bounds_C, cmap_C.N)

cmap_hist2d = cm.CMRmap_r
cmap_hist2d.set_bad(color='white')
bounds_hist2d =  np.arange(-0.5, 4.5, 1)
norm_hist2d = mpl.colors.BoundaryNorm(bounds_hist2d, cmap_hist2d.N)

cmap_C = cm.jet
cmap_C.set_bad(color='white')
BMC_plot = np.ma.array ( BMC, mask=np.isnan(BMC))     # Mask NaN
bounds_C =  np.arange(-5, 115, 10)
norm_C = mpl.colors.BoundaryNorm(bounds_C, cmap_C.N)

plt.subplot(311)
plt.scatter(A, B, c=C, marker='o', s=100, cmap=cmap_C, norm=norm_C)
plt.xlim([-1, 11])
plt.ylim([-1, 11])
plt.xticks(np.arange(0, 11, 1))
plt.yticks(np.arange(0, 11, 1))
plt.ylabel('B')
plt.grid()
plt.colorbar(label='Value of C', ticks=[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])

plt.subplot(312)
x, y = np.meshgrid(xedges, yedges)
plt.pcolor(x, y, HT, cmap=cmap_hist2d, norm=norm_hist2d)
plt.xlim([-1, 11])
plt.ylim([-1, 11])
plt.xticks(np.arange(0, 11, 1))
plt.yticks(np.arange(0, 11, 1))
plt.ylabel('B')
plt.grid()
plt.colorbar(label='Number of Data in Bin', ticks=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

plt.subplot(313)
plt.pcolor(x, y, BMC_plot, cmap=cmap_C, norm=norm_C)
plt.xlim([-1, 11])
plt.ylim([-1, 11])
plt.xticks(np.arange(0, 11, 1))
plt.yticks(np.arange(0, 11, 1))
plt.xlabel('A')
plt.ylabel('B')
plt.grid()
plt.colorbar(label='Bin-Mean C Value', ticks=[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
plt.show()
0 голосов
/ 08 января 2020

Не совсем ясно, что вы пытаетесь сделать, но я думаю, что есть аналитический результат на ваш вопрос, прежде чем вы будете слишком усердно работать. Ожидаемое среднее значение цвета (C вектор) равно 50, потому что вы сгенерировали равномерно распределенную выборку [0, 100]. Координаты также равномерно распределены, но это не имеет значения. Конечно, в каждом из квадратов сетки будет некоторое отклонение.

Если вам нужно go переслать в качестве упражнения, я бы создал словарь координат: цветовые сопоставления, чтобы помочь настроить экран. ...

color_map = {(x, y): color for x, y, color in zip(A,B,C)}

Затем вы можете настроить словарь для сбора результатов для каждой сетки и, возможно, взяв значение int () координат, поместите данные в правильное поле данных для сетки * 1006. *

...