用低级函数创建基本图元

前面几章使用了plot,bar,surf等函数来创建MATLAB图表,这些函数称为高级绘图函数。本节介绍创建基本图形元素的函数,称为低级函数,包括line,rectangle,patch,surface,image,text等函数。使用低级函数绘图的效率更高。基本的图形元素包括直线、多义线、圆、多边形、曲面、图像和文本等。

创建点

MATLAB中的点常常用点标记表示,实际上是一个组合图形。比如圆、三角形、棱形、五角星等,有填充面,有边线。也可以用球面表示三维点。可以用低级函数自定义点,也可以直接用高级函数绘制点。

MATLAB中可以用plot函数和plot3函数绘制二维和三维点。下面的代码在三维坐标系中绘制一个二维点和一个三维点,标记分别为“*”和“o”。在二维坐标系中创建一个实心圆表示的点,修改实心圆的填充色和边线的颜色。

code.matlab
tiledlayout(2,2);
nexttile
x = 1;
y = 2;
plot(x, y,'*');    %用plot函数绘制点
hold on
z = 3;
plot3(x,y,z,'o');    %用plot3函数绘制三维点
view(3)
hold off
nexttile
h=plot(1,2,'o');    %绘制点
h.LineWidth=2;    %设置点的属性,点标记的边线宽度
h.MarkerSize=10;    %点标记的大小
h.MarkerEdgeColor='r';    %点标记边线的颜色
h.MarkerFaceColor=[0,0.8,0];    %点标记的填充色

运行代码生成图2-1。

Document Image
\[\]

图2-1 生成点

也可以用scatter函数和scatter3函数创建二维点和三维点。2.2.1小节会介绍用球面表示三维点。

创建直线段、多义线和曲线

MATLAB中的直线段和多义线用Line对象表示。用line函数创建Line对象。按照直线逼近的思路,还可以用该函数创建曲线。直线段的属性包括线型、颜色、线宽、点标记等,可以参照1.1节进行设置。下面结合几个例子介绍line函数的使用。

首先创建一条直线段,指定起点和终点,设置颜色、线型和线宽。再创建一条多义线,指定多义线各顶点的坐标,设置多义线的颜色、线宽、标记类型、标记面的颜色和边线的颜色,以及标记的大小。

code.matlab
tiledlayout(2,2);
nexttile
X=[1 12];
Y=[3 9];
line(X,Y,'Color','r','LineStyle', '-.','LineWidth',1.5)    %绘制直线段
box on
grid on
nexttile
X2=[1 9 20 28];
Y2=[1 25 10 32];
%绘制折线
line(X2,Y2,'Color','b','LineWidth',1.5 ,'Marker','d',...
    'MarkerFaceColor','y','MarkerEdgeColor','r','MarkerSize',9)
box on
grid on

运行代码生成图2-2。

Document Image
\[\]

图2-2 直线段

如果line函数中的位置参数为矩阵,则可以同时生成多条直线段或多义线。下面的代码在两个坐标系中分别绘制复合线形图,分别用颜色和线型区分各自坐标系中的序列。

code.matlab
tiledlayout(2,2);
X3=[1 1 1;10 10 10;20 20 20];    %矩阵数据
Y3=[2 5 8;12 15 18;22 25 28];
ax1=nexttile;
colororder(ax1,'meadow')    %定义颜色序列
line(X3,Y3,'LineWidth';,1.5)    %绘制复合线形图
box on
grid on
ax2=nexttile;
linestyleorder(ax2,["-","--",":"])    %定义线型序列
line(X3,Y3,'LineWidth';,1.5)    %绘制复合线形图
box on
grid on

运行代码生成图2-3。

Document Image
\[\]

图2-3 多条多义线

下面用多条直线段逼近余弦曲线,用下面的代码将[0,2π]范围内的余弦曲线用有11个顶点的多义线表示:

code.matlab
tiledlayout(2,2);
ax1=nexttile;
t=0:pi/5:2*pi;
line(t,sin(t),'LineWidth';,1.5)    %用10根直线段逼近正弦曲线
box on
grid on
ax2=nexttile;
t=0:pi/20:2*pi;
line(t,sin(t),'LineWidth';,1.5)    %用40根直线段逼近正弦曲线
box on
grid on

运行代码生成图2-4。左图和右图分别为10等分和40等分区间生成的余弦曲线,后者平滑了很多。

Document Image
\[\]

图2-4 用精度更高的多义线逼近余弦曲线

用line函数还可以绘制三维直线段和曲线。下面的代码在两个坐标系中分别绘制三维多义线和参数函数定义的三维曲线。

code.matlab
tiledlayout(2,2);
ax1=nexttile;
x=rand(4,3,3)*10;
colororder(ax1,'gem')
line(x(:,:,1),x(:,:,2),x(:,:,3),'LineWidth';,1.5)    %三维直线段
view(3)
box on
grid on
ax2=nexttile;
t = linspace(0,10*pi,200);
x = sin(t);
y = cos(t);
z = t;
line(x,y,z,'LineWidth';,1.5)    %三维曲线
view(3)
box on
grid on

