【问题标题】:2d histogram: Get result of full nbins x nbins2d 直方图:获取完整 nbins x nbins 的结果
【发布时间】:2020-09-20 09:29:06
【问题描述】:

我正在使用 matplotlib 的 hist2d 函数来制作我拥有的数据的二维直方图,但是我无法解释结果。

这是我的情节:

这是使用以下行创建的:

hist = plt.hist2d(X, Y, (160,160), norm=mpl.colors.LogNorm(vmin=1, vmax=20))

这将返回 (160, 160) 的二维数组,以及 bin 边缘等。

在图中有一些值频率很高的箱(黄色箱)。我希望能够获得此直方图的结果并过滤掉具有低值的 bin,保留高 bin。但我希望会有 160*160 的值,但我只能找到 160 X 和 160 Y 的值。

我想做的基本上是从密度较小的数据中过滤掉密度较大的数据。如果这意味着将数据表示为单个值(bin),那没关系。

我是误解了函数还是没有正确访问数据结果?我也尝试过辣味,但结果似乎是相同或相似的格式。

【问题讨论】:

  • 您为什么期望160 x 160 值?这不就是你的直方图吗?
  • @QuangHoang 也许我误解了,但是对于每个 X 箱,x 轴上不应该有 160 个箱,然后 Y 轴上有 160 个箱吗?那么每个 Xbin 应该有 160 个 Ybin?
  • 是的,这是您的原始直方图,即你绘制的图片。但是您不想只过滤高密度垃圾箱吗?
  • 是的,我希望将直方图作为数组,以便在绘图后过滤结果。但是我只能找到 160 个 X 和 160 个 Y 的 bin,但完整的直方图不应该有 25,600 个吗?
  • 我不确定我是否关注了。你清楚地说明你得到一个160 x 160 数组。那是你我的直方图,不是吗?这些函数仅返回 xy 的边,每个边为 161。如果这就是您所要求的,您可以对边缘进行叉积以获得 2D 箱。

标签: python matplotlib histogram histogram2d


【解决方案1】:

你需要Seaborn 包。

你提到

我希望能够获得此直方图的结果并过滤掉具有低值的 bin,保留高 bin

您应该绝对使用其中一种:

  1. seaborn.joinplot(...,kind='hex') :它显示了落在六边形箱内的观察计数。此图最适用于相对较大的数据集。
  2. seaborn.joinplot(...,kind='kde') :使用核密度估计来可视化二元分布。我推荐它更好。

“kde”示例

使用级别数n_levelsshade_lowest=False 忽略低值。

import seaborn as sns
import numpy as np
import matplotlib.pylab as plt
x, y = np.random.randn(2, 300)
plt.figure(figsize=(6,5))
sns.kdeplot(x, y, zorder=0, n_levels=6, shade=True, cbar=True, 
     shade_lowest=False, cmap='viridis')

【讨论】:

    【解决方案2】:

    不确定这是不是你想要的。

    The hist2d docs 指定函数返回一个大小为 4 的元组,其中第一项 h 是热图。

    h 将与bins 具有相同的形状。

    您可以捕获输出(它仍会绘图),并使用 argwhere 查找值超过 90% 的坐标:

    h, xedges, yedges, img = hist = plt.hist2d(X, Y, bins=(160,160), norm=mpl.colors.LogNorm(vmin=1, vmax=20))
    
    print(list(np.argwhere(h > np.percentile(h, 90))))
    

    【讨论】:

    • 是的,这正是我在 X 和 Y 方向索引正确的 bin 所需要的!
    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2017-03-31
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    相关资源
    最近更新 更多