使用matplotlib的交互式直方图?

时间:2016-02-01 14:03:13

标签: python matplotlib python-3.4

背景:我的图像显示3个CCD,其中一组X射线相互作用显示为亮像素。我已将此数据绘制为直方图(切割数据以隔离每个CCD)。

我得到一个如下所示的直方图:

enter image description here

左边的大峰是背景噪音(它的实际峰值进一步上升,但我改变了轴范围以显示直方图的其他部分)并且右侧应该有一个小得多的峰值(虽然这张图片上没有真正可见的)是X射线相互作用。

我的具体问题..有没有办法获得每个峰值的标准偏差和平均值?理想情况下(并且我不确定这在python中是否真的可行)说,单击峰的两侧并计算两次点击内的数据的标准偏差和平均值?

我正在使用python 3.4和matplotlib 1.4.3版

我的代码如下:

### read the data ###

a = np.fromfile(filename.img, dtype=np.uint32)                #unpack the data and put it into a numpy array

image_data = np.reshape(a[3:], (-1,Cols))             


### plotting the data ###

fig, ax = plt.subplots()
ax.imshow(image_data, cmap=cm.gray, interpolation='nearest', clim=(0,2000))         


numrows, numcols = image_data.shape


def format_coord(x, y):                                             
    x = int(x +0.5)                                                
    y = int(y +0.5)
    col = x
    row = y
    if col >= 0 and col < numcols and row >= 0 and row < numrows:
        z = image_data[row, col]                                   
        return 'x=%1.0f, y=%1.0f, z=%1.0f' % (x, y, z)              
    else:
        return 'x=%1.4f, y=%1.4f' % (x, y)


ax.format_coord = format_coord                                      
plt.figure()


### Obtaining a histogram ###

which_CCD = int(input ('Which CCD? 1,2,3... '))

if which_CCD == 1:
    CCD1_image = np.array(image_data[150:1500,300:1498])
    CCD1_data=np.reshape(CCD1_image,np.product(CCD1_image.shape))
    plt.hist(CCD1_data, bins = 2500, histtype='step')
    plt.xlabel('Energy(ADC Channels)')
    plt.title('CCD1 Histogram')
    plt.figure()



elif which_CCD == 2:
    CCD2_image = np.array(image_data[1800:3150,300:1498])
    CCD2_data=np.reshape(CCD2_image,np.product(CCD2_image.shape))
    plt.hist(CCD2_data, bins = 2500, histtype='step')
    plt.xlabel('Energy(ADC Channels)')
    plt.title('CCD2 Histogram', fontsize=12)
    plt.figure()



elif which_CCD == 3:
    CCD3_image = np.array(image_data[150:1500,1948:3146])
    CCD3_data=np.reshape(CCD3_image,np.product(CCD3_image.shape))
    plt.hist(CCD3_data, bins = 2500, histtype='step')
    plt.xlabel('Energy(ADC Channels)')
    plt.title('CCD3 Histogram')
    plt.figure()




plt.show()

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您需要选择一系列X值并计算此范围内Y值的平均值和标准值。

这是一个如何做到这一点的简单示例。我相信你可以根据自己的需要轻松调整它。

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as npr

# generate random data
data = npr.randn(300)

# calculate hist
heights,edges = np.histogram(data,50)

# center edges
edges = edges[:-1]+(edges[1]-edges[0])

# plot histogram
fig, ax = plt.subplots()
ax.plot(edges,heights)
ax.set(title='Click Twice', xlabel='X', ylabel='Y')

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

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

# calculate which values are selected and display mean and std
mask = (edges>point1[0]) & (edges<point2[0])
fig.text(0.2,0.83,'Mean: ' + str(np.mean(heights[mask])))
fig.text(0.2,0.8,'Std: ' + str(np.std(heights[mask])))

fig.canvas.draw()
plt.show()

输出:

直方图,提示选择点 enter image description here

绘制选定区域并显示平均值和标准 enter image description here

P.S。我使用了this response

P.P.S。我在Python 2.7上,Python 3可能需要进行一些语法更改。

相关问题