绘制近红外光谱特征选择筛选出的变量分布图(特征波长图)
在近红外光谱数据分析建模过程中,特征选择是其中关键的一步。特征选择的原因是全部样本信息(全波长)中存在冗余信息,使得有些有效信息被抵消同时也无法突出有用的信息,这样建立的分析模型准确度和可靠性不高且计算量较大,特征选择就是最大限度的筛选出光谱数据中的有效信息,使得筛选出来的这些信息可以代表全部的样本信息,这样筛选出来的就是特征波长。写论文时需要画出筛选出来的特征波长图,去看特征波长落在哪个波段,从而查找相应作用的官能团。本文分别用python和matlab来实现两种不同的变量分布图。此处说明一下,特征波长和特征变量是同样的意思,只是叫法不一样。
用python绘制变量分布图
直接上代码:
import matplotlib.pyplot as plt
import pandas as pd
name = ['full_wave.csv',
'cor_wavelength.csv',
'wave_noclass.csv',
'wave_2class.csv',
'wave_3class.csv']
new_name = ['全波长',
'相关系数变量选择',
'不分类',
'分为2类',
'分为3类']
sign = ['+', 'x', '*', 'o', 'v', '^', '_', 'h', '.']
gap = 5
plt.figure(figsize=(7.5,6))
ax = plt.axes()
ax.spines['top'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False)
for i in range(len(name)):
y = pd.read_csv(name[i])
y = y.values.T[0]
y = y[::gap]
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.scatter([i + 1000 for i in y], [i+1] * len(y), marker=sign[i], s=30, label=new_name[i])
plt.scatter([1000]*605, [len(name)+1]*605, alpha=0)
plt.scatter([1000]*605, [len(name)+2]*605, alpha=0)
plt.scatter([1000]*605, [0]*605, alpha=0)
plt.legend(loc="upper center",ncol=5,fontsize=11)
plt.yticks([])
plt.show()
将获得的特征波长向量(向量即为筛选出的变量序列)保存为.csv文件,name后是文件名称,最多可以输入九个文件(一般是三四个就可以,不会超过九个),new name是显示的图例。我的结果如下:![在这里插入图片描述](https://img-blog.csdnimg.cn/c24dbd0d57cf471896257ea40b87c6dc.png?x-oss-process=image/wa 可以自行修改代码(改变字的大小函数plt.legend中的fontsize,图的比例plt.figure中的figsize等)。
用MATLAB绘制特征波长图
直接上代码:
%%载入数据
%%画近红外光谱图
[row,lie] = size(data_re);
X = data_re;
figure(1)
for j =1:row
i =1:lie;
xlabel('Wavelength/nm');
ylabel('Abosorbance');
title('近中红外光谱图');
plot(i+2800,X(j,:),'y');
hold on
end
%%画特征波长图
% Y = data_re(:,NMir_index-860);
% for j =1:1
% i =1:lie;
% xlabel('Wavelength/nm');
% ylabel('Abosorbance');
% title('近中红外光谱图');
% plot(NMir_index+1940,Y(j,:),'*r');
% hold on
% end
%%变量分布区
H_pa = patch([2834,2834,3120,3120],[-0.05,0.4,0.4,-0.05],[.6 .6 .8]);%%%特征波长所在阴影部分
set(H_pa,'EdgeColor',[.8 .8 .8],'EdgeAlpha',0.5,'FaceAlpha',0.5)
H_pa1 = patch([3572,3572,3878,3878],[-0.05,0.4,0.4,-0.05],[.6 .6 .8]);
set(H_pa1,'EdgeColor',[.8 .8 .8],'EdgeAlpha',0.5,'FaceAlpha',0.5)
H_pa2 = patch([4150,4150,4698,4698],[-0.05,0.4,0.4,-0.05],[.6 .6 .8]);
set(H_pa2,'EdgeColor',[.8 .8 .8],'EdgeAlpha',0.5,'FaceAlpha',0.5)
由于数据是正在发表的一篇论文,就不在此处展示。首先需要画出预处理之后的光谱图,在此基础上,查找特征,特征落在哪一段就在哪一段画出阴影。最后整体显示出来就是下文的图形。 在此,需要说明一下阴影图的画法。 网上有patch这个函数。是这么写的:patch([X down left, X top left, X top right, X down right], [Y left down, Y left up, Y rigth up, Y rigth down],[阴影颜色])。这里简单说一下patch后的第一个[]里放的是左边最低的X对应的值,左边最高的X对应的值,右边最高的对应X的值,右边最低的对应X的值。因为问我画的是矩形,所以前后两数字都相同。后面类似。 这里分享个寻找XY值的小窍门 先画出特征波长图,查看特征波长大致落在几个区间。查看存放特征波长值的文件,找出每个区间的最左最右面的值,即为我们画图时用的X对应的左右值。
欢迎交流! 2021-12-6
|