我前段时间总结MATLAB中的离谱技巧里提到过这么一个玩意:
x=1:.1:10;y=sin(x); hLine=plot(x,y,'-','LineWidth',5); colorNum=length(hLine.XData); % 这里用的pink配色,可以换成其他colormap % 最后面透明度用的200可调整 colorData=uint8([(pink(colorNum).*255)';200.*ones(1,colorNum)]); pause(1e-16)% Edge建立需要一定时间因此pause一下很重要 set(hLine.Edge,'ColorBinding','interpolated','ColorData',colorData)
原理就是,看着似乎是画图象时plot函数会只创建一个图形对象,但其实它这一个图形对象是很多隐藏的基础图形对象的组合体,这些更基础的对象可以设置更加复杂的属性,就比如上面设置了LineStrip对象的ColorData属性令其渐变。
不一定非要渐变哈,这里ColorData要求是 4 × n 4\times n 4×n大小的矩阵,每一列代表一个点的R,G,B及透明度值,只要矩阵大小和取点数对的上,颜色咋设置都可以,注意比较底层的图形对象的颜色不是要求0-1,而是要求0-255的uint8格式。
分段赋色折线图这样我们就检测每一个Y值的范围为矩阵不同的点赋予不同颜色就好: 这里分段Y值要求把正负无穷加进去嗷,分段Y值和颜色比如说可以这样设置:
DivY=[-inf,-5.5,-4.5,inf]; ColorList=[20,72,83;114,146,184;57,120,164];
这样绘制分段赋色折线图的代码可以写做:
x=0:.05:3*pi; noise=(rand([1,length(x)])-0.5); y=sin(x-2)-5+noise.*.3; % 绘制原始图像 hold on; hLine=plot(x,y,'-','LineWidth',1.8); % 设置分段点、颜色 DivY=[-inf,-5.5,-4.5,inf]; ColorList=[20,72,83;114,146,184;57,120,164]; % 构造颜色列表、修改颜色、绘制辅助线 YData=hLine.YData; CData=repmat([0,0,0,255],[length(YData),1]); for i=1:size(ColorList,1) yline(DivY(i),'LineWidth',1,'LineStyle','--','Color',[0,0,0]) tBool=(YData>=DivY(i))&(YData<=DivY(i+1)); CData(tBool,1:3)=repmat(ColorList(i,:),[sum(tBool),1]); end pause(1e-16) set(hLine.Edge,'ColorBinding','interpolated','ColorData',uint8(CData)')
添加图例的代码要写在颜色修改之前,因为MATLAB每次绘图都要调整绘图区域的位置啊,颜色序号啥的属性,会把比较底层对象的属性给刷掉,因此先绘制图例再进行上一个环节的修改颜色。
添加图例的代码(画几条折线在坐标区域外等方式隐藏起来,然后为这几条折线绘制图例):
lgdStr={'y<-5.5','-5.5<y<-4.5','y>-4.5'}; % 绘制图例
hLineSet{size(ColorList,1)}=''; for i=1:size(ColorList,1) hLineSet{i}=plot(mean(get(gca,'XLim')),mean(get(gca,'YLim')),... 'LineWidth',1.8,'Color',ColorList(i,:)./255); end legend([hLineSet{end:-1:1}],lgdStr{end:-1:1},'AutoUpdate','off')
再进行一下坐标区域的基础修饰,同时代码里贴心准备了四种配色,可以自己选用:
x=0:.05:3*pi; noise=(rand([1,length(x)])-0.5); y=sin(x-2)-5+noise.*.3; % 绘制原始图像
hold on; hLine=plot(x,y,'-','LineWidth',1.8); % 设置分段点、颜色、图例文本 DivY=[-inf,-5.5,-4.5,inf]; C1=[20,72,83;114,146,184;57,120,164]; C2=[239,192,171;149,196,201;59,107,111]; C3=[60,94,122;228,204,126;107,108,112]; C4=[92,143,167;221,199,180;208,83,68]; ColorList=C3; lgdStr={'y<-5.5','-5.5<y<-4.5','y>-4.5'}; % 绘制图例
hLineSet{size(ColorList,1)}=''; for i=1:size(ColorList,1) hLineSet{i}=plot(mean(get(gca,'XLim')),mean(get(gca,'YLim')),... 'LineWidth',1.8,'Color',ColorList(i,:)./255); end legend([hLineSet{end:-1:1}],lgdStr{end:-1:1},'AutoUpdate','off') % 构造颜色列表、修改颜色、绘制辅助线 YData=hLine.YData; CData=repmat([0,0,0,255],[length(YData),1]); for i=1:size(ColorList,1) yline(DivY(i),'LineWidth',1,'LineStyle','--','Color',[0,0,0]) tBool=(YData>=DivY(i))&(YData<=DivY(i+1)); CData(tBool,1:3)=repmat(ColorList(i,:),[sum(tBool),1]); end pause(1e-16) set(hLine.Edge,'ColorBinding','interpolated','ColorData',uint8(CData)') % 修饰一下 set(gca,'LineWidth',1.5,'XMinorTick','on','YMinorTick','on')
C1
