光栅数据处理

Python读取光纤解调仪tdms文件并转换为dataframe

import glob
from nptdms import TdmsFile
import pandas as pd
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt


ROOTS = ['waterlevel_experimen_02mm']  #文件夹名:“waterlevel_experimen_02mm” 里面保存有多个不同时间点记录的tdms波长文件
names=["0.4mm"]  #label,和文件夹名对应

def getlines(ROOT,name):
    lines = []
    path_files=sorted(glob.glob(pathname='/home/iint/zhaosheng/LZY/experimental_result/'+ROOT+'/*.tdms')) #或者指定文件夹下文件list
    path_files=path_files[::-1]
    x=[]
    mean_value = []
    for num,file in enumerate(path_files):
        print(file)

        # load file
        tdms_file = TdmsFile(file)
        
        # show groups
        groups_data = tdms_file.groups()
        #print("Groups Data:")
        #print(groups_data)
        #Groups Data:
        #[<TdmsGroup with path /'Physical'>, <TdmsGroup with path /'wavelength'>]
        
        
        
        # show channels
        channels_data = tdms_file['wavelength'].channels()
        #print("Channels Data:")
        #print(channels_data)
        #Channels Data:
        #[<TdmsChannel with path /'wavelength'/'1通道1应变'>, <TdmsChannel with path /'wavelength'/'4通道1应变'>]
        
        
        # show data in channel
        selected_data = tdms_file['wavelength']['1通道1应变']
        #print(selected_data.data)

        
        x.append(selected_data.data)
        mean_value.append(selected_data.data.mean())
    
    # total用于保存所有数据
    total=[]
    for result in range(len(path_files)):
        #添加平均值
        total.append(x[result].mean())
    for i,value in enumerate(x):
        #
        for num,bochang in enumerate(value):
            lines.append([bochang,int(i+1)*5+15,num,name])
    return lines,mean_value

for _ in range(len(ROOTS)):
    ROOT = ROOTS[_]
    name = names[_]
    plt.figure(dpi=200)
    #print(getlines(ROOT,name))
    #print(np.array(getlines(ROOT,name)).shape)
    all_data,mean_data = getlines(ROOT,name)
    
    #list转dataframe
    data=pd.DataFrame(all_data,columns=['Wavelength(nm)', 'Liquid Level(cm)','number','Thickness'])
    
    #sns 箱线图
    sns.boxplot(y='Wavelength(nm)',x= 'Liquid Level(cm)',data=data) #左图 hue="Thickness",liquid_level
    #sns.regplot(y='Wavelength(nm)',x= 'Temperature(℃)',data=data) # 是否显示离群值,showfliers = False)
    plt.show()

带误差棒的柱状图

import matplotlib.pyplot as plt

index = np.arange(5)
values = [5, 6, 3, 4, 6]
SD = [0.8, 2, 0.4, 0.9, 1.3]
plt.title('A Bar Chart')
plt.bar(index, values, yerr = SD, error_kw = {'ecolor' : '0.2', 'capsize' :6}, alpha=0.7, label = 'First')
plt.xticks(index+0.2,['a', 'b', 'c', 'd', 'e'])
plt.legend(loc=2)
plt.show()

带误差帮的折线图


def f_1(x, A, B):
    return A * x + B
def get_line(x_list,y_list,err_list,title_list,title,xlabel,ylabel):
    plt.figure(dpi=200)
    r_list=[]
    first_time=True
    for num in range(len(y_list)):
        
        if first_time:
            x_list = x_list[3:]
            
            first_time=False
        y_list[num]=y_list[num][3:]
        N = float(len(x_list))
        sx,sy,sxx,syy,sxy=0,0,0,0,0
        for i in range(0,int(N)):
            sx  += x_list[i]
            sy  += y_list[num][i]
            sxx += x_list[i]*x_list[i]
            syy += y_list[num][i]*y_list[num][i]
            sxy += x_list[i]*y_list[num][i]
        a = (sy*sx/N -sxy)/( sx*sx/N -sxx)
        b = (sy - a*sx)/N
        r = abs(sy*sx/N-sxy)/math.sqrt((sxx-sx*sx/N)*(syy-sy*sy/N))
        #return a,b,r
        r_list.append(r)
        
        
        print(" y = %10.8f x + %10.8f , r=%10.8f" % (a,b,r) )
        # plt.errorbar(x, y, fmt="bo:", yerr=0.2, xerr=0.02)
        

        print("print:{}".format(num))
        y_list_2=[]
        for count,data in enumerate(y_list[num]):
            if count == 0:
                y_list_2.append(0)
            else:
                y_list_2.append(y_list_2[count-1]+y_list[num][count]-y_list[num][count-1])
        print(len(y_list_2))
        print(len(x_list))
        plt.errorbar(x_list,y_list_2,  yerr=err_list[num][3:], xerr=0.2,elinewidth=3,ms=2,mfc='wheat',mec='salmon',capsize=3,label=title_list[num])
        #plt.errorbar(x,y, fmt="bo-", yerr=err, xerr=0.2,ecolor='hotpink',elinewidth=3,ms=2,mfc='wheat',mec='salmon',capsize=3)
