首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python Matplotlib矩形装箱

Python Matplotlib矩形装箱
EN

Stack Overflow用户
提问于 2010-01-09 05:44:26
回答 5查看 15.6K关注 0票数 19

我已经得到了一系列的(x,y)值,我想用python的matplotlib绘制一个二维直方图。使用hexbin,我得到的结果如下所示:

但我正在寻找这样的东西:

示例代码:

代码语言:javascript
复制
from matplotlib import pyplot as plt
import random

foo = lambda : random.gauss(0.0,1.0)

x = [foo() for i in xrange(5000)]
y = [foo() for i in xrange(5000)]

pairs = zip(x,y)

#using hexbin I supply the x,y series and it does the binning for me
hexfig = plt.figure()
hexplt = hexfig.add_subplot(1,1,1)
hexplt.hexbin(x, y, gridsize = 20)

#to use imshow I have to bin the data myself
def histBin(pairsData,xbins,ybins=None):
    if (ybins == None): ybins = xbins
    xdata, ydata = zip(*pairsData)
    xmin,xmax = min(xdata),max(xdata)
    xwidth = xmax-xmin
    ymin,ymax = min(ydata),max(ydata)
    ywidth = ymax-ymin
    def xbin(xval):
        xbin = int(xbins*(xval-xmin)/xwidth)
        return max(min(xbin,xbins-1),0)
    def ybin(yval):
        ybin = int(ybins*(yval-ymin)/ywidth)
        return max(min(ybin,ybins-1),0)
    hist = [[0 for x in xrange(xbins)] for y in xrange(ybins)]
    for x,y in pairsData:
        hist[ybin(y)][xbin(x)] += 1
    extent = (xmin,xmax,ymin,ymax)
    return hist,extent

#plot using imshow
imdata,extent = histBin(pairs,20)
imfig = plt.figure()
implt = imfig.add_subplot(1,1,1)
implt.imshow(imdata,extent = extent, interpolation = 'nearest')

plt.draw()
plt.show()

似乎已经有一种方法可以做到这一点,而不需要编写我自己的“装箱”方法和使用imshow。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-15 23:57:16

Numpy有一个名为histogram2d的函数,它的文档字符串还向您展示了如何使用Matplotlib可视化它。将interpolation=nearest添加到imshow调用以禁用插值。

票数 12
EN

Stack Overflow用户

发布于 2012-06-02 01:22:59

我意识到有一个补丁提交给matplotlib,但我采用了其他示例中的代码,以满足我的一些需求。

现在直方图是从左下角绘制的,就像传统的数学(而不是计算)一样。

此外,超出装箱范围的值将被忽略,并且我对二维数组使用2dnumpy数组

我将数据输入从成对改为两个一维数组,因为这是将数据提供给scatter(x,y)和类似函数的方式

代码语言:javascript
复制
def histBin(x,y,x_range=(0.0,1.0),y_range=(0.0,1.0),xbins=10,ybins=None):
    """ Helper function to do 2D histogram binning
        x, y are  lists / 2D arrays 
        x_range and yrange define the range of the plot similar to the hist(range=...) 
        xbins,ybins are the number of bins within this range.
    """

    pairsData = zip(x,y)

    if (ybins == None):
        ybins = xbins
    xdata, ydata = zip(*pairsData)
    xmin,xmax = x_range
    xmin = float(xmin)
    xmax = float(xmax)

    xwidth = xmax-xmin
    ymin,ymax = y_range    
    ymin = float(ymin)
    ymax = float(ymax)
    ywidth = ymax-ymin

    def xbin(xval):
        return floor(xbins*(xval-xmin)/xwidth) if xmin <= xval  < xmax else xbins-1 if xval ==xmax else None


    def ybin(yval):
        return floor(ybins*(yval-ymin)/ywidth) if ymin <= yval  < ymax else ybins-1 if yval ==ymax else None

    hist = numpy.zeros((xbins,ybins)) 
    for x,y in pairsData:
        i_x,i_y = xbin(x),ybin(ymax-y)
        if i_x is not None and i_y is not None:
            hist[i_y,i_x] += 1 

    extent = (xmin,xmax,ymin,ymax)

    return hist,extent
票数 2
EN

Stack Overflow用户

发布于 2012-03-29 05:28:59

我刚刚提交了此https://github.com/matplotlib/matplotlib/pull/805的拉取请求。希望它能被接受。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2030970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档