我使用matplotlib.hist2d在Python中生成了一些数据。下面是一个数据示例。
正如您所看到的,通过在整个绘图中追踪相同的颜色,可以看到此数据中有一些轮廓。我看到一个以0.015为中心的伽马分布。我想获取这些数据并收集这些轮廓,以便我可以看到每个颜色级别的线条痕迹。我试着在这里玩轮廓功能
counts, xedges, yedges, Image = hist2d(x, y, bins=bins, norm=LogNorm(), range=[[0, 1], [0, 400]])
contour(counts)
但这似乎没有产生任何东西。
有谁知道获得这些轮廓的最佳方法?理想情况下,我想拍摄这些轮廓并为它们拟合一个函数(如伽玛函数),然后获取函数参数。
由于
答案 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)
将产生:
答案 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])