python - 作业10:绘图分析mat数据内容结构(附代码)

python - 作业10:绘图分析mat数据内容结构

    • 作业要求
    • 分析
    • 绘图结果
    • *2020/02/04* 我是没有感情的贴代码工具人

github指路 冲冲冲冲冲

小声bb,这作业名称怎么越来越长了

----------------------------------原文–如下--------------------------------

今天的作业听起来很高级,是让你分析mat数据里面的内容结构

(没有错又是一个我从来没有听说过的文件格式和之前的xml 一 样……我 真 孤陋寡闻 系列)

作业要求

python - 作业10:绘图分析mat数据内容结构(附代码)_第1张图片

分析

先分析一下这个mat,是什么

首先要从外面导入一下需要用的库~

import scipy.io as sio
import math
import matplotlib.pyplot as plt

按照老师给的实例print出来看一下可以发现,里面其实是一个三维矩阵
python - 作业10:绘图分析mat数据内容结构(附代码)_第2张图片
看了这个之后有一说一 并没有什么实际用途,至于数据要怎么展示呢,其实老师上课给了提示,这是一个按照时间顺序来的某个东东的四个属性信息,然后这个矩阵规格又是9X101X4的然后作业要求又说可以展示局部数据内容所以说↓

我们可以先获取这个数据各个维度上的值,一般最好拿到的是第三维,(就是最下面的那一排四个数据)三层for循环就可以拿到

然后绘制出来我们会发现,有点像心电图

