Matlab Figure设置
Matlab的Figure特性由一系列Handle决定,通过一定的办法可以自由操控绘图。展示一个自动处理Figure的例子:
%% 示波器设置 这两个命令用于打开示波器工作栏,以此对其进一步进行设置
%set(0,'ShowHiddenHandles','on');
%set(gcf,'menubar','figure');
%%
XAxis=[-inf inf];%x轴范围 inf代表自动选
YAxis=[-5,110];%y轴范围
XLabel='时间/[s]';%x轴标签
YLabel='控制扭矩/[Nm]';%y轴标签
Axes_Title='控制器输出';%标题
figure_axes_FontSize=20;%标签与刻度的字体大小
figure_FontSize=18;%单标签的字体大小
%%
legend_text={' 无控制','MPC'};%图例标签
figure_legend_FontSize=20;%图例字体大小
%%
figure_LineWidth=3;%线条宽度
%% plot
%gca表示Get Current Axis的Handle,xtick表示显示刻度的位置,xticklabel表示显示的内容。
%gcf表示Get Current Figure的Handle
%gco表示Get Current Object的Handle(由用户指定)
%基础知识:1.图的所有属性在代码层面由句柄表示,handle,
%2.Root为最高级对象,即用户的屏幕,gcf返回的figure对象为root的子对象,可用'Children'句柄调用
%F=gcf 此时F为当前figure对象,等同于F=figure(n)即第n张打开的图 F此时即包含 Figure的句柄,
%Figure包含的句柄控制图的位置,单位等。
%[L,A]=get(gcf,'Children') gcf通过'Children'调用的两个子对象为 'Legend' 即图例 'Axes'即坐标区
%此时A等价于使用命令get(gca) Axes包含的句柄控制坐标字体 刻度等。
%gca通过'Children'调用的两个子对象为 'graphics' 即图中的线条 通过graphics(n)来指定对象
%Figure:
% Color
% Unit
% Position
% ...
% Children:
% Legend:
% FontSize
% ...
% Axes:
% FontSize
% XTick
% XAxis
% ...
% Children:
% grhapic1:
% Linewidth
% grhapic2:
% ...
%一个对象包含多个句柄,句柄可能返回对象,也可能返回属性
%set(对象,属性句柄,参数)以更改属性
%get(对象,对象句柄)以获取子对象
%% 设定figure
set(gcf,'color',[1,1,1])%把figure界面变成白的
set(gcf,'Unit','pixels');%设定figure单位
%set(gcf,'Position',[20,1,21,21/4*3]);%设定图位置
%% 设定图例位置与布局
ChI=get(gcf,'Children');
LeG=ChI(1);
AxE=ChI(2);
set(LeG,'Location','best');%图例位置最佳
set(LeG,'String',legend_text);
set(LeG,'Interpreter','latex');%解释器设置为latex
%h=legend('123');这个函数也能设定,省去了严谨的句柄调用
set(LeG,'Fontsize',figure_legend_FontSize);%设置图例字体大小
%set(LeG,'Box','off')
%legend('boxoff');
%% 设定坐标轴位置与布局
set(AxE,'Units','pixels');
set(AxE,'Position',[150,80,890,550]);
%% 设定数轴范围与刻度
set(get(AxE,'XAxis'),'Limits',XAxis);%设定x轴范围
set(get(AxE,'YAxis'),'Limits',YAxis);%设定y轴范围
%axis([XAxis YAxis]);%这个函数也能设定,省去了严谨的句柄调用
%set(gca,'XTick',0:xtick_size:simulation_duration);%设定x轴刻度
%% 设定数轴标签内容
set(get(AxE,'Title'),'String',Axes_Title)%设定标题
set(get(AxE,'XLabel'),'String',XLabel)%设定x轴标签
set(get(AxE,'YLabel'),'String',YLabel)%设定x轴标签
%xlabel(XLabel);
%ylabel(YLabel);这个函数也能设定,省去了严谨的句柄调用
%% 设定数轴字体大小
set(AxE,'FontSize',figure_axes_FontSize); %刻度与标签字体大小
set(get(AxE,'XLabel'),'Fontsize',figure_FontSize); %标签字体大小
set(get(AxE,'YLabel'),'Fontsize',figure_FontSize);%标签字体大小
%% 设定网格
set(AxE,'XGrid','on')
set(AxE,'YGrid','on')
%grid on;这个也能设置
%% 设定绘图线条
StA=get(AxE,'Children');
colour=colors(size(StA,1));%随机一组你喜欢的颜色
for i = 1:size(StA,1)
set(StA(i),'Color',colour(i,:)/256);
set(StA(i),'LineWidth',figure_LineWidth);
end
% set(H1(2),'Marker','x','MarkerIndices',maker_idx,'MarkerSize',plot_MarkerSize);
%% 直接打印图片
ax_pos = AxE.Position;
ti_pos = AxE.TightInset;
red_shape = [-ti_pos(1), -ti_pos(2), ax_pos(3)+ti_pos(1)+ti_pos(3), ax_pos(4)+ti_pos(2)+ti_pos(4)];
frame = getframe(AxE,red_shape);
im=frame2im(frame);
[imind,cm]=rgb2ind(im,500);
imwrite(imind,cm,'test.png','png');
%图片将保存在本工作目录下
上述函数并未写明所有的对象,所有对象可以通过:Figure->查看->属性检查器 获得其所有具体的内容。
该函数引用的colors
函数如下,其主要目的为自动化设置多个线条的颜色,防止眼花:
function color=colors(x)
%目前仅支持10以内 1 2 3 4 5 6 9
%x代表色板个数
%y代表第几个
load('Hex_color_storage.mat')
color=[];
color_group=colorss{x};
color_explicit=color_group(randi(size(color_group,1)),:);%随机选一组颜色
for i=1:x
color=[color;HEX2RGB(color_explicit(6*i-5:6*i))];
end
end
function [RGB]=HEX2RGB(HEX)
H=['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','0'];
for i=1:3
y(1)=find(H==HEX(2*i-1));
y(2)=find(H==HEX(2*i));
RGB(i)=y(1)*16+y(2);
end
end
上述函数引用的库'Hex_color_storage.mat'
可以自己从网上找喜欢的颜色,以下为本人的库作为参考
%colors
clear all
%% solo
colors1=['D2042D'
'000000'
'FFBF00'];
%% Duet
colors2=['69AB32F0E356'%OUTSIDE
'D2A02B2171A9'%OUTSIDE
'7DC5A0D58890'
'B96262809EBA'
'1A95D3D31275'];
%'BCD49BF8EFAF'%INSIDE 'F5E19999BCD8'%INSIDE 这两个颜色比较淡,适合与OUTSIDE标记的混合使用
%% Trio
colors3=['F2AE336B6AA564ADD9'
'765EA34F6AAAF0A699'
'D28019796FA46FAEDE'
'189C5073297F20A4D9'
'2A7DC1E36D24237B7B'];
%% Quartet
colors4=['F7C49698CE98BEB0D1F6F3A3'
'501B86318C9A98AB20DE9B12'
'814E92F5BB3DE67B50FDEDD2'
'9747235892C866328FF3BA19'
'38AE36DB9D595B95CFE83F43' %OUTSIDE
'BEDB96FAD2AA99C4E9E69594'];%INSIDE
%% Quintet
colors5=['4C94BDE3AD52EAE27085C2E4D29BC4'
'119882395281E8957B9288BBE79E41'];
%% Sextet
colors6=['BB4F4F2A69B374B38F9B76B2B9952327B5AF'];
%% Septet
colors7=[];
%% Octet
colors8=[];
%% Nonet
colors9=['DF605E9EBB6563B8B85579B5F6B56A794B21DCBD9BE8CC32BE752D'];
%% Function
colorss={colors1,colors2,colors3,colors4,colors5,colors6,colors7,colors8,colors9};
save ('Hex_color_storage.mat','colorss')
以下为一个实例:
1.随机选取一个图片,将其停靠在matlab工作区
2.运行函数,获取结果
标准化后如上图所示
一些常见报错:
1.由于默认画图比例比较大,如果画图的框超过matlab限制,就会导致尺寸设置失败,这一部分可以通过自行设置图形大小解决
类似于上面这种,解决办法也可以是把下面命令行往下拉
错误使用 getframe>calculateOffsetRect
指定矩形未完全包含在此图窗中。MATLAB 不再支持此功能。
出错 getframe (第 67 行)
[offsetRect, scaledOffsetRect, includeDecorations] = calculateOffsetRect(h, parentFig, offsetRect, offsetRectSpecified);
出错 plot_fully_set (第 106 行)
frame = getframe(AxE,red_shape);
引用与参考文献:
[1]位置设置与输出PNG代码(https://zhuanlan.zhihu.com/p/576086055)
[2]色彩与HEX转RGB代码(https://www.bilibili.com/video/BV1ds4y1X7WW/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=e1dc1952ad242350349ac4cd251f8a63)