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

时间:2014-10-14 02:09:32

标签: python matplotlib histogram distribution contour

我使用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 个答案:

答案 0 :(得分:9)

所以问题是由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)

将产生:

enter image description here

答案 1 :(得分:3)

更愿意将此作为评论发布,但不具备声誉,所以......

@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])

这会产生: Histogram and contour map