【问题标题】:Turn hist2d output into contours in matplotlib在 matplotlib 中将 hist2d 输出转换为轮廓
【发布时间】:2014-12-08 16:54:35
【问题描述】:

我使用 matplotlib.hist2d 在 Python 中生成了一些数据。数据示例如下所示。

正如您所见,该数据中有一些轮廓,通过在整个绘图中追踪相同的颜色找到。我看到一个以 0.015 为中心的伽马分布。我想获取这些数据并收集这些轮廓,这样我就可以看到每个颜色级别的线迹。我尝试在这里使用轮廓函数

counts, xedges, yedges, Image = hist2d(x, y, bins=bins, norm=LogNorm(), range=[[0, 1], [0, 400]])
contour(counts)

但这似乎并没有产生任何结果。

有人知道获得这些轮廓的最佳方法吗?理想情况下,我想采用这些轮廓并为它们拟合一个函数(如伽马函数),然后获取函数参数。

谢谢

【问题讨论】:

    标签: python matplotlib histogram distribution contour


    【解决方案1】:

    所以问题是hist2d 创建的图像是在数据坐标中绘制的,但您尝试创建的轮廓是在像素坐标中。解决此问题的简单方法是指定轮廓的extent(即在 x 和 y 轴上重新缩放/重新定位它们)。

    例如:

    from matplotlib.colors import LogNorm
    from matplotlib.pyplot import *
    
    x = np.random.normal(5,10,100000)
    y = np.random.normal(5,10,100000)
    counts,ybins,xbins,image = hist2d(x,y,bins=100,norm=LogNorm())
    contour(counts,extent=[xbins.min(),xbins.max(),ybins.min(),ybins.max()],linewidths=3)
    

    将产生:

    【讨论】:

    • 谢谢,这正是我需要看到的。我必须做的唯一调整不是调用 contour(counts,extent=[xbins.min(),xbins.max(),ybins.min(),ybins.max()],linewidths=3),我需要调用contour(counts.transpose(),extent=[xbins.min(),xbins.max(),ybins.min(),ybins.max()],linewidths=3)
    • @ebarr 很好。但是如果我有一个 3D 随机数据集(x,y,z),那么怎么可能应用这种方法呢?
    • @ebarr 在我的返回 xbins ybins
    • @diffracteD - 你需要用你的真实数据替换xy..?你的z 是什么?
    【解决方案2】:

    希望将此作为评论发布,但没有声誉,所以...

    @ebarr 有一个很好的解决方案,只需稍加修正:来自 2d 绘图的 xbin 和 ybin 应该反转(参见 matplotlib 文档,https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist2d
    )

    此外,只是有点烦人,但由于直方图色标已经过对数转换,因此等高线颜色不会与 2d 直方图中的颜色对齐。要解决此问题,您可以手动指定等高线图的级别。

    进行这些更改,并为清晰起见将图分开:

    from matplotlib.colors import LogNorm
    import matplotlib.pyplot as plt
    
    x = np.random.normal(5,10,100000)
    y = np.random.normal(5,10,100000)
    plt.subplot(121)
    counts,xbins,ybins,image = plt.hist2d(x,y,bins=100
                                          ,norm=LogNorm()
                                          , cmap = plt.cm.rainbow)
    plt.colorbar()
    plt.subplot(122)
    plt.contour(counts.transpose(),extent=[xbins[0],xbins[-1],ybins[0],ybins[-1]],
        linewidths=3, cmap = plt.cm.rainbow, levels = [1,5,10,25,50,70,80,100])
    

    这会产生: 直方图和等高线图

    【讨论】:

      猜你喜欢
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      相关资源
      最近更新 更多