运行代码生成图2-5。

Document Image
\[\]

图2-5 生成三维曲线

创建矩形、圆角矩形、椭圆、圆及对应的区域图形

MATLAB中,矩形、圆角矩形、椭圆、圆及对应的区域图形都用Rectangle对象表示。用rectangle函数可以创建Rectangle对象。

矩形或矩形区域的属性包括线型(LineStyle)、线宽(LineWidth)、内部颜色(ForeColor)、边线颜色(EdgeColor)等,可以参照1.1节进行设置。下面结合两个实例进行介绍:

下面的代码在同一个坐标系中创建线形图形矩形、圆角矩形、椭圆和圆各一个,使用了不同的线型和线宽。在另一个坐标系中绘制圆角矩形区域和圆形区域各一个。

code.matlab
tiledlayout(2,2);
ax1=nexttile;
%绘制矩形
rectangle('Position',[1,1,20,10], 'LineWidth',3,'EdgeColor','m');
%绘制椭圆形
rectangle('Position',[5,3,10,15], 'Curvature',[1 1],'EdgeColor','g');
%绘制圆
rectangle('Position',[5,3,10,10], 'Curvature',[1 1], 'LineWidth',3,'EdgeColor','b');
%绘制圆角矩形
rectangle('Position',[4,5,12,8], 'Curvature',.4,'LineStyle', '--','EdgeColor','c');
axis equal
box on
ax2=nexttile;
%绘制圆角矩形区域
rectangle('Position',[3,7,20,8], 'Curvature',[.3 .4], 'FaceColor', 'g');
%绘制圆形区域
rectangle('Position',[5,3,10,10], 'Curvature',[1 1], 'LineWidth',3, 'FaceColor', 'r');
axis equal
box on

运行代码生成图2-6。

Document Image
\[\]

图2-6 生成矩形、圆角矩形、椭圆和圆和对应区域

创建面片

1.2.7小节详细介绍了MATLAB中面片的创建,这里不再赘述。下面的代码用面片生成颜色渐变的曲线。

code.matlab
x=linspace(1,10,15);
y=cos(x);
y(end)=NaN;
c=y;    %用y值着色
patch(x,y,c,'EdgeColor','interp','LineWidth',2,...
    'Marker','o','MarkerFaceColor','flat');
colormap jet
colorbar

运行代码生成图2-7。

Document Image Document Image
\[\]

图2-7 渐变色曲线 图2-8 用surface函数绘曲面图

曲面

MATLAB中,Surface对象是由四边形小面组成的规则网格模型。网格模型有线框模型、刻面模型和曲面模型等几种。使用surface函数创建Surface对象。

下面用surface函数绘制规则网格曲面,不显示边线,添加光照。

code.matlab
[x,y,z]=peaks(30);
h=surface(x,y,z);    %绘制曲面
h.EdgeColor='none';    %删除网格线
colormap jet    %设置颜色查找表为jet表
view(3)    %三维视图
camlight    %添加光照
grid on
box on

生成图2-8。

图像

用image函数处理图像。下面的代码在两个坐标系中创建图像。第一个坐标系中直接用矩阵数据定义颜色创建图像;第二个坐标系中通过导入图像文件创建图像。

code.matlab
tiledlayout(2,2);
ax1=nexttile;
x=[1 4];
y=[6 9];
C=[1 25 50 75; 100 125 150 175; 200 225 250 300];     %定义矩阵
image(x,y,C)     %用矩阵元素的值着色
ax2=nexttile;
C=imread('d:\pic.jpg');    %读取图片文件,获取像素颜色矩阵
image(C)    %用矩阵元素的值着色

运行代码生成图2-9。

Document Image
\[\]

图2-9 创建图像

文本

文本用Text对象表示,该对象由text函数创建,text函数是创建文本图形对象的低级函数。使用它将文本字符串放在指定的位置上。使用text函数还可以在三维图形中添加文本标注,可以用参数-值匹配对的方式在创建文本标注时设置文本属性,如字体名称、字体大小等。也可以用text函数创建文本时返回句柄,用句柄对象点引用的方式设置文本属性。

下面的代码在两个坐标系中分别创建二维线形图和三维曲面图,并分别添加文本标注。

code.matlab
tiledlayout(2,2);
ax1=nexttile;
ax1.XLim=[0 2*pi];
ax1.YLim=[-1 4];
x=0:pi/20:2*pi;
y=sin(x);
line(x,y,'LineWidth',1.5)
text(pi,0,'\leftarrow sin(\pi)')    %添加文本标注
text(1,2, '添加文本1');
text(1,3, '添加文本2', 'FontSize',20, 'FontAngle', 'Italic');
box on
nexttile;
h3=surfl(peaks);
h3.EdgeColor='none';
shading interp
text(25,37,8,'Welcome to 8848')    %在三维图中添加文本标注

运行代码生成图2-10。

Document Image
\[\]

图2-10 在图中添加文本标注