本文对matlab中利用图形句柄对图片属性进行设置的操作进行简单的总结说明:
(1)对图窗和坐标轴属性进行整体设置
可以通过gcf和gca语句获取当前图窗句柄和坐标轴句柄,通过该句柄可以对图窗和坐标轴的各项属性进行操作。图窗和坐标轴分别包含如下属性:
% 图窗属性
... ...
Children: [1×1 Axes] Color: [0.9400 0.9400 0.9400]
Colormap: [256×3 double] CurrentAxes: [1×1 Axes]
... ...
InnerPosition: [680 558 560 420] PaperUnits: \'centimeters\'
OuterPosition: [672 550 576 514] Position: [680 558 560 420]
Units: \'pixels\'
% 坐标轴属性
... ...
Box: \'on\' BoxStyle: \'back\'
Children: [1×1 Line] Color: [1 1 1]
FontAngle: \'normal\' FontName: \'Helvetica\'
FontSize: 10 FontSizeMode: \'auto\'
FontSmoothing: \'on\' FontUnits: \'points\'
FontWeight: \'normal\' GridColor: [0.1500 0.1500 0.1500]
GridLineStyle: \'-\' Legend: [0×0 GraphicsPlaceholder]
LineWidth: 0.5000 OuterPosition: [0 0 1 1]
Parent: [1×1 Figure] Position: [0.1300 0.1100 0.7750 0.8150]
Title: [1×1 Text] TitleFontWeight: \'normal\'
Units: \'normalized\' UserData: []
View: [0 90] Visible: \'on\'
... ...
XAxis: [1×1 NumericRuler] XAxisLocation: \'bottom\'
XColor: [0.1500 0.1500 0.1500] XColorMode: \'auto\'
XDir: \'normal\' XGrid: \'off\'
XLabel: [1×1 Text] XLim: [0 100]
XScale: \'linear\' XTick: [0 10 20 30 40 50 60 70 80 90 100]
XTickLabel: {11×1 cell} XTickLabelRotation: 0
YAxis: [1×1 NumericRuler] YColor: [0.1500 0.1500 0.1500]
YGrid: \'off\' YLabel: [1×1 Text]
YLim: [0 100] YScale: \'linear\'
YTick: [0 10 20 30 40 50 60 70 80 90 100] YTickLabel: {11×1 cell}
YTickLabelRotation: 0 ZLabel: [1×1 Text]
ZLim: [-1 1] ZScale: \'linear\'
ZTick: [-1 0 1] ZTickLabel: \'\'
ZTickLabelRotation: 0
... ...
上面仅仅是展示了图窗和坐标轴部分重要且常用的属性,它们的全部属性可通过查matlab的帮助文档或直接在matlab的命令行上输入gcf、gca或通过如下图所示的属性窗口进行查询和设置。
对于图窗和坐标的每一个属性除了通过下图的属性设置窗口进行查询和设置以外,还可以通过函数get来获取其相关信息,通过函数set来设置其具体属性,如get(gcf,\'Position\')表示获取当前图窗的位置属性,set(gcf,\'Position\',[680 558 560 420])表示将当前图窗的位置和大小信息设置为[680 558 560 420]。对窗口句柄或坐标轴句柄进行直接操作可实现窗口或坐标轴某个属性或全部属性的统一设置,如上述set(gcf,\'Position\',[680 558 560 420])是只对窗口大小和位置这个属性进行了设置,而set(gca,\'FontName\',\'Euclid\',\'Units\',\'points\',\'FontSize\',8)是将坐标轴所有组成部分的字体设置成一样(包括XLabel、YLabel、ZLabel、XTickLabel、YTickLabel、ZTickLabel等)。
(2)对图窗或坐标轴中某个属性的单独设置
图窗或坐标轴的某个属性下面可能还包含很多属性,就像一棵大树,树干长出很多粗壮的枝丫,每个枝丫上面又会分出很多更小的枝丫,如坐标轴里面的XLabel属性中还包含以下属性
... ...
Color: [0.1500 0.1500 0.1500] EdgeColor: \'none\'
FontAngle: \'normal\' FontName: \'Helvetica\'
FontSize: 11 FontUnits: \'points\'
FontWeight: \'normal\' HorizontalAlignment: \'center\'
LineStyle: \'-\' LineWidth: 0.5000
Rotation: 0 String: \'我生活\'
... ...
此时可以首先通过父句柄获取得到子句柄,再利用子句柄对每个属性进行更精细的设置,如h=get(gca,\'XLabel\')利用坐标轴句柄获取到了子句柄XLabel的句柄,str=get(h,\'String\')则通过XLabel句柄获取了它的String属性的信息,set(h,\'String\',\'中国\')通过XLabel句柄设置了String的信息。
(3)举例说明
《电子与信息学报》要求的图形格式如下:
% 设置图片大小
set(gcf,\'Units\',\'centimeters\'); %将图窗单位设置为cm
set(gcf,\'Position\',[10 10 5.4 4.5]); %设置图窗大小和位置
set(gca,\'Units\',\'centimeters\'); %将坐标轴单位设置归一化单位(具体含义后面介绍)
set(gca,\'Position\',[1.0 0.9 4 4*4.8/5.8]);%设置坐标轴的位置和大小
% 设置坐标轴和坐标刻度的字体
set(gca,\'FontName\',\'Euclid\',\'FontUnits\',\'points\',\'FontSize\',8);%TickLabel的字体属性只能通过gca来设置
xLabelH=get(gca,\'XLabel\'); %获取XLabel句柄
set(xLabelH,\'FontUnits\',\'points\',\'FontSize\',8); %设置XLabel字体单位和大小
set(xLabelH,\'String\',\'\fontname{宋体}距离\fontname{Euclid}(m/s)\');%设置XLabel字符串
yLabelH=get(gca,\'YLabel\'); %获取YLabel句柄
set(yLabelH,\'FontUnits\',\'points\',\'FontSize\',8); %设置YLabel字体单位和大小
set(yLabelH,\'String\',\'\fontname{宋体}速度\fontname{Euclid}(m/s)\');%设置YLabel字符串
led=legend(\'data\',\'FontName\',\'Euclid\',\'FontSize\',8,\'Location\',\'best\');
led.ItemTokenSize=[10,6]; %设置legend里面图标的长度
legend boxoff;
lineH=get(gca,\'Children\'); %获取图形中线的句柄
set(lineH,\'LineWidth\',1);
print(gcf,\'test\',\'-dpng\',\'-r600\'); %将图片保存
属性设置前后的图像如下图所示:
对上面代码中值得注意的地方进行简要分析:
(a) 格式要求中涉及到多种不同单位,如pt(points),px(pixels)、cm(centimeters)等,所以需要根据要求设置图窗或坐标轴中对应属性的单位;
(b) 图窗和坐标轴的大小和位置通常通过\'Position\'属性来设置,\'Position\'属性输入参数的格式为[left bottom width height],其中left、bottom表示操作对象左下角坐标相对于其父窗口的位置关系(图窗的父窗口为电脑桌面,坐标轴的父窗口为图窗),width、height则表示操作对象本身的尺寸,具体示意图如下:
(c) TickLabel的并没有自己的句柄,因此只能通过坐标轴句柄进行整体设置,而不能对XTickLabel、YTickLabel进行单独的属性设置;
(d) 在Label或legend的字符串中经常会出现中文字符和英文字符混合的情况,比如物理量和单位的组合\'距离(km)\',这时候可能要求对其中的中文和英文字体进行分开设置,可以通过类似下面的方式进行实现set(xLabelH,\'String\',\'\fontname{宋体}中文部分\fontname{Euclid}English part\'),需要注意的是,其中的fontname不能写成FontName;
(e) legend里面的图标的尺寸可以通过ItemTokenSize属性进行设置;
(f) 可以通过print函数保存指定分辨率的图像。
请发表评论