背景:我的图像显示3个CCD,其中一组X射线相互作用显示为亮像素。我已将此数据绘制为直方图(切割数据以隔离每个CCD)。
我得到一个如下所示的直方图:
左边的大峰是背景噪音(它的实际峰值进一步上升,但我改变了轴范围以显示直方图的其他部分)并且右侧应该有一个小得多的峰值(虽然这张图片上没有真正可见的)是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()
答案 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()
输出:
P.S。我使用了this response。
P.P.S。我在Python 2.7上,Python 3可能需要进行一些语法更改。