首先介绍对图表局部进行修改。修改局部图形元素的属性,首先需要获取到对应的图形元素。本节介绍怎样获取到图表中的点、线、面和文本等基本图形元素并进行属性修改。
获取和修改图表中的序列
下面介绍跟图表有关的两个重要概念,即序列和分组。如图1-1所示的复合线形图中,兰色、红色和橙黄色折线分别由3个点连接而成,它们构成3个序列,如图例中所示。3条折线上与同一个x值如1,2,3对应的3个点组成一个分组。同样,右图所示的复合柱状图中,3种颜色的柱形分别构成3个序列,而相邻的3种颜色的柱形构成1个分组,该图中有3个序列和3个分组。
图1-1 二维图表中的序列和分组
对于三维的情况,如图1-2所示的三维柱状图中,左图中的黄色柱体构成一个序列,右图中的黄色柱体构成一个分组。
图1-2 三维图表中的序列和分组
可以通过对图表对象进行索引获取图表中的序列并修改它的属性。
下面的代码利用给定数据绘制复合柱状图。在命令窗口键入:
>> A=magic(3)*10;
>> tiledlayout(2,2);
>> nexttile
>> h1=plot(A,'LineWidth',1.5);
>> h1
3×1 Line 数组:
Line
Line
Line
可见,返回的是一个3×1的Line数组,每一组Line表示图表中的一个序列。将第2个序列的线型修改为虚线,标记设置为星号。
>> h1(2).LineStyle="--";
>> h1(2).Marker="*";
>> legend('序列1','序列2','序列327;,'Location','northeastoutside') %图例
用同样的数据绘制复合柱状图。
>> nexttile
>> h2=bar(A);
h2=
1×3 Bar 数组:
Bar Bar Bar
可见,返回的是一个1×3的Bar数组,每一组Bar表示图表中的一个序列。将第2个序列中面的颜色修改为绿色,边线的宽度修改为2磅。
>> h2(2).FaceColor='g';
>> h2(2).LineWidth=2;
>> legend('序列1','序列2','序列3','Location','northeastoutside')
修改完成后的图表如图1-3所示。试与图1-1比较。
图1-3 修改复合图表中的序列
获取和修改图表序列中的点
图1-3中同一序列中有3个柱形,这3个柱形称为序列中的点。有时候需要对其中某一个柱形,即某一个点进行设置。所以先要获取这个点,然后修改它的属性。注意,这里讲的点不是几何意义上的点,而是指数据点,它可以用不同的几何形状来表示,比如一个点标记、一个柱形或者其他的。
下面的代码将图1-1复合线形图中第2个序列中的第2个点的标记类型修改为倒三角形,将复合柱状图中第2个序列中的第2个点(柱形表示)的颜色设置为兰色。
tiledlayout(2,2);
A=magic(3)*10;
nexttile
h1=plot(A,'LineWidth',1.5); %绘制复合线形图
h1(2).MarkerIndices=2; %序列2中的第2个点标记
h1(2).Marker='v'; %设置该点标记的标记类型
h1(2).MarkerSize=10; %设置该点标记的大小
legend('序列1','序列2','序列3','Location','northeastoutside')
nexttile
h2=bar(A); %绘制复合柱状图
h2(2).CData(2,:)=[0 0.8 0.8]; %设置序列2中第2个柱形的颜色
h2(2).FaceColor='flat'; %设置该柱形中面的着色方式为刻面着色
legend('序列1','序列2','序列3','Location','northeastoutside')
设置效果如图1-4所示。
图1-4 修改序列中的点
获取图元控制点的坐标
采用类似1.1.1和1.1.2两个小节介绍的方法,可以获取到MATLAB图表中的任意一个基本图形元素并进行修改。所以,美化MATLAB图表,从技术上讲已经没有问题了,剩下的就是审美问题,考验你的艺术细胞。这个从下一节开始介绍。
有的时候,我们不仅仅满足于在原有图表的基础上进行修改,还想将图表中的基本图形元素替换掉。比如将柱状图中的矩形替换成三角形。这时候可以获取到矩形图形元素后将它们隐藏,然后根据它们的尺寸大小绘制三角形。所以,需要获取图表中要替换的图形元素的尺寸大小,该尺寸大小由图形元素的控制点的坐标确定。比如矩形的尺寸大小由该矩形4个顶点的坐标确定。
下面的代码绘制一个简单柱状图,获取第一个柱形以及它4个顶点的坐标。在MATLAB命令窗口输入:
>> data=[1 5 3 7 6];
>> b=bar(data); %绘制柱状图
>> x=b(1).XData(1); %第1个序列第1个点的x坐标,中心位置
>> w=b(1).BarWidth; %柱形的宽度
>> xb=x-w/2; %柱形左边对应的x坐标
>> xe=x+w/2; %柱形右边对应的x坐标
>> h=b(1).YData(1) %第1个序列第1个柱形的y坐标
>> disp('第1个柱形的顶点:')
第1个柱形的顶点:
>> vert=[xb 0;xe 0;xe h;xb h] %第1个序列第1个柱形4个顶点的坐标
vert =
0.6000 0
1.4000 0
1.4000 1.0000
0.6000 1.0000
>> dx=[xb,xe,xe,xb];
>> dy=[0,0,h,h];
>> hold on
>> h2=plot(dx,dy,7;or'); %用红色圆点绘制4个顶点
>> h2(1).LineWidth=2;
>> hold off
生成的图表如图1-5所示。
图1-5 获取柱状图中第1个柱形的顶点坐标并标示
修改点的属性
这里的点主要指图表中的点标记。与点有关的属性包括Marker, MarkerSize,MarkerFaceColor, MarkerEdgeColor, MarkerIndices, FaceVertexCData, FaceVertexAlphaData等,分别表示点标记的类型、大小、内部填充区域的颜色、边线的颜色、在序列中的编号、面片顶点的颜色和面片顶点的透明度等。点标记的类型如表1-1所示。
表1-1 点的标记类型
| 标 记 | 说 明 | 演示 | 标 记 | 说 明 | 演示 |
|---|---|---|---|---|---|
| o | 圆圈 | ^ | 上三角 | ||
| + | 十字丝 | v | 下三角 | ||
| * | 星号 | > | 右三角 | ||
| . | 点 | < | 左三角 | ||
| x | 叉号 | p | 五角形 | ||
| s | 方形 | h | 六角形 | ||
| d | 菱形 |
下面的代码绘制复合线形图和散点图,并在两个图表中分别获取点图形元素并修改它们的属性。
tiledlayout(2,2);
A=rand(5,3)*10;
B=randn(50,3);
ax1=nexttile; %在第1个坐标系中绘制复合线形图
h1=plot(ax1,A,'LineWidth',1.5); %绘复合线形图
h1(1).Marker="o"; %设置第1个序列的点标记类型为圆
h1(2).Marker="*"; %设置第2个序列的点标记类型为星号
h1(3).Marker="d"; %设置第3个序列的点标记类型为菱形
h1(1).MarkerSize=6; %设置第1个序列的点标记的大小为6
h1(2).MarkerSize=6; %设置第2个序列的点标记的大小为6
h1(3).MarkerSize=6; %设置第3个序列的点标记的大小为6
h1(1).MarkerFaceColor='y'; %设置第1个序列的点标记面的颜色为黄色
h1(3).MarkerFaceColor="b"; %设置第3个序列的点标记面的颜色为兰色
h1(1).MarkerEdgeColor='r'; %设置第1个序列的点标记边的颜色为红色
h1(3).MarkerEdgeColor="none"; %设置第3个序列的点标记边的颜色为无色
grid on
ax1.XLim=[0,6];
ax1.YLim=[0,max(max(A))+1];
legend('Location','northeastoutside')
ax2=nexttile; %在第2个坐标系中绘制散点图
h2=scatter(ax2,B(:,1),B(:,2)); %绘散点图1
h2.Marker='o'; %设置标记类型
h2.MarkerFaceColor='b'; %设置标记面的颜色
h2.SizeData=12; %设置标记大小
hold on
h3=scatter(ax2,B(:,1),B(:,3)); %绘散点图2
h3.Marker='*'; %标记类型为星号
h3.SizeData=12; %标记大小
hold off
ax2.XLim=[min(B(:,1))-1,max(B(:,1))+1];
ax2.YLim=[min(min(B(:,2:3)))-0.5,max(max(B(:,2:3)))+0.5];
legend('Location','northeastoutside')
box on
运行代码生成图1-6。
图1-6 获取和设置点的属性
修改线的属性
图表中的线形图形元素包括直线段、面的边线、点标记的边线、坐标轴、坐标轴刻度线、标注线、网格线等。获取到线形图形元素后,可以修改它们的属性。线形图形元素的常见属性包括Color, LineStyle, LineWidth, EdgeColor等,分别表示线的颜色、线型、线宽和边线颜色等。线型的类型如表1-2所示。
表1-2 线型分类
| 线 型 | 说 明 | 演 示 |
|---|---|---|
| - | 实线(默认) | |
| -- | 虚线 | |
| : | 点线 | |
| -. | 点虚线 |
下面的代码绘制复合线形图和复合柱状图,并分别获取其中的线形图形元素,修改它们的属性。
tiledlayout(2,2);
A=rand(4,4)*10;
B=rand(2,3)*10;
ax1=nexttile; %在第1个坐标系中绘制复合线形图
h1=plot(ax1,A,'LineWidth',1.5); %绘复合线形图
h1(1).LineStyle='-'; %设置序列1的线型为实线
h1(2).LineStyle='--'; %设置序列2的线型为虚线
h1(3).LineStyle=':'; %设置序列3的线型为点线
h1(4).LineStyle='-.'; %设置序列4的线型为点虚线
grid on
legend('Location','northeastoutside')
ax2=nexttile; %在第1个坐标系中绘制复合柱状图
h2=bar(ax2,B,'FaceAlpha',0.5); %绘复合柱状图
h2(1).EdgeColor='r'; %设置序列1的边线颜色为红色
h2(1).LineWidth=1.5; %设置序列1的边线线宽为1.5
h2(2).LineStyle='--'; %设置序列2的边线线型为虚线
h2(3).LineStyle=':'; %设置序列3的边线线型为点线
legend('Location','northeastoutside')
box on
运行代码生成图1-7。
图1-6 获取和设置线的属性
可以用Linestyleorder函数快速设置线形对象的线型。下面的代码绘制复合线形图,用linestyles数组定义一组线型,作为参数赋给linestyleorder函数。绘图时plot函数会按照先后顺序循环取用linestyles数组中的线型进行设置。
A=rand(4,4)*10;
linestyles=["-","--",":","-."]; %定义线型序列
linestyleorder(linestyles) %使用自定义线型序列
h1=plot(A,'LineWidth',1.5);
修改面的属性
图表中常见的面包括柱状图、条形图中的矩形面、面积图、饼图、箱形图中的面、绘图区、标记内部填充区域、图例所在矩形区域等。获取到面对象后,可以修改它们的属性,包括FaceColor, FaceAlpha, MarkerFaceColor等,分别表示面的颜色、透明度和点标记内部的填充色等。1.2节和1.3节将详细介绍面的属性的修改。
修改文本的属性
图表中的文本主要包括标题、坐标轴标签、刻度标签、数据标签、图例标签和标注文本等。文本对象的属性包括字体相关的属性、文本内容、对齐方式等。
3.4节详细介绍了坐标系标题、坐标轴标签和刻度标签的修改。