在matplotlib中,将hist2d的输出转换为轮廓

8
我使用matplotlib.hist2d在Python中生成了一些数据。下面是一个数据的示例,如下图所示。 data 从图中可以看出,这些数据中有一些轮廓线,通过跟踪相同颜色可以找到。我看到一个以0.015为中心的伽马分布。我想获取这些轮廓线,以便我可以看到每个颜色级别的线条追踪。我尝试使用轮廓函数进行操作,如下所示:
counts, xedges, yedges, Image = hist2d(x, y, bins=bins, norm=LogNorm(), range=[[0, 1], [0, 400]])
contour(counts)

但似乎没有产生任何效果。

有人知道获取这些轮廓的最佳方法吗?理想情况下,我想将这些轮廓拟合成函数(如伽马函数),然后获取函数参数。

谢谢。

2个回答

13
所以问题在于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)

将会产生:

在这里输入图片描述


3
谢谢,这正是我需要看到的。唯一需要调整的是,我需要使用contour(counts.transpose(),extent=[xbins.min(),xbins.max(),ybins.min(),ybins.max()],linewidths=3) 代替contour(counts,extent=[xbins.min(),xbins.max(),ybins.min(),ybins.max()],linewidths=3)。 - Jon
@ebarr不错。但是如果我有一个三维随机数据集(x,y,z),那么如何应用这种方法呢? - diffracteD
@ebarr 在我的代码中将返回的 xbins <-> ybins 进行匹配。 - jtlz2
@diffracteD - 你需要用你的真实数据替换 xy..? 你的 z 是什么? - jtlz2

11

由于声望不够,我希望将此内容作为评论发布,所以...

@ebarr提供了一个很好的解决方案,但需要做一个小修改:来自2D图的xbins和ybins应该被反转(请参考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])

这将产生:

直方图和等高线地图


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接