随着技术的发展,我们可以通过各种途径获取大量的数据。如何从这些数据中快速获取有效信息,成为现在信息处理的一大难题。数据可视化给我们提供一种快速“查看”数据的可能,有利于我们快速对数据进行判断,找出数据的规律。本文以
上篇文章(MATLAB GUI实现矩阵旋转和翻转)
中涉及到的体压分布数据为研究对象,谈谈使用MATLAB软件进行数据可视化的方法。
几乎每个汽车公司都会进行体压分布测试,但是目前并没有国家或者行业标准来进行规范,也没有科学而又客观的评价指标。目前常见的体压分布数据评价指标有:最大压力、平均压力、最大压力梯度、平均压力梯度和不对称系数等[1]。下面本文将以数据可视化的方式对这些评价指标进行分析。
1.显示最大压力的大小及位置
最大压力体现了坐垫的刚度,较硬的坐垫最大压力和平均压力都较大;较软的坐垫最大压力和平均压力都较小。最大压力的位置应在人的坐骨结节部位,否则体压分布不合理。本文想在显示体压分布数据的同时显示最大压力值及其在矩阵中的位置。为实现上述操作,首先需要先求出最大压力的大小及在矩阵中的坐标值,然后再借助imagesc函数将压力矩阵进行数据可视化,最后将最大压力显示在图像上。最大压力的大小及位置可以通过下述代码求出:
figure('Name','压力分布图')
imagesc(A); % 显示矩阵A
% 借助jet颜色表构造
colormap('jet');
cbar=colorbar('FontSize',11);
cbar.Label.String = '压力P (kg/cm^2)';
%计算最大压力
Pm=max(max(NUM));
%输出最大压力位置信息,rows1为行坐标,cols1为列坐标
[rows1,cols1]=find(NUM==max(max(NUM)));
set(xlabel('列数'), 'FontSize', 13,'Color', 'k','Rotation', 0);
set(ylabel('行数'), 'FontSize', 13,'Color', 'k', 'Rotation', 90);
text(cols1, rows1,sprintf('%d',NUM(rows1,cols1)));
2.压力等高线图
在同一副图上可以用等高线来表示压力大小的变化,线条颜色越深等高线的条数越多,表示压力值越大。对体压分布数据而言,臀部尾骨处的压力值通常较大,然后周围依次递减,因此其等高线图通常为封闭的曲线。等高线图可以用contour函数来实现,代码如下:
%等高线图
figure('Name','等高线图')
contour(NUM,10);
colormap('jet');
cbar=colorbar('FontSize',11);
cbar.Label.String = '压力P (kg/cm^2)';
3.压力梯度向量图
最大压力梯度体现了座垫的刚度和材质分布。刚度较大的座垫最大压力梯度也较大,材质分布较为合理的坐垫最大压力梯度较小,人体感受也较为舒适。结合人体的生理结构,最大压力梯度也应在人体臀部坐骨结节附近。在显示压力梯度向量之前,需要先求出梯度向量值。在MATLAB软件中可以方便调用gradient函数来实现这一操作,代码如下所示:
[Fx,Fy]=gradient(NUM);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%显示梯度向量
figure('Name','梯度向量')
压力梯度的方向与等高线的法向方向相同,且其方向是从低等高线指向高等高线。为了显示和理解上方便也可以把梯度和等高线显示在一张图上。
4.对压力分布图进行平滑处理
上文显示出来的压力分布图像锯齿一样非常不美观,为了呈现出更好的视觉效果可以对压力分布图进行平滑处理,代码如下:
figure('Name','压力分布图')
data1=NUM;
[X1,Y1] = meshgrid(1:size(data1,2),1:size(data1,1));
[X2,Y2] = meshgrid(1:0.1:size(data1,2),1:0.1:size(data1,1));
outData1 = interp2(X1, Y1, data1, X2, Y2,'linear');
imagesc(outData1);
colormap('jet');
colorbar;cbar3=colorbar('FontSize',11);
cbar3.Label.String = '压力 P';
set(gca, 'XTick', linspace(1,size(X2,2),size(X1,2)));
set(gca, 'YTick',linspace(1,size(X2,1),size(X1,1)));
set(gca, 'XTickLabel', 1:size(X1,2));
set(gca, 'YTickLabel', 1:size(X1,1));
set(xlabel('列数'), 'FontSize', 13,'Color', 'k','Rotation', 0);
set(ylabel('行数'), 'FontSize', 13,'Color', 'k', 'Rotation', 90);
5.总结
在上述操作都没有问题的情况下可以将上述代码打包为独立可单独执行的小程序,以方便下次使用。
参考文献
[1]徐明, 夏群生. 体压分布的指标[J]. 中国机械工程, 1997(1):65-68.
领取专属 10元无门槛券
私享最新 技术干货