Matlab应该是大部分人最早接触到的除了Excel之外的画图工具,相比于其他方法,Matlab画图快捷方便,网上的资源也非常多,能够非常快速地帮助我们完成结果的可视化。但是,要使用Matlab画出足够精美的图,为论文增添光彩,有时候并不那么容易,本文总结了一些Matlab画图的技巧。
Figure
设置图幅figure大小
set(gcf,'Units','centimeter','Position',[10 5 15 7.8]); % 第1,2个参数为figure位置,第3,4个参数为figure大小
设置子图subplot的大小(使紧凑)
set(gca,'position',[0.03 0.07 0.98 0.88]); % 前两个参数为子图在figure中的位置,第3,4个参数代表子图大小,数字代表百分比
给特定区域加背景色(填充面横坐标,填充面纵坐标,填充颜色rgb值)
patch([0,3,3,0],[0,0,12,12],[0.1,0.1,0.1],'FaceAlpha',.2,'EdgeColor','none');
图幅消除白边
set(gca, 'LooseInset', [0,0,0,0]);
set(gca,'LooseInset',get(gca,'TightInset'))
坐标轴断开breakyaxis和breakxaxis
以时间序列为例:有时候存在时间上一段时间数据的缺失,造成图中大片空白,又或者一些时间对应的数值远大于其他数值,画出的图中无法显示其他数值的相对大小,就需要对x轴或者y轴折叠,或者说断开。
Example:
a=[2,5,9,890];
bar(a);
axis([0.5,4.5,0,900]);
breakyaxis([10 880]);
subplot部分子图缺失问题
用subplot绘制组图时,我们经常用set(gca,’position’,[0.78 0.12 0.18 0.64])来使得子图变得紧凑,这样做有时候会使得绘制出来的图出现部分子图缺失,这是由于subplot会把整个figure分割为设定好的的等大网格,一旦某副子图set(gca,’position’,[0.78 0.12 0.18 0.64])所设定的位置和大小越界,就会出现缺失。
subplot绘制非等大小子图
正常情况下使用subplot画图时每幅子图大小一致,有时候我们需要绘制含有非等大子图的组图,比如“品”或者倒“品”字型的组图,这个时候我们可以使用subplot将figure分割地细一些,比较大的子图占据多个网格,如subplot(2, 2, [1, 2]),来实现非等大子图绘制。
以下图为例,左边为:
subplot(2,3,[1,2,4,5]);...
subplot(2,3,3]);...
subplot(2,3,6]);...
右边为:
subplot(2,3,1]);...
subplot(2,3,4]);...
subplot(2,3,[2,3]);...
subplot(2,3,[5,6]);...
Tick
坐标轴标值旋转 (例如以年月日为横坐标的时候,横放会相互重叠,竖放非常占空间,斜放刚刚好)
set(gca, 'XTickLabelRotation', 45);
坐标刻度向外
set(gca, 'tickdir', 'out');
坐标刻度长短(majortick, minortick)
set(gca, 'ticklength', [0.02,0.01]);
显示副刻度
set(gca, 'xminortick', 'on', 'yminortick', 'on');
坐标轴断开(折叠)
不同数量级的数据放在同一张图中的时候(Y轴),或者中间段时间数据存在缺失(X轴),需要对坐标轴进行折叠,此时可以使用breakyaxis和breakxaxis函数实现。
% example
a=[2,5,9,890];
bar(a);
axis([0.5,4.5,0,900]);
breakyaxis([10 880]); % 中括号中为折叠的起始和结束位置
% breakxaxis和breakyaxis需要额外下载,下载后添加到matlab搜索路径,下载地址为:
% https://www.mathworks.com/matlabcentral/fileexchange/3683-breakxaxis
% https://ww2.mathworks.cn/matlabcentral/fileexchange/45760-break-y-axis
Legend
legend位置
legend({'str1','str2','strn'},'Location','SouthEast');
legend横排
hl = legend('str1','str2','strn');
set(hl,'Orientation','horizon');
legend不显示外框
set(hl,'Box','off');
Colormap
subplot各子图使用不同的颜色图
ax1=subplot(1,2,1);
colormap(ax1,hot);
ax2=subplot(1,2,2);
colormap(ax2,cool);
colormap颜色图反转
colormap(flipud(hot));
自定义colormap颜色图
colormap_mine=[linspace(1,1,64)’,linspace(0,1,64)’,linspace(0,1,64)’];
colormap(colormap_mine);
colorbar显示范围
caxis([low,high]);
Links
https://ww2.mathworks.cn/help/matlab/creating_plots/types-of-matlab-plots.html