关于matlab中用griddata绘制伪色彩图的一点经验教训
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于matlab中用griddata绘制伪色彩图的一点经验教训相关的知识,希望对你有一定的参考价值。
参考技术A 整个事情起源于这个图这是之前和别人组之前合作测试时候我师兄画的,横轴压力纵轴温度,颜色轴是电阻率的对数,很直观的看出来了金属到半导体绝缘体的转变与压力温度的关系。
还记得那是一个阳光明媚的能热死个人的下午,我去找老板讨论这一组数据,大概意思就是压力下这个样品从一个绝缘体/半导体转变为一个金属。老板拿出了师兄之前画的那个图,说你去试试也画下类似这个的图吧,应该不难的。
“应该不难的”这种话从老板嘴里说出来一般都不可信,然后我去问师兄他比较忙只告诉我他用matlab画的伪色彩图,那怎么办呢,我只能一天从零开始入门matlab了啊。
先说说我摸索的过程,我思路一开始是这样的:我们测试是在不同压力下对其电阻-温度关系进行的测试,而要将其转化为三维图像首先要将其转化为矩阵,而不同压力下测试的温度范围都不同,也就意味着没法同时放到矩阵里,那该怎么办呢?
我选择了igor pro中的插值功能来解决这个问题,自己写了个小的macro来执行。
大概意思就是根据输入的T1、T2两个温度点 ,在其中均匀分600个位置,然后在这600个位置中对数据结果进行插值,因为我们的测试一般会得到几千个点,所以这样的简单插值精度完全可以保证。分别对不同压力下数据允许这个macro,即可得到同一温度下不同压力对应的电阻值。将不同压力下插值得到的600*n个数据在excel中排好导入matlab即可得到矩阵。运行griddata指令即可得到结果。
把相变点一加坐标轴一标也是有那么点意思,不过有个小问题,对每个压力点的测试温度范围都不完全相同,图中是对3.8-290K进行的插值,但许多时候测量范围会差很多,尤其是对一些高温超导体,其下半部分不可能这么整齐,比如下图,而此处使用这种办法只能在矩阵中手动将没有数字的地方设为0,非常麻烦;同时也不能使用'v4'参数,而要换为cubic spline模式。
然后我又去找师兄讨论了,妄图敲诈出他的原始方法,经过一番讨论,以及我自己的摸索,终于找到了更一般的方法。
我们首先来看看matlab中griddata的描述
不仅可以处理矩阵的数据,同时也可对输入的(x,y,z)点集进行插值,此方法即不再将其视为矩阵,而视为xy对应的二元函数z,输入所有的xyz数据进行插值即可。然而处理时首先还要注意点的数量,我们测试的原始数据加起来总共有上万个点,为了提高效率依旧可以先使用igor pro对数据插值及平滑处理,不过不用再设定温度范围,直接选择点的个数(600)插值即可,然后将得到的所有数据(600*n)输入excel中分别为三列:压力、温度、电阻,导入matlab中作为三个向量,运行指令
即可得到完整的包括0K附近及300K附近边角缺憾的相图。之后再添加其他说明数据即可。
这种方法相比于前者更为简便,且应用范围更广,我以后应该不会用我费老大劲搞出来的笨办法了。
MATLAB | 如何使用MATLAB绘制韦恩图的高阶版本:upset图
韦恩图随着阶数升高会越来越复杂,当阶数达到7或者以上时几乎没办法绘制:
但是使用upset图却可以比较轻易的绘制:
两种类型图的对应关系:
这期便教大家如何绘制这样的upset图:
教程部分
0 数据准备
数据需要的是0,1矩阵,例如随机生成数据:
setName='RB1','PIK3R1','EGFR','TP53','PTEN';
Data=rand([200,5])>.85;
每一行代表一个对象,第一行是1,0,0,1,0说明它既属于第一类也属于第四类。
1 配色
配色可以是rgb数值,也可以是多行颜色,也可以用matlab自带的colormap数据:
% 设置两个柱状图及关系连线的颜色
bar1Color=[61,58,61]./255;
bar2Color=[61,58,61]./255;
lineColor=[61,58,61]./255;
在随后的部分会更详细的讲解颜色设置。
2 主要运算
接下来几行就是数据统计的详细代码,小技巧有点多,这部分技巧在韦恩图绘制那篇和数据统计那篇也写到过,可以去瞅瞅,这里不详细展开:
% 进行组合统计(一顿花里胡哨的操作)
pBool=abs(dec2bin((1:(2^size(Data,2)-1))'))-48;
[pPos,~]=find(((pBool*(1-Data'))|((1-pBool)*Data'))==0);
sPPos=sort(pPos);dPPos=find([diff(sPPos);1]);
pType=sPPos(dPPos);pCount=diff([0;dPPos]);
[pCount,pInd]=sort(pCount,'descend');
pType=pType(pInd);
sCount=sum(Data,1);
[sCount,sInd]=sort(sCount,'descend');
sType=1:size(Data,2);
sType=sType(sInd);
3 创建布局并修饰
若集合名称为中文乱码,请将字体改为宋体,若后面绘图部分显示不全请调整各个axes的XLim及YLim属性。
% 构造figure及axes
fig=figure('Units','normalized','Position',[.3,.2,.5,.63],'Color',[1,1,1]);
axI=axes('Parent',fig);hold on;
set(axI,'Position',[.33,.35,.655,.61],'LineWidth',1.2,'Box','off','TickDir','out',...
'FontName','Times New Roman','FontSize',12,'XTick',[],'XLim',[0,length(pType)+1])
axI.YLabel.String='Intersection Size';
axI.YLabel.FontSize=16;
%
axS=axes('Parent',fig);hold on;
set(axS,'Position',[.01,.08,.245,.26],'LineWidth',1.2,'Box','off','TickDir','out',...
'FontName','Times New Roman','FontSize',12,'YColor','none','YLim',[.5,size(Data,2)+.5],...
'YAxisLocation','right','XDir','reverse','YTick',[])
axS.XLabel.String='Set Size';
axS.XLabel.FontSize=16;
%
axL=axes('Parent',fig);hold on;
set(axL,'Position',[.33,.08,.655,.26],'YColor','none','YLim',[.5,size(Data,2)+.5],'XColor','none','XLim',axI.XLim)
4 图像绘制
% 相交关系统计图 -----------------------------------------------------------
barHdlI=bar(axI,pCount);
barHdlI.EdgeColor='none';
if size(bar1Color,1)==1
bar1Color=[bar1Color;bar1Color];
end
tx=linspace(0,1,size(bar1Color,1))';
ty1=bar1Color(:,1);ty2=bar1Color(:,2);ty3=bar1Color(:,3);
tX=linspace(0,1,length(pType))';
bar1Color=[interp1(tx,ty1,tX,'pchip'),interp1(tx,ty2,tX,'pchip'),interp1(tx,ty3,tX,'pchip')];
barHdlI.FaceColor='flat';
for i=1:length(pType)
barHdlI.CData(i,:)=bar1Color(i,:);
end
text(axI,1:length(pType),pCount,string(pCount),'HorizontalAlignment','center',...
'VerticalAlignment','bottom','FontName','Times New Roman','FontSize',12,'Color',[61,58,61]./255)
% 集合统计图 ---------------------------------------------------------------
barHdlS=barh(axS,sCount,'BarWidth',.6);
barHdlS.EdgeColor='none';
barHdlS.BaseLine.Color='none';
for i=1:size(Data,2)
annotation('textbox',[(axS.Position(1)+axS.Position(3)+axI.Position(1))/2-.02,...
axS.Position(2)+axS.Position(4)./size(Data,2).*(i-.5)-.02,.04,.04],...
'String',setNamesInd(i),'HorizontalAlignment','center','VerticalAlignment','middle',...
'FitBoxToText','on','LineStyle','none','FontName','Times New Roman','FontSize',13)
end
if size(bar2Color,1)==1
bar2Color=[bar2Color;bar2Color];
end
tx=linspace(0,1,size(bar2Color,1))';
ty1=bar2Color(:,1);ty2=bar2Color(:,2);ty3=bar2Color(:,3);
tX=linspace(0,1,size(Data,2))';
bar2Color=[interp1(tx,ty1,tX,'pchip'),interp1(tx,ty2,tX,'pchip'),interp1(tx,ty3,tX,'pchip')];
barHdlS.FaceColor='flat';
sstrsize(Data,2)='';
for i=1:size(Data,2)
barHdlS.CData(i,:)=bar2Color(i,:);
sstri=[num2str(sCount(i)),' '];
end
text(axS,sCount,1:size(Data,2),sstr,'HorizontalAlignment','right',...
'VerticalAlignment','middle','FontName','Times New Roman','FontSize',12,'Color',[61,58,61]./255)
% 绘制关系连线 ---------------------------------------------------------------
patchColor=[248,246,249;255,254,255]./255;
for i=1:size(Data,2)
fill(axL,axI.XLim([1,2,2,1]),[-.5,-.5,.5,.5]+i,patchColor(mod(i+1,2)+1,:),'EdgeColor','none')
end
[tX,tY]=meshgrid(1:length(pType),1:size(Data,2));
plot(axL,tX(:),tY(:),'o','Color',[233,233,233]./255,...
'MarkerFaceColor',[233,233,233]./255,'MarkerSize',10);
for i=1:length(pType)
tY=find(pBool(pType(i),:));
oY=zeros(size(tY));
for j=1:length(tY)
oY(j)=find(sType==tY(j));
end
tX=i.*ones(size(tY));
plot(axL,tX(:),oY(:),'-o','Color',lineColor(1,:),'MarkerEdgeColor','none',...
'MarkerFaceColor',lineColor(1,:),'MarkerSize',10,'LineWidth',2);
end
若是前面配色部分使用的是:
bar1Color=[61,58,61]./255;
bar2Color=[61,58,61]./255;
lineColor=[61,58,61]./255;
修改其中一个柱状图颜色,另一个用多行颜色矩阵:
bar1Color=[66,182,195]./255;
bar2Color=[253,255,228;
164,218,183;
68,181,197;
44,126,185;
35,51,154]./255;
lineColor=[61,58,61]./255;
一个用多行颜色矩阵,一个使用自带colormap数据:
bar1Color=[0,0,245;245,0,0]./255;
bar2Color=cool;
lineColor=[61,58,61]./255;
完整代码
% upSetMDemo
% @author : slandarer
% Zhaoxu Liu / slandarer (2023). upset plot
% (https://www.mathworks.com/matlabcentral/fileexchange/123695-upset-plot),
% MATLAB Central File Exchange. 检索来源 2023/1/22.
rng(2)
clc;clear;
setName='RB1','PIK3R1','EGFR','TP53','PTEN';
Data=rand([200,5])>.85;
% setName='A','B','C','D','E','F','G';
% Data=rand([200,7])>.9;
% 设置两个柱状图及关系连线的颜色
bar1Color=[61,58,61]./255;
bar2Color=[61,58,61]./255;
lineColor=[61,58,61]./255;
% bar1Color=[66,182,195]./255;
% bar2Color=[253,255,228;
% 164,218,183;
% 68,181,197;
% 44,126,185;
% 35,51,154]./255;
% lineColor=[61,58,61]./255;
bar1Color=[0,0,245;245,0,0]./255;
bar2Color=cool;
lineColor=[61,58,61]./255;
%% ================以上是关于关于matlab中用griddata绘制伪色彩图的一点经验教训的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB | 如何使用MATLAB绘制韦恩图的高阶版本:upset图