Rez*_*ani 5 python plot matplotlib hexagonal-tiles
通过在python中使用matplotib,可以通过提供要绘制的项目列表以及权重列表来制作简单的直方图,从而根据其权重来调整每个项目对其所属仓位的贡献,例如
import matplotlib.pyplot as plt
...
plt.hist(items, weights = weightsOfItems)
Run Code Online (Sandbox Code Playgroud)
我正在尝试绘制两个值的六边形bin直方图,可以使用
plt.hexbin(xValues, yValues)
Run Code Online (Sandbox Code Playgroud)
和以前一样,我希望根据权重列表调整每对对所属箱的贡献。从hexbin文档看来,我应该可以通过为参数C提供输入来做到这一点,即
plt.hexbin(xValues, yValues, C = weightsOfValues)
Run Code Online (Sandbox Code Playgroud)
但是,这样做会产生完全不正确的图。目前,我已先根据权重对xValue和yValue进行采样,以得出xSamples和ySamples。但是,此过程非常耗时,并且这意味着我没有使用所有可用数据,因为我摆脱了样本中未包含的xValues和yValues。
那么,有谁知道一种产生六边形柱状图直方图的方法,其中根据给定的权重来调整值对它们各自的柱状图的贡献?
根据文档:
\n\n\n\n\n如果
\nC指定,则指定坐标 (x[i],y[i]) 处的值。这些值针对每个六边形箱进行累积,然后根据 进行减少reduce_C_function,默认为 numpy\xe2\x80\x99s 均值函数 (np.mean)。(如果指定,它也必须是与和C长度相同的一维序列。)xy
这意味着对于每个 bin,C都会存储相应的值,然后reduce_C_function将 应用于它们。由于默认函数是np.mean,因此结果不是您想要获得的结果,而是平均值而不是总和。要实际获得所有权重的总和,应将其更改为,np.sum以便对C每个权重的值求和(x,y)箱中
此示例显示了与简单数据的差异:
\n\nN = 10**5\nx = np.random.normal(size=N)\ny = np.random.normal(size=N)\nplt.figure(figsize=(12,4)); plt.subplot(131)\nplt.hexbin(x,y); plt.colorbar()\nplt.subplot(132)\nplt.hexbin(x,y,C=np.ones(N)); plt.colorbar()\nplt.subplot(133)\nplt.hexbin(x,y,C=np.ones(N),reduce_C_function=np.sum)\nplt.colorbar(); plt.tight_layout()\nRun Code Online (Sandbox Code Playgroud)\n\n现在,所有值(从高斯分布生成)的权重都设置为 1,因此加权直方图的正确算法应返回与未加权直方图相同的结果。输出如下图:
\n\n\n\n左侧面板是未加权图,显示 2D 高斯分布,中间面板是 的默认行为C,对每个 bin 的所有C值进行平均,因此所有 bin 中的计数为 1,右侧面板是 的行为np.sum,其中检索二维高斯。
| 归档时间: |
|
| 查看次数: |
1052 次 |
| 最近记录: |