从gcf和gca说起
不论是 Python 绘图还是Matlab绘图,想要获得更好看的图,都会用到这两个单词。
gcf:get current figure,是目标图像的图形句柄对象
gca:get current axes,是目标图像的坐标轴句柄对象
Matlab 同样支持面向对象编程。在 Matlab 打开一个绘图窗口或画一张图后输入 gcf
和 gca
就会获得当前图像对象或当前坐标轴对象的属性。
事实上,当 MATLAB 创建一个绘图时,它会创建一系列的图形对象,有图窗、坐标区、线条、填充、文本和图例等等对象。
下面的例子有三个图形对象 —— 一个坐标区、一条线条和一个文本对象,使用可选输出参数可以存储所创建的图形对象。
x = -pi:pi/20:pi;
y = sin(x);
f = figure;
p = plot(x,y);
txt1 = text(0.2,0,'sin(x)');
所有图形对象均有可以查看和修改的属性,这些属性具有默认值。
若要访问图形对象的个别属性,请使用圆点表示法语法 object.PropertyName。例如,返回线条对象的 LineWidth 属性。
pcol = p.LineWidth
通过设置线条的 Color 属性将其颜色更改为红色。
p.Color = 'red';
通用函数get和set
当查看和修改对象的很多属性时,上面的方法就不适用了,Matlab 中有 get
和 set
函数用于获取对象的属性和设置对象的属性。
使用方法:
v = get(h)
:返回 h 标识的图形对象的所有属性和属性值, v 是一个结构体;
v = get(h,propertyName1,propertyName2,···)
:返回特定属性 propertyName1,propertyName2,··· 的值,使用时须用单引号将属性名引起来 ;
使用get
和set
函数时,MATLAB 识别一个属性时是不分大小写的。另外,只要用足够多的字符来唯一地辨识一个属性名即可。例如,坐标轴对象中的位置属性可以用 ‘Position’,‘position’,甚至是 ‘pos’ 来调用。
set(H,propertyName1,Value1,propertyName2,Value2,···)
:为 H 标识的对象指定其属性的值
s = set(H)
:返回 H 标识的对象的、可由用户设置的属性及其可能的值。
父类与子类
MATLAB 按一定的层次结构排列图形对象。层次结构的顶部是称为图形根的特殊对象。若要访问图形根,请使用 groot 函数。
groot 定义了 figure 可以用的最大 szie。groot 下面是 figure。figue 就是你画图的时候跳出来的那个新的对话窗口。如果 figure 变化,groot 是不会跟着变化的。但 groot 变化的话,figure 就要跟着变化了。
figure 下面是 axes,line,text,legend 等等。axes 是那个窗口 figure 里面你要画的东西。axes 的大小和位置取决于 figure,如果放大缩小 figure 的大小,里面的图像也会跟着变化的。
line,text,legend 等等就是你用指令在图上加的东西。
所有图形对象(除了根)均有一个父级。例如,坐标区的父级是一个图窗。
h.Parent
和 h.Children
可获得图形对象的父级和子级。例如下面这张图有八个子级—— 5 个坐标轴对象,2 个图例对象,1 个颜色条对象。
>> f.Children
ans =
8×1 graphics 数组:
Axes
Axes
Legend (data1)
Axes
Axes
ColorBar
Legend (data1, data2)
Axes (aaaa)
因为 figure 有多个子级,Children 属性的值是一个图形对象数组。要访问 figure 的个别子级,请对数组建立索引。然后,可以设置子级对象的属性。
t = f.Children(8); % get the 'aaaa' Axes object
t.FontWeight = 'bold'; % set the font to bold
t.Children; % view 'aaaa' Axes object's Children
ans =
2×1 Line 数组:
Line (data2)
Line (data1)
常用属性
当了解以上知识后,理论上,只要知道图形对象的各种属性就可以制作出想要的效果。事实上,当知道这些属性时,在 plot,text,legend···时加上这些参数也可以。
下面给出常用对象的常用属性表以及可选参数
figure 常用属性
‘Number’:图窗编号
‘Name’:图窗名字
‘Color’:背景颜色,指定为 RGB 三元组、十六进制颜色代码、颜色名称或短名称
‘Position’:可绘制区域的位置和大小,[left bottom width height]
‘Units’:测量单位,可选择’pixels’ (默认)| ‘normalized’ | ‘inches’ | ‘centimeters’ | ‘points’ | ‘characters’
‘MenuBar’:Figure 菜单栏显示方式,可选择’figure’ (默认)| ‘none’
‘ToolBar’:Figure 工具栏显示,可选择’auto’ (默认)| ‘figure’ | ‘none’
‘Resize’:图窗能否调整大小,‘on’ (默认)| ‘off’
axes 常用属性
‘FontName’:字体名称,可选支持的字体名称 | ‘FixedWidth’
‘FontWeight’:字符粗细,‘normal’ (默认)| ‘bold’
‘FontSize’:字体大小,数值标量
‘FontAngle’:字符倾斜,‘normal’(默认)| ‘italic’
‘XTick, YTick, ZTick’:刻度值,[](默认)| 由递增值组成的向量
‘XTickLabel, YTickLabel, ZTickLabel’:刻度标签,‘’(默认)| 字符向量元胞数组 | 字符串数组 | 分类数组
刻度值是坐标轴上显示刻度线的位置,刻度标签是你在每个刻度线旁边看到的标签。
‘XLim, YLim, ZLim’:最小和最大坐标轴范围,[0 1] (默认)| [min max] 形式的二元素向量
‘XAxisLocation’:x 轴位置,‘bottom’ (默认)| ‘top’ | ‘origin’
‘YAxisLocation’:y 轴位置,‘left’ (默认)| ‘right’ | ‘origin’
‘XGrid, YGrid, ZGrid’:网格线,‘off’ (默认)| on
‘GridLineStyle’:网格线的线型,‘-’ (默认)| ‘–’ | ‘:’ | ‘-.’ | ‘none’
‘GridColor’:网格线的颜色,[0.15 0.15 0.15] (默认)| RGB 三元组 | 十六进制颜色代码 | ‘r’ | ‘g’ | ‘b’ | …
‘Title’:标题的文本对象
‘Color’:背景色,[1 1 1] (默认)| RGB 三元组 | 十六进制颜色代码 | ‘r’ | ‘g’ | ‘b’ | …
‘LineWidth’:线条宽度,0.5 (默认)| 正数值
‘Box’:框轮廓,‘off’ (默认)| ‘on’
‘Position’:大小和位置,不包括标签边距,[0.1300 0.1100 0.7750 0.8150] (默认)| [left bottom width height] 形式的四元素向量
legend 常用属性
‘Location’:相对于坐标区的位置,‘north’ | ‘south’ | ‘east’ | ‘west’ | ‘northeast’ | …
‘Position’:自定义位置和大小,[left bottom width height] 形式的四元素向量
‘Orientation’:方向,‘vertical’ (默认)| ‘horizontal’
‘NumColumns’:列数,1 (默认)| 正整数
‘FontName’:字体名称,支持的字体名称 | ‘FixedWidth’
‘FontSize’:字体大小,大于 0 的标量值
‘Color’:背景色,[1 1 1] (默认)| RGB 三元组 | 十六进制颜色代码 | ‘r’ | ‘g’ | ‘b’ | …
‘EdgeColor’:框轮廓颜色,[0.15 0.15 0.15] (默认)| RGB 三元组 | 十六进制颜色代码 | ‘r’ | ‘g’ | ‘b’ | …
‘Box’:框轮廓的显示,‘on’ (默认)| ‘off’
‘LineWidth’:框轮廓的宽度,0.5 (默认)| 正值
line属性
‘Color’:线条颜色,[0 0 0] (默认)| RGB 三元组 | 十六进制颜色代码 | ‘r’ | ‘g’ | ‘b’ | …
‘LineStyle’:线型,‘-’ (默认)| ‘–’ | ‘:’ | ‘-.’ | ‘none’
‘LineWidth’:线条宽度,0.5 (默认)| 正值
‘Marker’:标记符号,‘none’ (默认)| ‘o’ | ‘+’ | ‘*’ | ‘.’ | …
‘MarkerIndices’:要显示标记的数据点的索引,1:length(YData) (默认)| 正整数向量 | 正整数标量
‘MarkerSize’:标记大小,6 (默认)| 正值
事实上,figure,axes,legend 都有 Position,FontName,Fontsize,Color 等属性,它们的意思是一样的,参数形式也是一样的,只是代表了这个对象的属性和那个对象的属性
Simulink 示波器
Simulink 示波器也是对象,使用如下指令就可以打开示波器的绘图菜单,进行绘图操作
shh = get(0,'ShowHiddenHandles');
set(0,'ShowHiddenHandles','On');
set(gcf,'menubar','figure');
set(gcf,'CloseRequestFcn','closereq');
set(gcf,'DefaultLineClipping','Off');
set(0,'ShowHiddenHandles',shh);
绘图例子
下面是绘制一个单列的图片代码示例
clear all
figure(2)
set(gcf,'unit','centimeters','position',[10 5 8.4 10]); % 设置窗口位置[10cm,5cm]和大小8.4cm*10cm
set(gcf,'ToolBar','none','ReSize','off'); % 移除工具栏,不可调整大小
set(gcf,'color','w'); % 背景设为白色
% 以上也可在 编辑->图窗属性->窗口外观和位置 设置
t=0:0.1:1;
y1=t;
y2=t.^2;
y3=t+0.1;
y4=t.^4+0.1;
subplot(2,1,1)
p1 = plot(t,y1,'b--','LineWidth',1.5);
hold on
p2 = plot(t,y2,'color',[0 0.81 0.82],'LineWidth',1.5);
set(gca,'Position',[0.14 0.52 0.83 0.33]);%第(1)个图的位置
g = get(p1,'Parent');%对应p1所在的坐标轴
set(g,'Linewidth',1.5,'FontSize',10,'FontName','Arial','FontWeight','bold');
ylabel('Error [m]','FontSize',10,'FontName','Arial','FontWeight','bold');
ylim([0,2])
%xlabel('t [s]','FontSize',10,'FontName','Arial','FontWeight','bold');
set(g,'XTick',[]); %隐藏X坐标轴
subplot(2,1,2)
p3 = plot(t,y3,'r--','LineWidth',1.5);
hold on
p4 = plot(t,y4,'color',[0 0.3 0.82],'LineWidth',1.5);
set(gca,'Position',[0.14 0.16 0.83 0.33]);%第(3)个图的位置
g = get(p4,'Parent');%对应p1所在的坐标轴
set(g,'Linewidth',1.5,'FontSize',10,'FontName','Arial','FontWeight','bold');
ylim([0,2])
ylabel('Error [m]','FontSize',10,'FontName','Arial','FontWeight','bold');
xlabel({'t [s]','(a)'},'FontSize',10,'FontName','Arial','FontWeight','bold'); %{}作为换行给图标号
h1=legend([p1 p2 p3 p4],'\fontname{Arial}y_1','\fontname{Arial}y_2','\fontname{Arial}y_3',...
'\fontname{Arial}y_4','Orientation','horizontal');
set(h1,'Linewidth',1.5,'FontSize',10,'FontWeight','bold');
set(h1,'position',[0.4,0.9,0.2,0.1]);%legend位置
set(h1,'Box','off');
当使用 Matlab 编写程序代码时,遇到行数较长的情况,如果不换行,将使得代码不易阅读,这时可以进行换行。但换行不是简单的用回车进行,需要增添 … ,表示连接下一行
导出SCI论文能用的图
先在渲染处设置一下 dpi,SCI 论文都要求 dpi 300 以上,再导出为 tiff 格式(SCI论文推荐用这个),这样得到的图片怎样放缩都不会模糊,用 Latex 写论文可导出为 pdf 或者 eps 格式。
也可以指令导出,print(figure_handle,fileformat,'-r300',filename)
,其中的四个参数:
a、figure_handle: 图形句柄
b、fileformat:单引号字符串,指定存储格式:
png 格式: ‘-dpng’
jpeg 格式:‘-djpeg’
tiff 格式: ‘-dtiff’
pdf 格式: ‘-dpdf’
bmp 格式: ‘-dbitmap’
gif 格式:‘-dgif’
emf 无损格式:‘-dmeta’
c、‘-r300’:期望 dpi 300
d、 filename:文件名,可带路径,不设置就存当前文件夹。