【问题标题】:Python: Compute Bin-Mean Value of Scatter Plot BulletsPython:计算散点图项目符号的 Bin 平均值
【发布时间】:2020-01-08 14:49:02
【问题描述】:

我有三个长度/大小相等的一维数组(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()

图中有些项目符号重叠,所以我们看不清楚。因此,接下来我现在要计算并绘制图中每个 1 整数 x 1 整数 bin 内所有散点图子弹的平均 C 值,以便每个方形网格点都用一种颜色着色(这些 bin 由图中说明网格化)。我该怎么做?

【问题讨论】:

    标签: python-3.x mean binning


    【解决方案1】:

    目前尚不完全清楚您要做什么,但我认为在您努力工作之前,您的问题有一个分析结果。颜色(C 向量)的预期平均值为 50,因为您生成了一个均匀分布的样本 [0, 100]。坐标也是均匀分布的,但这无关紧要。当然,每个方格都会有一些差异。

    如果您需要继续练习,我会构建一个坐标字典:颜色映射来帮助设置屏幕...

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

    然后您可以设置一个字典来收集每个网格的结果,并且可能通过获取坐标的 int() 值将数据放入网格的正确数据字段中

    【讨论】:

    • 嗨,杰夫。谢谢您的回答!我已经更新了我的问题中的措辞以及图形网格,希望我的问题现在更清楚。我想要对这些散点图项目符号执行的操作是计算落入每个 1 个整数 x 1 个整数平方 bin 内的所有项目符号的平均 C 值(平均颜色值),并绘制这个新计算的 2D 矩阵。
    • 好的。正如我上面所说,由于上述原因,您的答案是 50 +/- 方差。如果你想完成这个练习,你需要制作一些数据结构来保存每个盒子中的样本,测试每个点以查看它在哪个盒子中,等等。
    • 最后一个问题,杰夫;如何调用“color_map”中的坐标和颜色值? “color_map = {(x坐标,y坐标):颜色值,(x坐标,y坐标):颜色值,...,(x坐标,y坐标):颜色值}”的这种格式对我来说是新的Python。如果您有提取/调用这些值的命令,那么我认为我有一个解决方案。
    • 好的。上面的代码 sn-p 是一个字典理解。你应该寻找例子。您不需要从 color_map 中获取值...您已经在 3 个列表(A、B、C)中拥有它们。遍历它们的最简单方法可能是使用 for 循环创建索引并按顺序拉出项目。
    • 感谢您的建议杰夫!我已经上传了一个适合我的解决方案,希望它对其他人也有用。
    【解决方案2】:

    以下是适合我的解决方案。

    # 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()
    

    【讨论】:

      猜你喜欢
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2019-12-23
      相关资源
      最近更新 更多