【问题标题】:Any way to create histogram with matplotlib.pyplot without plotting the histogram?有什么方法可以在不绘制直方图的情况下使用 matplotlib.pyplot 创建直方图?
【发布时间】:2013-06-25 06:33:23
【问题描述】:

我正在使用 matplotlib.pyplot 创建直方图。我实际上对这些直方图的图并不感兴趣,但对频率和 bin 感兴趣(我知道我可以编写自己的代码来执行此操作,但更喜欢使用这个包)。

我知道我可以做到以下几点,

import numpy as np
import matplotlib.pyplot as plt

x1 = np.random.normal(1.5,1.0)
x2 = np.random.normal(0,1.0)

freq, bins, patches = plt.hist([x1,x1],50,histtype='step')

创建直方图。我只需要freq[0]freq[1]bins[0]。当我尝试使用时出现问题,

freq, bins, patches = plt.hist([x1,x1],50,histtype='step')

在一个函数中。例如,

def func(x, y, Nbins):
    freq, bins, patches = plt.hist([x,y],Nbins,histtype='step') # create histogram

    bincenters = 0.5*(bins[1:] + bins[:-1]) # center bins

    xf= [float(i) for i in freq[0]] # convert integers to float
    xf = [float(i) for i in freq[1]]

    p = [ (bincenters[j], (1.0 / (xf[j] + yf[j] )) for j in range(Nbins) if (xf[j] + yf[j]) != 0]

    Xt = [j for i,j in p] # separate pairs formed in p
    Yt = [i for i,j in p]

    Y = np.array(Yt) # convert to arrays for later fitting
    X = np.array(Xt)

    return X, Y # return arrays X and Y

当我调用func(x1,x2,Nbins) 并绘制或打印XY 时,我没有得到预期的曲线/值。我怀疑这与plt.hist 有关,因为我的情节中有一个部分直方图。

【问题讨论】:

  • 为什么不使用 np.histogram()?
  • 感谢您的建议。看起来问题出在其他地方。如果我逐行运行上面的代码(而不是作为函数),它同时适用于 np.histogram() 和 plt.hist()。关于为什么在函数中使用 this 不起作用的任何想法?

标签: python-2.7 matplotlib histogram


【解决方案1】:

我不知道我是否很好地理解了您的问题,但是在这里,您有一个非常简单的自制直方图(一维或二维)示例,每个直方图都在一个函数中,并正确调用:

import numpy as np
import matplotlib.pyplot as plt

def func2d(x, y, nbins):
    histo, xedges, yedges = np.histogram2d(x,y,nbins)
    plt.plot(x,y,'wo',alpha=0.3)
    plt.imshow(histo.T, 
               extent=[xedges.min(),xedges.max(),yedges.min(),yedges.max()],
               origin='lower', 
               interpolation='nearest', 
               cmap=plt.cm.hot)
    plt.show()

def func1d(x, nbins):
    histo, bin_edges = np.histogram(x,nbins)
    bin_center = 0.5*(bin_edges[1:] + bin_edges[:-1])
    plt.step(bin_center,histo,where='mid')
    plt.show()

x = np.random.normal(1.5,1.0, (1000,1000))

func1d(x[0],40)
func2d(x[0],x[1],40)

当然,您可以检查数据的居中是否正确,但我认为该示例显示了有关该主题的一些有用信息。

我的建议:尽量避免代码中出现任何循环!他们扼杀了表演。如果你看,在我的例子中没有循环。 python 数值问题的最佳实践是避免循环! Numpy 有很多 C 实现的函数来完成所有的硬循环工作。

【讨论】:

    【解决方案2】:

    没有。

    但是你可以绕过pyplot:

    import matplotlib.pyplot
    
    fig = matplotlib.figure.Figure()
    ax = matplotlib.axes.Axes(fig, (0,0,0,0))
    numeric_results = ax.hist(data)
    del ax, fig
    

    它不会影响活动轴和图形,因此即使在绘制其他内容的过程中也可以使用它。

    这是因为plt.draw_something() 的任何使用都会将绘图放在当前轴上 - 这是一个全局变量。

    【讨论】:

      【解决方案3】:

      如果您想简单地计算直方图(即计算给定 bin 中的点数)而不显示它,可以使用 np.histogram() 函数

      【讨论】:

        【解决方案4】:

        您可以使用np.histogram2d(用于二维直方图)或np.histogram(用于一维直方图):

        hst = np.histogram(A, bins)
        hst2d = np.histogram2d(X,Y,bins)
        

        输出形式将与plt.histplt.hist2d相同,唯一的区别是没有情节

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-04
          • 1970-01-01
          • 1970-01-01
          • 2017-12-26
          • 2012-04-13
          • 2017-07-27
          • 2021-12-01
          相关资源
          最近更新 更多