#err_list[num][3:]   fmt="bo-",,ecolor='hotpink'
        #plt.bar(x,y, yerr = SD, error_kw = {'ecolor' : '0.2', 'capsize' :6}, alpha=0.7, label = 'First')
        #plt.plot([0,160],[b,a*160+b],"blue",label='最小二乘法拟合')



        #plt.scatter(water_level,putong_2000,color="red",label='平均结果')
    #     #plt.plot(x1, y1, "blue",label='最小二乘法拟合')
    #     plt.legend()#绘制图例
    #     # title2 = title+r"斜率拟合结果"
    plt.title(title)
    plt.legend()
    plt.xlabel(xlabel)
    plt.ylabel(ylabel)
    plt.show()
    
    
    
#     print()
#     print(r_list)
    plt.figure(dpi=100)
    plt.plot([0,50,180,300,500,1000,2000],r_list)
    plt.title(title)
    #plt.legend()
    plt.show()


def get_line2(x_list,y_list,err_list,title_list,title,xlabel,ylabel):
    plt.figure(dpi=200)
    r_list=[]
    first_time=True
    for num in range(len(y_list)):
        
 
        N = float(len(x_list))
        sx,sy,sxx,syy,sxy=0,0,0,0,0
        for i in range(0,int(N)):
            sx  += x_list[i]
            sy  += y_list[num][i]
            sxx += x_list[i]*x_list[i]
            syy += y_list[num][i]*y_list[num][i]
            sxy += x_list[i]*y_list[num][i]
        a = (sy*sx/N -sxy)/( sx*sx/N -sxx)
        b = (sy - a*sx)/N
        r = abs(sy*sx/N-sxy)/math.sqrt((sxx-sx*sx/N)*(syy-sy*sy/N))
        #return a,b,r
        r_list.append(r)
        
        
        print(" y = %10.8f x + %10.8f , r=%10.8f" % (a,b,r) )
        # plt.errorbar(x, y, fmt="bo:", yerr=0.2, xerr=0.02)
        

        print("print:{}".format(num))
        y_list_2=[]
        for count,data in enumerate(y_list[num]):
            if count == 0:
                y_list_2.append(0)
            else:
                y_list_2.append(y_list_2[count-1]+y_list[num][count]-y_list[num][count-1])
        print(len(y_list_2))
        print(len(x_list))
        plt.errorbar(x_list,y_list_2,  yerr=err_list[num], xerr=0.2,elinewidth=3,ms=2,mfc='wheat',mec='salmon',capsize=3,label=title_list[num])
        #plt.errorbar(x,y, fmt="bo-", yerr=err, xerr=0.2,ecolor='hotpink',elinewidth=3,ms=2,mfc='wheat',mec='salmon',capsize=3)
#err_list[num][3:]   fmt="bo-",,ecolor='hotpink'
        #plt.bar(x,y, yerr = SD, error_kw = {'ecolor' : '0.2', 'capsize' :6}, alpha=0.7, label = 'First')
        #plt.plot([0,160],[b,a*160+b],"blue",label='最小二乘法拟合')



        #plt.scatter(water_level,putong_2000,color="red",label='平均结果')
    #     #plt.plot(x1, y1, "blue",label='最小二乘法拟合')
    #     plt.legend()#绘制图例
    #     # title2 = title+r"斜率拟合结果"
    plt.title(title)
    plt.legend()
    plt.xlabel(xlabel)
    plt.ylabel(ylabel)
    plt.show()
    
#     print()
#     print(r_list)
    plt.figure(dpi=100)
    plt.plot([0,50,180,300,500,1000,2000],r_list)
    plt.title(title)
    #plt.legend()
    plt.show()


    
posted @ 2021-06-01 10:06  nuaazs  阅读(308)  评论(0)    收藏  举报