先给出效果图:
制作方法:
最近被被要求画出如下图的若干段脑电信号在同一张图内并行陈列的图表
这幅图的横坐标单位是秒(s),纵坐标是脑电传感器电极的名称,这种图可以用来清晰地比对感兴趣的电极的信号异同。
绘制这幅图所用的工具是mne工具包内的mne.io.raw.plot()方法,使用起来非常方便。然而这幅图有一个缺点,就是横坐标没办法显示成确切的时间点,如完善11点01分11秒这种,但是我的任务是需要将横坐标以时间点的形式给出。由于此方法被封装,底层代码又很长,我就想干脆自己用matplotlib模拟一个。
具体思路其实很简单,就是将纵坐标的数据组织成一个numpy数组,每一行代表一根曲线对应的数据。之后,在每一行上加上一个偏移量,使曲线可以错开。最后,重命名对应的横纵坐标刻度即可。
具体步骤:
首先获取数据,我的数据已经存储在名为selection的元组中,元素类型为np.array,selection[0]是一个矩阵,每行对应一根曲线的数据;selection[1]是时间序列
>>> selection
(array([[-7.69921087e-04, -7.57030465e-04, -7.50389841e-04, ...,
-2.24608700e-04, -2.06249329e-04, -1.89452457e-04],
[-2.41010372e-04, -2.49604102e-04, -2.72260299e-04, ...,
-2.85150894e-04, -2.74213420e-04, -2.45307237e-04],
[-6.52319297e-05, -7.46069201e-05, -1.01950642e-04, ...,
-9.17944025e-05, -8.00756645e-05, -5.50756901e-05],
...,
[-2.99605560e-04, -3.18355535e-04, -3.53511738e-04, ...,
-1.44496939e-05, 8.59715013e-06, 4.68783486e-05],
[-7.42158705e-05, -9.76533393e-05, -1.34372040e-04, ...,
-3.08199934e-04, -3.14449925e-04, -3.02731191e-04],
[-9.76123739e-06, -4.02299378e-05, -7.81205012e-05, ...,
-4.09760587e-04, -3.96869983e-04, -3.73432521e-04]]), array([0.000e+00, 1.000e-03, 2.000e-03, ..., 9.998e+00, 9.999e+00,
1.000e+01]))
接着设置偏移量offset,我的数据设置0.002的间隔就够区分了,各位的偏移量请自行摸索
>>> offset = np.arange(0, 11*0.002, 0.002)
>>> offset
array([0. , 0.002, 0.004, 0.006, 0.008, 0.01 , 0.012, 0.014, 0.016,
0.018, 0.02 ])
修改横坐标的刻度为具体时间点。这个方法的第一个变量是原始的刻度序列,第二个变量是修改后对应的刻度序列
>>> plt.xticks([0,2,4,6,8,10], ['$23:12:43$','$23:12:45$','$23:12:47$','$23:12:49$','$23:12:51$','$23:12:53$'])
再修改纵坐标为电极名称。参数含义同plt.xticks
>>> ylabel = ['$POL\ G9$', '$POL\ G5$', '$POL\ G4$','$POL\ G2$', '$POL\ G3$', '$POL\ H3$', '$POL\ G7$', '$POL\ G8$', '$POL\ G6$', '$POL\ B15$', '$POL\ H1$']
>>> plt.yticks(offset.tolist(), ylabel)
在原始数据上加上偏移量并绘制
>>> x = selection[1]
>>> y = selection[0].T + offset
>>> plt.plot(x, y)
展示图片
>>> plt.show()
最后的效果图:
以上。