使用Seaborn库进行电导率谱分析

本文展示了如何使用Python库Seaborn进行电导率谱分析,并绘制可视化的电导率谱图。

代码示例

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows

class SNSData:
    def __init__(self, pandas_dir="./csfNsaline"):
        self.path = pandas_dir
        self.raw_data = pd.read_csv(self.path, encoding="utf-8")
        self.regular_data = {'name': [], 'magnitude': [], 'phase': [], 'frequency': []}
        self.freq_list = [1, 2, 3, 7, 11, 17, 23, 31, 43, 61, 89, 127, 179, 251, 349]

        for it in self.freq_list:
            self.regular_data['name'].extend(
                self.raw_data['name'] + self.raw_data['name'].isin(['saline']) * self.raw_data[
                    'property']  # 盐水考虑浓度属性,脑脊液不考虑, 在新数据中命名为盐水+浓度
            )
            self.regular_data['magnitude'].extend(self.raw_data[str(it) + 'kHz_mag'])
            self.regular_data['phase'].extend(self.raw_data[str(it) + 'kHz_ang'])
            for i in range(self.raw_data.shape[0]):
                self.regular_data['frequency'].append(it)

        self.regular_data['logFreq'] = np.log10(self.regular_data['frequency'])  # 将频率以对数形式展现
        self.regular_data['R'] = np.array(self.regular_data['magnitude']) * np.cos(
            np.array(self.regular_data['phase']) * 3.14 / 180)  # np.cos默认弧度
        self.regular_data['X'] = np.array(self.regular_data['magnitude']) * np.sin(
            np.array(self.regular_data['phase']) * 3.14 / 180)
        self.regular_data['logMag'] = np.log10(self.regular_data['magnitude'])  # 在bode图中,幅度也是用对数表示的
        '下面利用已知浓度盐水的R和电导率(conductivity)映射关系来得到待测物体的电导率'
        # 创建电导率空列表保持行数一致
        self.regular_data['conductivity'] = [0] * self.raw_data.shape[0] * len(self.freq_list)
        self.df = pd.DataFrame(self.regular_data)
        self.generate_conductivity()

        '重新整理完数据后,整合至pandas数据帧,用get_df方法可以返回该pandas数据帧'

    def generate_conductivity(self):
        '''
        映射关系如下
        利用给出的盐水和电导率表自己先写个映射关系
        '''
        conductivity_list = [976, 1987, 3850, 5650, 7450, 9238]  # 该电导率列表对应浓度为0.1,0.5的盐水
        concentration_list = [0.05, 0.10, 0.2, 0.3, 0.4, 0.50]
        saline_real_dict = {}  # 每个频率,每个浓度的盐水的实部,其中同浓度对应同一个电导率

        # 在这里,首先过滤出同一个频率下的所有盐水的real part,然后对同一个浓度的realpart求平均值,这里有七个浓度,将七个平均值打包为一个列表,作为子列表添加入saline_real_list
        for it in self.freq_list:  # 对每一个频率
            one_freq_saline_real_list = []  # 打包用的子列表

            for con in concentration_list:
                # 这里依次为0.05, 0.1, 0.2, 0., 0.4, 0.6的盐水的real part平均值
                saline_concentration = 'saline' + format(con, '.2f') + '%'
                filted_df = self.df[
                    self.df['frequency'].isin([it]) * self.df['name'].isin([saline_concentration])]
                avg = np.mean(filted_df['R'])  # 求筛选出来的下R的平均值
                one_freq_saline_real_list.append(avg)

            saline_real_dict[it] = one_freq_saline_real_list  # 每一个频率下都有了一个浓度对应的real part列表
            # real part和电导率建立起映射关系,对于单个频率,one_freq_saline_real_list作为x轴,conductivity作为y轴,用np.interp方法, 寻找R对应的电导率
            self.df['conductivity'] += self.df['frequency'].isin([it]) * np.interp(self.df['R'],
                                                                                    one_freq_saline_real_list[::-1],
                                                                                    conductivity_list[
                                                                                    ::-1])  # interp要求x轴为递增序列,因此此处倒序输入

    def get_df(self):
        return self.df

    def draw(self, plot_content="magnitude"):
        pass

    def filter_and_output(self):
        # 筛选出property为A或B或C或D或E或F或G或H的值
        filtered_df = self.df[self.df['name'].str.contains('A|B|C|D|E|F|G|H')]

        # 输出ABC的值
        for name in ['A', 'B', 'C']:
            df = filtered_df[filtered_df['name'].str.contains(name)]
            print(f'Filtered data for {name}:')
            print(df)

    def draw_20230213NO1_conductivity():
        # df = pd.DataFrame(regular_data)
        snsdata = SNSData(pandas_dir="./2023_2_13No1/2023_2_13_12.csv")
        df = snsdata.get_df()
        # 选择特定类型
        rslt_df = df[~df['name'].isin(['air'])]

        wb = Workbook()
        ws = wb.active
        for r in dataframe_to_rows(rslt_df, index=True, header=True):
            ws.append(r)
        wb.save('2023_2_13No1_data.xlsx')

        rslt_df.to_csv('./rslt_data.csv')

        sns.set(font_scale=1.5)

        lm = sns.relplot(x='logFreq', y='conductivity', hue='name', data=rslt_df, kind='line')
        # lm.set(title='impedance spectrum')
        lm.set_axis_labels('frequency(10^x kHz)', 'conductivity(µS/cm)')
        plt.show()
        return None

    draw_20230213NO1_conductivity()

代码解析

  1. 导入库: 首先导入必要的库,包括matplotlib.pyplot用于绘图,numpy用于数值计算,pandas用于数据处理,seaborn用于数据可视化,openpyxl用于操作Excel文件。
  2. 定义类: 定义一个名为SNSData的类,用于处理和分析电导率数据。类中包含以下方法:
    • __init__:类的初始化方法,读取CSV文件并进行数据预处理。
    • generate_conductivity:利用已知的盐水电导率和实部映射关系计算待测物体的电导率。
    • get_df:返回处理后的Pandas数据帧。
    • draw:用于绘制不同类型的数据可视化图,尚未实现。
    • filter_and_output:筛选出特定属性的数据并输出。
    • draw_20230213NO1_conductivity:绘制20230213NO1数据的电导率谱图,并保存数据到Excel和CSV文件。
  3. 绘制电导率谱图: 代码使用sns.relplot函数绘制电导率谱图,并设置了横轴和纵轴的标签。

代码应用

该代码示例展示了如何使用Seaborn库绘制电导率谱图,并通过分析谱图信息可以了解待测物体的电导率特性。该代码可以根据实际需要进行修改,例如调整绘图参数,添加数据过滤等操作。

总结

本文介绍了如何使用Seaborn库进行电导率谱分析的可视化方法,并提供了一个完整的代码示例。Seaborn库提供了丰富的数据可视化功能,能够帮助用户更直观地理解和分析数据。

Python库Seaborn数据可视化分析:电导率谱分析

原文地址: https://www.cveoy.top/t/topic/ndle 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录