• MATLAB(5)绘图


           MATLAB图形绘制功能十分强大(毕竟绘图也是数据处理的一种),除了最基本的线图、直方图、饼图外,MATLAB还支持动态添加数据的动图以及通过像素点显示完整的图片,如下图所示。本文仅介绍最基本也是最常用的线图、动画等相关函数的使用,其它如曲面图、数据分布图可参考MATLAB绘图函数

    在这里插入图片描述

    线图

           线图,即描点画像,通过变量存储各个点的坐标后,通过函数plot(绘制二维图形)或plot3(绘制三维图形)连接各个点并显示在Figure界面上。当然,这只是最简单,最基础的部分,一般来说会添加其它内容,比如:

    1. 设置连接线的线型(实线、虚线、点线等)、颜色、数据点的标记符号:添加plot参数
    2. 设置 连接线的线宽及标记点的 大小、颜色:通过 Name,Value 对组指定
    3. 设置绘图位置:通过 figure、tiledlayout等设置
    4. 保持线图不被覆盖:hold on,此时继续绘图会重叠在原有的图上面。
    5. 为当前图窗设置标题、坐标轴:通过title、axis函数设置

    当然,这些有的是各种图形通用的,比如3、4、5点。

    MATLAB绘制图形是在当前图窗绘制的,包括设置线型、标题等都是。

    plot

           plot函数用于绘制二维线图,基本格式如下面代码中的第1行所示,X和Y建议是一维数组,但如果是两个多维数组(必须维数相同,形成和列数相同数量的线条)或1个一维数组和1个多维数组也可以,但强烈建议一维数组,防止出现奇奇怪怪的情况。

           除了通过两个多维数组以一次性绘制多条曲线外,还可以如下面代码中的第2行所示,在一个图形内绘制n条线。(重复plot函数会导致之前的数据被覆盖,除非使用hold on

    plot(X,Y)
    plot(X1,Y1,X2,Y2,……,Xn,Yn)
    
    • 1
    • 2

           plot函数也可以只使用一个参数以创建线图:

    plot(X)
    %X为一维实数数组:横坐标为数据下标( 1 至 length(X)),纵坐标为数组对应值
    %       虚数      横坐标为数组对应值的实数部分,纵坐标为数组对应值的虚数部分
    %X为二维数组:绘制数量等于列数的线条,并以行号为横坐标,数组对应值为纵坐标
    %       虚数                            数组对应值的实数部分,数组对应值的虚数部分纵
    
    • 1
    • 2
    • 3
    • 4
    • 5

    线型、线段颜色及标记

           线型、颜色及标记通过向plot添加一个字符串参数实现设置,如下所示,LineSpec为字符串,该字符串由分别代表线型、颜色及标记三种字符串构成,例如‘–’代表虚线,'r’代表颜色为红色,'x’代表标记为叉号,那么‘–rx’就是带有叉号标记的红色虚线,当然顺序不固定,'r–x’效果一致。

    plot(X,Y,LineSpec)
    plot(X1,Y1,LineSpec1,X2,Y2,LineSpec2,……,Xn,Yn,LineSpecn)
    
    • 1
    • 2

           参考代码及对应图如下:

    在这里插入图片描述
           线性、颜色、标记对应的字符串如下所示:

    线型说明
    -实线(默认)
    虚线
    :点线
    -.点划线
    标记说明
    o圆圈
    +加号
    *星号
    .
    x叉号
    s方形
    d菱形
    ^上三角
    v下三角
    >右三角
    <左三角
    p五角形
    h六角形
    颜色说明
    y黄色
    m品红色
    c青蓝色
    r红色
    g绿色
    b蓝色
    w白色
    k黑色

    线宽、标记点大小及颜色

           线宽、标记点大小及颜色的设置是通过向plot添加对应的Name(属性),Value (值)对组指定,如下所示。

    plot(x,y,'--gs',...   %...是MATLAB用于连接两行语句,可以理解为和后面的换行符抵消,使两行 代码表示一个语句
        'LineWidth',2,...                 %Name为LineWidth,表示设置线宽
        'MarkerSize',10,...               %Name为MarkerSize,表示设置标记点大小
        'MarkerEdgeColor','b',...         %Name为MarkerEdgeColor,表示设置标记点边缘颜色,这里通过字符串设置
        'MarkerFaceColor',[0.2,0.5,0.3])  %Name为MarkerFaceColor,表示设置标记点中心颜色,这里通过0~1的RGB值设置
    
    • 1
    • 2
    • 3
    • 4
    • 5

           对应产生的线图如下图所示。
    在这里插入图片描述
           除了上述的Name外,还有其它属性,可参考Line属性

           除了在绘制时设置属性外,绘制完也可以修改线条的相应属性,如以下代码所示,在绘制时获取线条对象,并修改颜色为红色。

    f = plot(x,y);
    f.Color = 'r';
    
    • 1
    • 2

    一般设置属性值的方式不止一种,如设置颜色为红色,除了使用颜色名称’red‘,还可以使用短名称’r‘,RGB三元组[1 0 0],或者十六进制颜色代码 ‘#FF0000’,具体方式可参考Line属性

    绘图位置

    figure函数

    1. 生成默认新图窗,并设置为当前窗口:figure
    2. 根据对应的Name(属性),Value (值)对组指定图窗属性:figure(Name Value)Figure属性

    同样也可以通过f=figure()返回图窗对象,并通过f.Name进行属性设置。

    1. 将图窗对象f指定为当前图窗:figure(f)
    2. 将Number属性为n的图窗指定为当前图窗(若没有则新建后将其Number属性设为n):figure(n)

    tiledlayout函数

    tiledlayout函数在R2019b开始提供!更早期的可使用subplot函数。

           tiledlayout函数可用于设置分块图布局,即使多个图存在于同一个窗口内,通过tiledlayout(m,n)创建m行n列大小的分块图,通过nexttile函数选择其中一个图窗进行绘图。

    1. 选择下一个图窗作为当前图窗进行绘图:nexttile,如果刚通过tiledlayout函数创建则选择第一个。
    2. 选择第n个图窗作为当前图窗进行绘图:nexttile(n)
    3. 将第n个图窗及周围的line*col-1个图窗合并,并设置为当前图窗:nexttile(n,[line,col])
    4. 通过nexttile可返回相应的图窗对象,此后可以使用f.Name进行设置,相应属性和值可参考属性。其实通过tiledlayout函数返回的对象也可以,但设置的是所有的图窗。

    标题

    1. 直接设置标题:title(字符串),将当前图窗的标题名称设置为字符串。
    2. 为分块图各个图窗设置标题:title(x,字符串),x为通过nexttile返回的图窗对象。(x=nexttile

    plot3

           plot3函数用于绘制三维线图,与plot函数的使用一样,当然每个图对应坐标参数为3。

    二维动图

    创建动态线条对象:animatedline

    1. 创建没有数据的动态线条,为了方便添加数据,需要返回一个对象:D_Line=animatedline()
    2. 创建已包含相应数据的动态线条:D_Line=animatedline(x,y),x和y建议是同样大小的一维矩阵。(animatedline 在这里相当于集成了plot和plot3函数,坐标参数可以直接输入3个)
    3. 创建线条并设置相应线条属性:D_Line=animatedline(Name,Value)D_Line=animatedline(x,y,Name,Value)

    向动态线条对象添加数据:addpoints

           addpoints用于向动态线条对象添加数据,格式为:addpoints(x,y),当然,也可以输入3个参数以绘制三维线条。

    注意:似乎只有在创建时或通过D_Line.Name等才能进行属性设置,而不能边加点边设置属性,换言之,addpoints(h,x+9.4,y2,'color','r')是不行的,应该是因为addpoints函数无该参数。

    更新图窗:drawnow

           事实上,通过addpoints添加数据后,在图窗即可绘制相应图像,而无法实现动图的效果,这是因为通过addpoints传入大量数据后,执行时线图会被一次性绘制,哪怕在循环中通过addpoints一次性加一个点,也没法,因为绘制速度太快,因此这里需要drawnow来更新图窗(副作用,也是实现动图的方法:降低显示速度(我猜的)),示例如下代码所示:

    h = animatedline('Color','r');
    axis([0 4*pi -1 1])
    x = linspace(0,4*pi,2000);
    
    for k = 1:length(x)
        y = sin(x(k));
        addpoints(h,x(k),y);
        drawnow
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    可以尝试去除倒数第2行的drawnow,对比效果。

  • 相关阅读:
    ETH2.0 合并,投资者该做些什么准备?
    python从入门到精通1:注释
    java高手进阶之:消息模板
    算法设计与分析 | 输油管道
    关系代词 - 定义与分类
    web概述08
    windows结束进程并定时重启应用bat脚本
    cmd(命令行)操作或连接mysql数据库,以及创建数据库与表
    uni-app scroll-view设置scrollTop为0返回顶部不生效
    linux文本编辑YCM报错
  • 原文地址:https://blog.csdn.net/weixin_47447179/article/details/125818709