(其实我觉得是因为我用了点作为标记mark,然后设置的线是绿色的,图又小,画出来就很不美好,然后呢,我也没截图,脑补一下大概是这样嗯……………………

算了脑补不来我还是重新错误绘制试试好了

(拿了第四个属性然后全部都画起来的样子↓
python - 作业10:绘图分析mat数据内容结构(附代码)_第3张图片
那怎么办呢,它一点都不平滑怎么办怎么办,拿里面的其中的一部分数据呈现看起来就会变得平滑(啦)

像这些都可以:
部分数据

然后我就随便选了一些连续的根据时间改变的属性值将其绘制出来,同样的获取另一个mat数据里面的相同属性,将其绘制在同一个图表上面,这样子就–>完成了第二个作业要求:对比数据,绘制图形显示

我是用index和minnum+maxnum的条件判断直接拿数据的(有点low但是很迅速嘻嘻)

然后拿完数据直接溜(break

获取另一个文件同理


raw_K=sio.loadmat('../py-data/10_Subject1K.mat')

k = raw_K['Subject1K']

subkk = []
index = 0
flag = 0
minnum = 10
maxnum = 30
for ik in k:
    # print(ik)
    for iik in ik:
        # print(iik)
        if index >= minnum:
            if index <=maxnum:
                subkk.append(iik[3])
        elif index > maxnum:
            flag = 1
            break
        index = index + 1
    if flag == 1:
        break

接下来是第三个要求,用三条曲线展示数据均值和标准差

数学极差的我决定百度一下这个标准差的算法,度娘上面的描述如下:

方差的概念与计算公式,例如 两人的5次测验成绩如下:X: 50,100,100,60,50,平均值E(X)=72;Y:73, 70,75,72,70 平均值E(Y)=72。平均成绩相同,但X 不稳定,对平均值的偏离大。方差描述随机变量对于数学期望的偏离程度。单个偏离是消除符号影响方差即偏离平方的均值,记为E(X):直接计算公式分离散型和连续型。推导另一种计算公式得到:“方差等于各个数据与其算术平均数的离差平方和的平均数”。其中,分别为离散型和连续型计算公式 。 称为标准差或均方差,方差描述波动程度。

python - 作业10:绘图分析mat数据内容结构(附代码)_第4张图片

那么问题来了怎么算呢

回答,按照我之前获得的数据来说的话,那么我们可以推测出来需要计算的平均值是这每个时间节点的四个属性均值,知道了这个之后按部就班算方差就可以了= =

算完各个方差的值用来画均值的偏差值

然后,把这三条(均值,均值正负对应方差值)曲线画在同一个图表里面就完成作业的第三个要求了,nice呀

index = 0
for ik in k:
    for iik in ik:
        if index >= minnum:
            if index <= maxnum:
                tempk = (iik[0]+iik[1]+iik[2]+iik[3])/4
                temps = math.pow((iik[0]-tempk),2)+math.pow((iik[1]-tempk),2)+math.pow((iik[2]-tempk),2)+math.pow((iik[3]-tempk),2)/4
                temps = math.sqrt(temps)
                junk.append(tempk)
                sk1.append(tempk+temps)
                sk2.append(tempk-temps)
        elif index > maxnum:
            flag = 1
            break
        index = index + 1
    if flag == 1:
        break

然后我是得到所有的数据之后一起绘制图形的

(当然你也可以选择拿到一部分数据之后绘制一条线之类的……看你自己吧)

参数定义什么的和下图(还没加图例的)展示的一致

fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax1.plot(subkk,'go--')
ax1.plot(subvv,'bo-')
ax2 = fig.add_subplot(2,1,2)
ax2.plot(junk,'go--')
ax2.plot(sk1,'--')
ax2.plot(sk2,'--')
plt.show()

绘图结果

(上图是对比俩者中的数据,下图是展示均值和标准差
python - 作业10:绘图分析mat数据内容结构(附代码)_第5张图片
总结下,还是写的太慢,我什么时候才能在课上写完博客啊55555

加了个图例,大概是这个样子:
python - 作业10:绘图分析mat数据内容结构(附代码)_第6张图片

=-=-=-=-=-=-=-=-=-=-=-=更新分割线=-=-=-=-=-=-=-=-=-=-=-=

2020/02/04 我是没有感情的贴代码工具人

还是那句话,有错改路径/还有错就问我 略略略略

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/11/12 11:05
# @Author : Chen Shan
# Function : Read mat 3D data & plot analysis

import scipy.io as sio
import math
import matplotlib.pyplot as plt
raw_K=sio.loadmat('../py-data/10_Subject1K.mat')
raw_V=sio.loadmat('../py-data/10_Subject1V.mat')

k = raw_K['Subject1K']
v = raw_V['Subject1V']

subkk = []
subvv = []
index = 0
flag = 0
minnum = 10
maxnum = 30
for ik in k:
    # print(ik)
    for iik in ik:
        # print(iik)
        if index >= minnum:
            if index <=maxnum:
                subkk.append(iik[3])
        elif index > maxnum:
            flag = 1
            break
        index = index + 1
    if flag == 1:
        break
# print(subkk)
# print(index)
index = 0
for iv in v:
    # print(iv)
    for iiv in iv:
        # print(iiv)
        if index >= minnum:
            if index <= maxnum:
                subvv.append(iiv[3])
        elif index > maxnum:
            flag = 1
            break
        index = index + 1
    if flag == 1:
        break

junk = []
sk1 = []
sk2 = []
index = 0
for ik in k:
    for iik in ik:
        if index >= minnum:
            if index <= maxnum:
                tempk = (iik[0]+iik[1]+iik[2]+iik[3])/4
                temps = math.pow((iik[0]-tempk),2)+math.pow((iik[1]-tempk),2)+math.pow((iik[2]-tempk),2)+math.pow((iik[3]-tempk),2)/4
                temps = math.sqrt(temps)
                junk.append(tempk)
                sk1.append(tempk+temps)
                sk2.append(tempk-temps)
        elif index > maxnum:
            flag = 1
            break
        index = index + 1
    if flag == 1:
        break
# print(junk)

fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax1.plot(subkk,'go--',label =  'Subject1K')
ax1.plot(subvv,'bo--',label = 'Subject1V')
ax1.legend(loc='best')
ax2 = fig.add_subplot(2,1,2)
ax2.plot(junk,'go--',label = 'MEAN')
ax2.plot(sk1,'--',label = 'Mean + Variance')
ax2.plot(sk2,'--',label = 'Mean - Variance')
ax2.legend(loc='best')
plt.show()

# print(k)
# print(v)

你可能感兴趣的:(python,py,分析mat数据)