1.导入库
import mne
import pandas as pd
import numpy as np
import math
import matplotlib.pyplot as plt
2.读取坐标数据
第二列为电极极坐标的角度,第三列为电极极坐标的长度ρ,数据是BCI竞赛官网下载电极通道位置文件:eloc64.txt
df = pd.read_excel('D:/研究生/数据集/SEED/通道坐标/channel.xlsx',engine='openpyxl')
3.转换成直角坐标
list1 = np.zeros([64], dtype=np.int) # 存放theta
list2 = np.zeros([64], dtype=np.float) # 存放rou
count = 0
for i in range(64):
list1[i] = int(df.x[i])
list2[i] = float(df.y[i])
#存放转换后的直角坐标
xy = np.zeros([64, 2])
for i in range(64):
xy[i,1] = math.cos(math.radians(list1[i]))*list2[i]
xy[i,0] = math.sin(math.radians(list1[i]))*list2[i]
归一化
def zscore(data):
data_zscore = (data-data.mean())/data.std()
return data_zscore
def min_max(data):
data_zscore = (data-data.min())/(data.max()-data.min())
return data_zscore
4.绘制图片
#将64通道的weight映射到脑电头皮地形中,xy /= 5.3是为了将头皮轮廓扩大到和地形图一样大
xy /= 5.3
weight = np.random.random([64])
weight = zscore(weight)
im, cn = mne.viz.plot_topomap(weight,xy,show=False)
plt.colorbar(im)
plt.show()
5.画多个子图
#画多个子图
fig, ax = plt.subplots(3, 3)
ax = ax.flatten()
np.random.seed(0)
for i in range(9):
weight = np.random.random([64])
weight = zscore(weight)
im, cn = mne.viz.plot_topomap(weight, xy, vmin=0, vmax=1, show=False, axes=ax[i]) #vmin=0, vmax=1是颜色柱的最大最小值
ax[i].set_title('a')
fig.colorbar(im, ax=[ax[0], ax[1], ax[2], ax[3], ax[4], ax[5], ax[6], ax[7], ax[8]], fraction=0.03, pad=0.05) #fraction=0.03调节colorbar的大小
plt.savefig('pig.png', bbox_inches='tight') #bbox_inches='tight'使得color不会出现在图中间
plt.show()