如何以Python输出拟合数据以供在Origin中使用
我有一个代码,可以读取50个文本文件,每个文件生成一个直方图,每个直方图拟合一个高斯分布。然后取每个高斯分布下的面积并绘制时间图(基本上就是它乘以18的文本文件) 然后我想在origin中分别处理这些数据。我可以让代码从图形中打印出y值,但我正在努力将其更改为可以复制并粘贴到类似origin的电子表格格式的形式 打印件为:如何以Python输出拟合数据以供在Origin中使用,python,graph,output,data-analysis,originlab,Python,Graph,Output,Data Analysis,Originlab,我有一个代码,可以读取50个文本文件,每个文件生成一个直方图,每个直方图拟合一个高斯分布。然后取每个高斯分布下的面积并绘制时间图(基本上就是它乘以18的文本文件) 然后我想在origin中分别处理这些数据。我可以让代码从图形中打印出y值,但我正在努力将其更改为可以复制并粘贴到类似origin的电子表格格式的形式 打印件为: 77.78630383833547, 62.92926582239441, 63.84025706577048, 55.489066870438165, 38.6079798
77.78630383833547, 62.92926582239441, 63.84025706577048, 55.489066870438165, 38.60797989548756, 40.771390484048545, 14.679073842876978, 33.95959972488966, 29.41960790300141, 32.93241034391399, 30.927428194781815, 31.086396885182356, 21.52771899125612, 4.27684299160886, 6.432975528727562, 7.500376934048583, 18.730555740591637, 4.355896959987761, 11.677509915219987, 12.865482314301719, 0.6120306267606219, 12.614420497451556, 2.2025029753442404, 9.447046999592711, 4.0688197216393425, 0.546672901996845, 1.12780050608251, 2.2030852358874635, 2.202804718915858, 0.5726686031033587, 0.5465322281618783, 0.5185100682386156, 0.575055917739342, 0.5681697592593679
如果需要,完整代码为。
我猜我写的另一个变量是0,18,36,54。。。因此,python可能不需要这样做
更新
请求了相关的代码示例。我认为这是一个最小的例子。我尝试输出的相关变量是安培。我不介意这是通过保存文件(可能更喜欢)还是在IDE控制台中完成的
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from numpy import exp, loadtxt, pi, sqrt, random, linspace
from lmfit import Model
import glob, os
## Define gaussian
def gaussian(x, amp, cen, wid):
"""1-d gaussian: gaussian(x, amp, cen, wid)"""
return (amp / (sqrt(2*pi) * wid)) * exp(-(x-cen)**2 / (2*wid**2))
## Define exponential decay
def expdecay(x, t, A):
return A*exp(-x/t)
## Define constants
fileToRun = 'Run0'
location = 'ControlRoom6'
stderrThreshold = 10
minimumAmplitude = 0.1
approxcen = 780
DeadTime = 3
LiveTime = 15
## Get location of files to be loaded
## Define paramaters
amps = []; ampserr = []; ts = []
folderToAnalyze = baseFolder + fileToRun + '\\'
## Generate the time array and coincidence plots
for n in range(0, numfiles):
## Load text file
x = np.linspace(0, 8191, 8192)
finalprefix = str(n).zfill(3)
fullprefix = folderToAnalyze + prefix + finalprefix
y = loadtxt(fullprefix + ".Spe", skiprows= 12, max_rows = 8192)
## Make figure and label
fig, ax = plt.subplots(figsize=(15,8))
## Plot data
ax.bar(x, y)
ax.set_xlim(600,960)
# Fit data to a gaussian
gmodel = Model(gaussian)
result = gmodel.fit(y, x=x, amp=8, cen=approxcen, wid=1)
## Append to list if error in amplitude and amplitude itself is within reasonable bounds
if result.params['amp'].stderr < stderrThreshold and result.params['amp'] > minimumAmplitude:
amps.append(result.params['amp'].value)
ampserr.append(result.params['amp'].stderr)
ts.append(MaestroT*n)
## Plot decay curve
print(amps)
fig, ax = plt.subplots()
ax.errorbar(ts, amps, yerr= 2*np.array(ampserr), fmt="ko-", capsize = 5, capthick= 2, elinewidth=3, markersize=5)
plt.xlabel('Time', fontsize=14)
plt.ylabel('Peak amplitude', fontsize=14)
plt.title("Decay curve of P-31 by $β^+$ emission", fontsize=14)
## Fit decay curve
将numpy导入为np
将matplotlib.pyplot作为plt导入
从scipy.optimize导入曲线\u拟合
从numpy导入exp、loadtxt、pi、sqrt、random、linspace
从lmfit导入模型
导入全局操作系统
##定义高斯分布
def高斯(x、amp、cen、wid):
“1-d高斯:高斯(x,amp,cen,wid)”
返回(amp/(sqrt(2*pi)*wid))*exp(-(x-cen)**2/(2*wid**2))
##定义指数衰减
def EXP衰减(x,t,A):
返回一个*exp(-x/t)
##定义常数
fileToRun='Run0'
位置='ControlRoom6'
stderrThreshold=10
最小振幅=0.1
近似值=780
死区时间=3
现场时间=15
##获取要加载的文件的位置
##定义参数
安培=[];安培数=[];ts=[]
folderToAnalyze=baseFolder+fileToRun+'\\'
##生成时间数组和符合图
对于范围内的n(0,numfiles):
##加载文本文件
x=np.linspace(081918192)
finalprefix=str(n).zfill(3)
fullprefix=文件夹分析+前缀+最终引用
y=loadtxt(fullprefix+“.Spe”,skiprows=12,最大行数=8192)
##制作图形和标签
图,ax=plt.子批次(图尺寸=(15,8))
##绘图数据
轴杆(x,y)
ax.set_xlim(600960)
#将数据拟合到高斯分布
G模型=模型(高斯)
结果=G模型拟合(y,x=x,amp=8,cen=approxcen,wid=1)
##若振幅和振幅本身的误差在合理范围内,则追加到列表中
如果result.params['amp'].stderr最小振幅:
amps.append(result.params['amp'].value)
amperr.append(result.params['amp'].stderr)
ts.append(大师*n)
##绘制衰减曲线
打印(安培)
图,ax=plt.子批次()
最大误差条(ts,amp,yerr=2*np.array(amp),fmt=“ko-”,倾覆=5,capthick=2,elinewidth=3,markersize=5)
plt.xlabel('Time',fontsize=14)
plt.ylabel('峰值振幅',fontsize=14)
plt.title(“P-31通过$β^+$emission的衰减曲线”,fontsize=14)
##拟合衰减曲线
如果您的想法是将amps
、amperr
和ts
的值打印到一个文件中以供以后操作,您可以执行以下操作:
如果振幅和振幅本身的误差在合理范围内,则添加到列表中
如果result.params['amp'].stderr希望这有助于解决您的问题。如果没有,请细化问题。如果您使用的是最近的Origin,您可以使用originpro模块传输数据
import originpro as op
import pandas as pd
# balabalabala
df = pd.DataFrame(list(zip(ts, amps, ampserr)), columns=['ts', 'Amp', 'Err']) # create a dataframe
op.find_sheet('w').from_df(df) # import dataframe to activated worksheet
如果使用的是旧版本,则必须将数据保存为文件。
有关更多信息,请查看他们的文档页面:
请将相关代码包含在您的帖子正文中,以形成一个完整的表单!我举了一个例子。应该是相关的部分,谢谢!我认为我的版本是2018年版的origin,因此对于直接解决方案来说可能还不够新。你是对的,这些是我想要提取的变量