【MATLAB 画图03】for循环中加图例,以及设置字体、大小、位置、图例标题
Hello, 今天分享在for循环中给每一条曲线加图例,以及一些小tips,我会逐个做一些说明,能完整运行的代码我放在最后,希望能帮助到~
所画图像,以柯西色散公式为例(不重要哈,因为本科研狗恰好要用到),这里是赋值,可以改成任何你需要的数据。关于y轴数据(m)的计算,我没有用循环,而是用了数组运算,在画图前计算好一个二维数组m。
%% 这里是数据的赋值
clear
WL_ref = 525; % nm
m_ref = 1.52;
B = (100:100:2000)';
WL = 400:1:1000; % WL 是画 x 轴
m = m_ref*ones(numel(B),numel(WL))+B.*(1./WL.^2-1/WL_ref^2); % m 是画 y 轴
开始建立图窗,这里给Figure命名,命名后的figure在重复运行.m文件时或单独执行画图代码,不会重复在同一个图窗上画图,效果如下:执行了4次代码,Figure后会以数字的方式自动编号,名称不变。如果直接用Figure()来每次生成新的窗口,就会没有名称。如果你需要对图像内容有一个说明,在调试代码的时候以示区分,给Figure命名是一个很好的选择。
考虑到在循环中要绘制多条曲线,我采用了rgbmap这个函数生成从红到绿的渐变色,numel(B)行,三列的rgb值,行的数量=所画曲线的数量。
我习惯在开头就对线宽、大小设置变量,便于一次次修改。
%% 开始建立图窗
fig = figure('Name','Zhihu_plot_legend')
LW = 1.5; MS = 3; FS=12; % LW线宽 MS标记大小 FS字体大小
color_str = rgbmap('baby pink','darkish green',numel(B));
下面到了关键的步骤: 对每条曲线设置一个标签,用numel( )计算所画的曲线总数,numel(B)其实就等于等于numel(m(:,1))。
这里采用了cell
le_str = cell(numel(B),1);
只要在循环中用花括号对le_str进行引用,图例的内容,我用num2str获取了每次循环的B因子的取值,转化成str。
for ib = 1: numel(B)
plot(WL,m(ib,:),'color',color_str(ib,:),'LineWidth',LW,'MarkerSize',MS)
le_str{ib} = ['B = ',num2str(B(ib))];
hold on
end
坐标轴标签、对文字字体进行一些设置,\bf是加粗,'FontWeight','bold'也是加粗,这个看个人习惯。
因为在做汇报时,图框加粗会更好看,所以我用了set(gca,'linewidth',1.5),1.5也可以用一个变量来设置,按照经验,1.5的宽度够了,也不需要经常变化,所以这里直接写的数值。
xlabel('\bfWavelength (nm)')
ylabel('\bfm')
set(gca,'FontSize',FS,'FontName','Times New Roman','FontWeight','bold','yaxislocation','left')
set(gca,'linewidth',1.5)
下面是关于Legend的设置,将legend赋值给变量lgd,再对lgd进行属性控制就会很清楚。
lgd = legend(le_str,'Location','northeastoutside','box','off');
lgd.Title.String = 'Factor'; % 给图例加标题
lgd.Title.FontSize = FS; % 用数字指定标题的字体大小
lgd.FontSize = FS-2; % 图例字体的大小
lgd.FontName = 'Times New Roman'; % 图例的字体
常用的位置(非默认)有:右外侧'eastoutside',右上外侧'northeastoutside'。
再来一个保存图像的小tips :
首先假设一个路径,if语句的意思是,如果不存在该路径就新建一个该路径下的文件夹。注意记得用一个变量fig =figure( )来传递到print和close,print可以指定分辨率和格式,close可以将指定的fig关闭,有时在循环中关闭指定窗口也很有用。
path_Figure = 'C:\知乎文章\';
if ~exist(path_Figure,'dir'); mkdir(path_Figure); end
fig = figure('Name','Zhihu_plot_legend');
print(fig, [ path_Figure ,'ZhiHu_',num2str(date),'.png' ], '-dpng', '-r300')
saveas(gcf,[ path_Figure ,'ZhiHu_',num2str(date),'.fig' ],'fig')
close(fig)
完整的代码如下:如果rgbmap不能使用的话,可以替换成别的获取rgb的方式,这里不展开介绍对颜色的选取。
%% 这里是演示数据的赋值
clear
path_Figure = 'C:\知乎文章\';
if ~exist(path_Figure,'dir'); mkdir(path_Figure); end
WL_ref = 525; % nm
m_ref = 1.52;
B = (100:100:2000)';
WL = 400:1:1000;
%m = zeros(numel(B),numel(WL));
m = m_ref*ones(numel(B),numel(WL))+B.*(1./WL.^2-1/WL_ref^2);
%% 开始建立图窗
fig = figure('Name','Zhihu_plot_legend');
LW = 1.5; MS = 3; FS=12; % for laptop
color_str = rgbmap('baby pink','darkish green',numel(B));
le_str = cell(numel(B),1);
for ib = 1: numel(B)
plot(WL,m(ib,:),'color',color_str(ib,:),'LineWidth',LW,'MarkerSize',MS)
le_str{ib} = ['B = ',num2str(B(ib))];
hold on
xlabel('\bfWavelength (nm)')
ylabel('\bfm')
set(gca,'FontSize',FS,'FontName','Times New Roman','FontWeight','bold','yaxislocation','left')
set(gca,'linewidth',1.5)
%% 重点设置如下:
lgd = legend(le_str,'Location','northeastoutside','box','off');
lgd.Title.String = 'Factor'; % 给图例加标题
lgd.Title.FontSize = FS; % 用数字指定标题的字体大小