从def()

时间:2016-02-03 16:41:15

标签: python histogram user-defined-functions

我已经定义了一个绘制直方图的函数。在这个函数中,我正在对数据进行一些分析,我从图中的2次点击获得了这些数据。

我的代码如下:

def hist_maker():
     heights,edges = np.histogram(data, 1000)
     edges = edges[:-1]+(edges[1]-edges[0])

     fig, ax = plt.subplots()
     ax.plot(edges,heights)                                              # plot histogram
     plt.yscale('log', nonposy='clip')
     ax.set(title=titl, xlabel='ADC Value(DN/40)', ylabel='Frequency')

     point1, point2 = fig.ginput(2)                      # get input from 2 clicks on figure

     ax.axvspan(point1[0], point2[0], color='red', alpha=0.5)   # paint selected area in red

     mask = (edges>point1[0]) & (edges<point2[0])

     # calculate which values are selected and display mean
     fig.text(0.2,0.84,'Mean: ' + str((sum(edges[mask]*heights[mask])/sum(heights[mask]))))     

     mean = sum(edges[mask]*heights[mask])/sum(heights[mask])

     mean_noise = edges[heights.argmax() # Find the x value corresponding to the max y value

     fig.text(0.2,0.8,'Std: ' + str(g))    

在函数内部实际运行的内容一切正常。但是,例如,如果我想在代码中的某个时刻使用计算的mean_noise,那么我会得到一个错误,表示没有定义平均噪声(这是正确的,因为它不是&#39; t在函数之外定义)

所以我的问题是如何提取我在定义hist_maker时自动计算的mean_noise的值,以便我以后可以使用它?

解决这个问题的另一种方法是摆脱函数hist_maker,只需重复我正在绘制的每个直方图中的代码,我确信它会起作用。但是当我绘制多个直方图时,我认为定义一个函数会更容易,然后只是为每个直方图调用它。

1 个答案:

答案 0 :(得分:2)

最简单的解决方案 - 您的函数的第一行应该是:

global mean_noise

如果你然后跑(在功能之外):

hist_maker()
print(mean_noise)

印刷品应该有效。如果你颠倒了这两行的顺序,你将获得NameError

但请注意,这通常不被视为良好的编程。通常认为更好的解决方案是在函数结束时return mean_noise