我有一个数据文件,每行包含4个元素keV
,keVerror
,Counts
和Countserror
,每个元素用空格分隔。对于每一行,我想使用这4个元素计算赫兹(Hz)和磁通密度(Fnu
)并绘制它们。因此,在读取任何行的四个元素后,我想从keV(简单乘法)计算Hz,然后使用此Hz值通过乘以同一行的计数值来计算Fnu。我还想把输出写在一个文件中。我的代码能够计算Hz,因为写入的输出txt文件与我手动计算的值匹配,但生成的图表显示不同的值。
文件的前几行:
keV keV error counts Counts error
0.616850019 7.29998946E-3 6.82969764E-2 5.15005877E-3
0.631449997 7.30001926E-3 7.20156059E-2 5.33540128E-3
0.646049976 7.29998946E-3 8.04692879E-2 5.47288591E-3
0.65882504 5.47501445E-3 0.102332868 7.17073539E-3
我没有经验的代码编写尝试是这样的:
import numpy as np
import matplotlib.pyplot as plt
(kev,keverr,cts,ctserr)=np.loadtxt("sedtotal.dat", usecols=(0,1,2,3),unpack=True)
hz=kev*2.415e17
hzerr=keverr*2.415e17
fnu=kev*cts*1.602e-9
fnuerr=kev*ctserr*1.602e-9
nufnu=hz*fnu
nufnuerr=hz*fnuerr
plt.figure(1)
plt.ylabel(r'log $\nu$F$\nu$ (Jy-Hz)',fontsize = 12)
plt.xlabel(r'log $\nu$ (Hz)',fontsize =12)
print(hz,fnu)
plt.errorbar(hz,hzerr,fnu,fnuerr, fmt='ro', color="red", elinewidth=None, capsize=3,barsabove=True)
plt.yscale('log')
plt.xscale('log')
f = open('sedtotal.txt', 'w')
print >> f, 'Filename:', hz, fnu, fnuerr # to write the output in a file
f.close()
ax = plt.gca()
plt.show()