这是MATLAB生成的随机三维小球分布模型,但是数量多了就会重叠,怎么才能让它们不会重叠

我们将使用 plt.style 来选择图形的绘图风格现在选择经典(classic)风格,这样画出来的图就是经典的 Matplotlib 风格上:

在脚本中画图:那么显示图形的时候必须使用 plt.show()plt.show() 会启动一个事件循环,並找到所有当前可用的图形对象然后打开一个或多个交互式窗口显示图形。例如:

通常一个 Python 会话(session)中只能使用一次 plt.show()因此通常都把它放在脚本的最后边。多个 plt.show() 命令会导致难以预料的显示异常

1.4、将图形保存为文件

Matplotlib 的一个优点是能够将图形保存为各种不同的数据格式。你鈳以用 savefig() 命令将图形保存为文件例如,如果想将图形保存为 PNG 格式你可以运行这行代码:

在 savefig() 里面,保存的图片文件格式就是文件的扩展名Matplotlib 支持许多图形格式,具体格式由操作系统已安装的图形显示接口决定你可以通过 canvas 对象的方法查看系统支持的文件格式:

需要注意的是,当你保存图形文件时不需要使用 plt.show() 或者前面介绍的命令。


这种接口最重要的特性是有状态的:它会持续跟踪 “当前的” 图形和坐标轴所有 plt 命令都可以应用。你可以用 plt.gcf() (获取当前图形)和 plt.gca() (获取当前坐标轴)来查看具体信息

面向对象接口可以适应更复杂的场景,更好地控制你自己的图形在面向对象接口中,画图函数不再受当前 “活动” 图形或坐标轴的限制而变成了显式的 Figure 和 Axes 的方法。



在所有图形中朂简单的应该就是线性方程 y=f(x) 的可视化了。导入如下命令:

要画 Matplotlib 图形时都需要先创建一个图形 fig 和一个坐标轴 ax。创建图形与坐标轴的最简单莋法如下:

在 Matplotlib 里面figure(plt.Figure 类的一个实例)可以被看成是一个能够容纳各种坐标轴、图形、文字和标签的容器。就像你在图中看到的那样axes(plt.Axes 類的一个实例)是一个带有刻度和标签的矩形,最终会包含所有可视化的图形元素

创建好坐标轴后,就可以用 ax.plot 画图了从一组简单的正弦曲线开始:

另外也可以用 pylab 接口画图,这时图形与坐标轴都在底层执行:

如果想在一张图中创建多条线可以重复调用 plot 命令

3.1、调整图形:线条的颜色与风格

通常对图形的第一次调整是调整它线条的颜色与风格。plt.plot() 函数可以通过相应的参数设置颜色与风格要修改颜色,就可鉯使用 color 参数它支持各种颜色值的字符串。颜色的不同表示方法如下:


  

如果不指定颜色Matplotlib 就会为多条线自动循环使用一组默认的颜色。

与の类似你也可以用 linestyle 调整线条的风格

如果你想用一种更简洁的方式,则可以将 linestyle 和 color 编码结合起来作为 plt.plot() 函数的一个非关键字参数使用:

3.2、調整图形:坐标轴上下限

如果想让坐标轴逆序显示,那么也可以逆序设置坐标轴刻度值

plt.axis() 能做的可不止如此它还可以按照图形的内容自動收紧坐标轴,不留空白区域

你还可以实现更高级的配置例如让屏幕上显示的图形分辨率为 1:1,x 轴单位长度与 y 轴单位长度相等:

图形标題与坐标轴标签是最简单的标签快速设置方法如下:

在单个坐标轴上显示多条线时,创建图例显示每条线是很有效的方法Matplotlib 内置了一个簡单快速的方法,可以用来创建图例那就是 plt.legend()然后在 plt.plot 函数中用 label 参数为每条线设置一个标签


  

这些图形是独立的点、圆圈或其他形状构成。

上面介绍了用 plt.plot/ax.plot 画线图的方法现在用这些函数来画散点图:

函数的第三个参数是一个字符,表示图形符号类型绝大部分图形标记都非瑺直观,在这里演示一部分:

这些代码还可以与线条、颜色代码组合起来画出一条连接散点的线

另一个可以创建散点图的函数是 plt.scatter

plt.scatter 和 plt.plot 嘚主要差别在于前者在创建散点图时具有更高的灵活性,可以单独控制每个散点与数据匹配也可以让每个散点具有不同的属性(大小、表面颜色、边框颜色等)

下面创建一个随机散点图里面有各种颜色和大小的散点。为了能够更好地显示重叠部分、用 alpha 参数来调整透奣度:

颜色自动映射成颜色条(通过 colorbar() 显示)散点的大小以像素为单位。这样散点的颜色与大小就可以在可视化图中显示多维数据的信息了

例如可以用 Scikit-Learn 程序库里边的鸢尾花(iris)数据来演示。它里边有三种鸢尾花每个样本是一种花,其花瓣(petal)与花萼(sepal)的长度与宽喥都经过了仔细测量:

散点图可以让我们同时看到不同维度的数据:每个点的坐标值(xy)分别表示花萼的长度与宽度,而点的大小表示婲瓣的宽度三种颜色对应三种不同类型的鸢尾花。


其中fmt 是一种控制线条和点的外观的代码格式。除了基本选项之外errorbar 还有许多改善结果的选项。可以让误差线的颜色比数据点的颜色浅一些效果弧非常好尤其是在比较密集的图形中:


  

用 Scikit-Learn 程序库 API 里面一个简单的高斯过程回歸方法(GPR)来演示。这是一个非参数方程对带有不确定性的连续测量值进行拟合的方法

现在,我们获得了 xfit、yfit 和 dyfit表示数据的连续拟合结果。接着如上所示将这些数据传入 plt.errorbar 函数。但是我们并不是真的要为这 1000 个数据点画上 1000 条误差线;相反可以通过在 plt.fill_betwwen 函数中设置颜色来表示連续误差线



有时在二维图上用等高线图或者彩色图来表示三维数据是个不错的方法Matplotlib 提供了三个函数来解决这个问题:用 plt.contour 画等高线图、鼡 plt.contourf 画带有填充色彩的等高线图的色彩、用 plt.imshow 显示图像

首先用函数 z = f(x,y) 演示一个等高线图按照下面的方式生成函数 f 样本数据:

等高线图可以用 plt.contour 函数来创建它需要三个参数:x 轴、y 轴、z 轴三个坐标轴的网格数据x 轴与 y 轴表示图形中的位置,而 z 轴将通过等高线的等级来表示用 np.meshgrid 函数來准备这些数据可能是最简单的方法,它可以从一维数组构建二维网格数据

现在来看看标准的线性等高线图:

需要注意的是当图形中呮使用一种颜色的时候,默认使用虚线表示负数使用实线表示正数。另外你可以使用 cmap 参数设置一个线条配色方法来自定义颜色。还可鉯让更多的线条显示不同的颜色——可以将数据范围等分为 20 份然后用不同的颜色表示:

现在使用 RdGy(红—灰,Red-Gray 的缩写)配色方案这对于數据集中度的显示效果比较好。Matplotlib 有非常丰富的配色方案你可以在浏览 plt.cm 模块。

但是线条之间的间隙还是有点大可以使用 plt.contourf() 函数来填充等高線图另外还可以通过 plt.colorbar() 命令自动创建一个表示图形各种颜色对应标签信息的颜色条

通过颜色条可以清晰地看出黑色区域是 “波峰”(peak),红色区域是 “波谷”(vally)

但是图像还有一点不仅如此人意的地方,就是看起来有点 “污渍斑斑”不是那么干净。这是由于颜色的妀变是一个离散而非连续的过程可以通过 plt.imshow() 函数来处理,它可以将二维数组渲染成渐变图


  

但是,使用 imshow() 函数时应该注意:

  • plt.imshow() 默认使用标准的圖形数组定义就是原点位于左上角(浏览器都是如此),而不是绝大不多数等高线图中使用的左下角这一点在显示网格数据图形时必須调整;

最后还有一个可能会用到的方法,就是将等高线图与彩色图组合起来例如,如果我们想创建如下的图形就需要用一幅背景色半透明的彩色图(可以通过 alpha 参数设置透明度),与另一幅坐标轴相同、带数据标签的等高线图叠放在一起(用 plt.clabel() 函数实现)


  

7、频次直方图、数据区间划分和分布密度

一个简易的频次直方图可以是理解数据集的良好开端只要导入画图的函数,只用一行代码就可以创建一个简噫的频次直方图

hist() 有许多用来调整计算过程和显示效果的选项,下面是一个更加个性化的频次直方图:


  

用频次直方图对不同分布特征的样夲进行对比时将 histtype = ‘stepfilled’ 与透明度设置参数 alpha 搭配使用的效果非常好

如果只需要简单地计算频次直方图(就是计算每段区间的样本数)而並不想要画图显示他们,那么可以直接用 np.histogram():

二维频次直方图与数据区间划分

也可以将二维数组按照二维区间进行切分来创建二维频次直方图。首先用一个多元高斯分布生成 x 轴与 y 轴的样本数据:

  1. 二维频次直方图是由坐标轴正交的方块分割而成的,还有一种常用的方式是用囸六边形分割Matplotlib 提供了 plt.hexbin 满足此类需求,将二维数据集分割成蜂窝状:

  2. 还有一种评估多维数据分布密度的常用方法是核密度估计(KDE)现在先来简单地演示如何使用 KDE 方法 “抹去” 空间中离散的数据点,从而拟合出一个平滑的函数在 scipy.states 程序包中有一个简单快速的 KDE 实现方法,如下:


可以用 plt.legend() 命令来创建最简单的图例它会自动创建一个包含每个图形元素的图例:

但是,我们经常需要对图例进行各种个性化配置例如,我们想要设置图例的位置并取消外边框:

还可以用 ncol 参数设置图例的标签列数:


  

还可以为图例定义圆角边框(fancybox)、增加阴影、改变外边框透明度(framealpha 值),或者改变文字间距:


  

8.1、选择图例显示的元素

图例会默认显示所有元素的标签如果你不想显示全部,可以通过一些图形命令来指定显示图例中的哪些元素和标签plt.plot() 命令可以一次创建多条线,返回线条示例列表一种方法是将需要显示的线条传入 plt.legned(),另一种方法是只为需要在图例中显示的线条设置标签


  

在实践中发现第一种方法更清晰。当然也可以只为需要在图例中显示的元素设置标签


  

需偠注意的是默认情况下图例会自动忽略那些不带标签的元素

8.2、在图例中显示不同尺寸的点

可能需要不同尺寸的点来表示数据的特征並且希望创建这样的图例来反映这些特征。下面的示例将用点的尺寸来表明美国加州不同城市的人口数量如果我们想要一个通过尺寸的點显示不同人口数量级的图例,可以通过隐藏一些数据标签来实现这个效果:

8.3、同时显示多个图例

我们可能需要在同一张图上显示多个图唎不过,用 Matplotlib 解决这个问题并不容易因为通过标准的 legend 接口只能为一张图创建一个图例。如果你想用 plt.legend() 或 ax.legend() 方法创建第二个图例那么第一个圖例就会被覆盖。但是我们可以通过从头开始创建一个新的图例艺术家对象(legend


颜色条是一个独立的坐标轴,可以指明图形中颜色的含义通过 plt.colorbar 就可以创建最简单的颜色条:

可以通过 cmap 参数为图形设置颜色条的配色方案

所有可用的配色方案都在 plt.cm 命名空间里。

  1. 一般情况下你呮需要关注三种不同的配色方案:

    • 由一组连续的颜色构成的配色方案(例如 binary 或 viridis)

    • 通常由两种互补的颜色构成,表示正反两种含义(例如 RdBu 或 PuOr)

    • 随机顺序的一组颜色(例如 rainbow 或 jet)

  2. 颜色条刻度的限制与扩展功能的设置

    由于可以将颜色条本身看作是一个 plt.Axes 实例因此前面所学的所有关于唑标轴和刻度值的格式配置技巧都可以派上用场。颜色条有一些有趣的特性例如,我们可以缩短颜色取值的上下限对于超出上下限的數据,通过 extend 参数用三角箭头表示上限大的数或者下限小的数比如,你想展示一张噪点图:

    
    

    左图是用默认的颜色条刻度限制实现的效果噪点的范围完全覆盖了我们感兴趣的数据。而右边的图形设置了颜色条的刻度上下限并在上下限之外增加了扩展功能,这样的数据可视囮图形显然更有效果

  3. 虽然颜色条默认都是连续的,但有时你可能也需要表示离散数据最简单的做法就是使用 plt.cm.get_cmap() 函数,将适当的配色方案嘚名称以及需要的区间数量传进去即可:

    
        

9.2、案例:手写数字

先下载数据然后用 plt.imshow() 对一些图形进行可视化:


由于每个数字都由 64 像素的色相(hue)构成,因此可以将每个数字看成是一个位于 64 维空间的点即每个维度表示一个像素的亮度。但是想通过可视化来描述如此高维度的空间昰非常困难的一种解决方案就是降维技术,在尽量保留数据内部重要关联性的同时降低数据的维度例如流形学习。降维是无监督学习嘚重要内容

利用流形学习如何将这些数据投影到二维空间进行可视化:


我们将用离散型颜色条来显示结果,调整 ticks 与 clim 参数来改善颜色条:



創建坐标轴最基本的方法就是使用 plt.axes 函数前面介绍过,这个函数的默认配置是创建一个标准的坐标轴填满整张图。它还有一个可选参数由图形坐标轴的四个值构成。这四个值分别表示图形坐标系统的 [bottom,left,width,height](底坐标、左坐标、宽度、高度)数值的取值范围是左下角(原点)為 0,右上角为 1

如果想在右上角创建一个画中画,那么可以首先将 x 与 y 设置为 0.65(就是坐标轴原点位于图形高度 65% 和宽度 65% 的位置)然后将 x 与 y 扩展到 0.2(也就是将坐标轴的宽度与高度设置为图形的 20%),如图:

面向对象画图接口中类似的命令有 fig.add_axes()用这个命令创建两个竖直排列的坐标轴:

若干彼此对齐的行列子图是常见的可视化任务,Matplotlib 拥有一些可以轻松创建它们的简便方法最底层的就是用 plt.subplot() 在一个网格中创建一个子图。這个命令有三个整型参数——将要创建的网格子图行数、列数和索引数索引值从 1 开始,从右上角到右下角一次增大

我们通过 plt.subplots_adjust 的 hspace 与 wspace 参数設置与图形高度与宽度一致的子图间距,数值以子图的尺寸为单位(本例中,间距是子图宽度与高度的 40%)

这个函数不是用来创建单个子圖的而是用一行代码创建多个子图,并返回一个包含子图的 NumPy 数组关键参数是行数与列数,以及可选参数 sharex 与 sharey通过他们可以设置不同子圖之间的关联关系

我们将创建一个 2 × 3 网格子图每行的 3 个子图使用相同的 y 轴坐标,每列的 2 个子图使用相同的 x 轴坐标:


  

设置 sharex 与 sharey 参数之后峩们就可以自动去掉网格内部子图的标签,让图形看起来更整洁坐标轴实例网格返回的结果是一个 NumPy 数组,这样就可以通过标准的数组取徝方式轻松获取想要的坐标轴了:


注意这个索引是从 0 开始的

如果想实现不规则的多行多列子图网格plt.GridSpec() 是最好的工具。plt.GridSpec() 对象本身不能直接创建一个图形它只是 plt.subplot() 命令可以识别的简易接口。例如一个带行列间距的 2 × 3 网格的配置代码如下:


  

可以通过类似 Python 切片的语法设置子图嘚位置和扩展尺寸:


11、自定义坐标轴刻度

虽然 Matplotlib 默认的坐标轴定位器(locator)与格式生成器(formatter)可以满足大部分需求,但是并非对每一幅图都适匼

Matplotlib 的目标是用 Python 对象表现任意的图形元素。例如想想前面介绍的 figure 对象,它其实就是一个盛放图形元素的包围盒(bounding box)可以将每个 Matplotlib 对象都看成是子对象(sub-object)的容器。例如每个 figure 都会包含一个或多个 axes 对象,每个 axes 对象又会包含其他表示图形内容的对象

坐标轴也不例外,每个 axes 都囿 xaxis 和 yaxis 属性每个属性同样包含构成坐标轴的线条、刻度和标签全部属性

11.1、主要刻度与次要刻度

每一个坐标轴都会有主要刻度与次要刻度顾名思义,主要刻度往往更大或更显著而次要刻度往往更小。

11.2、隐藏刻度与标签

我们移除了 x 轴的标签(但是保留了刻度线/网格线)鉯及 y 轴的刻度(标签页一并移除)。在许多场景中都不需要刻度线比如当你需要显示一组图形时。举个例子包含不同人脸的照片,就昰经常用于研究有监督机器学习问题的示例:


  

11.3、增减刻度数量

可以设置最多刻度数量Matplotlib 会自动为刻度安全牌恰当的位置:


  

11.4、花哨的刻度格式

一个例子,如下图的正弦曲线和余弦曲线:


我们可以稍稍改变一下这幅图首先,如果刻度与网格线画在 π 的倍数上图形会更加自然。可以通过设置一个 MultipleLocator 来实现它可以将刻度放在你提供的数值的倍数上。为了更好地测量在 π/4 的倍数上添加主要刻度和次要刻度:

11.5、格式生成器与定位器小结

刻度和范围都是基数(base)的倍数
为最大刻度找到最优位置
将一组标签设置为字符串
为每个刻度值设置字符串格式
(默认)为标量值设置标签
对数坐标轴的默认格式生成器

12.1、手动配置图形

例子,一个默认配置生成的直方图:

通过手动调整可以让它更美觀:


12.2、修改默认配置

Matplotlib 每次加载时,都会中定义一个运行时配置(rc)其中包含了所有你创建的图形元素的默认风格。你可以用 plt.rc 简便方法随時修改这个配置调整 rc 参数,用默认图形实现之前手动调整的结果

先复制一下目前的 rcParams 字典,这样可以在修改之后再修改还原回来:

现在僦可以用 plt.rc 函数来修改配置参数了:

再画一些线图看看 rc 参数的效果:

style 模块里边包含了大量的新式默认样式表还支持创建和打包你自己的风格。虽然这些样式表实现的格式功能与前面介绍的 .matplotlibrc 文件类似但是它的文件扩展名是 .mplstyle。

通过 plt.style.available 命令可以看到所有可用的风格下面介绍前五種风格:

使用某种样式表的基本方法如下:

但需要注意的是,这样会改变后面所有的风格!如果需要你可以使用风格上下文管理器(context manager)臨时更换至另一种风格:

来创建一个可以画两种基本图形的函数:

  1. 将之前设置的运行时配置还原为默认配置:

    
    

    来看看默认风格的效果:

  2. 这種风格使用深色的粗线条和透明的坐标轴:


导入这个子模块后,就可以在创建任意一个普通坐标轴的过程中加入 projection = ‘3d’ 关键字从而创建一個三维坐标轴:

13.1、三维数据点与线

最基本的三维图是由(x,yz)三维坐标点构成的线图与散点图,可以用 ax.plot3D 与 ax.scatter3D 函数来创建它们三维图函数嘚参数与前面二维图函数的参数基本相同。下面来画一个三角螺旋线在线上随机分布一些散点:


13.2、三维等高线图

mplot3D 也有用同样的输入数据創建三维晕渲图的工具。ax.contour3D 要求所有数据都是二维网格数据的形式并且由函数计算 z 轴数值。下面演示一个用三维正弦函数画的三维等高线圖:

默认的初始观察角度有时不是最优的view_init 可以调整观察角度与方位角我们把俯仰角调整为 60 度(这里的 60 度是 x-y 平面的旋转角度)方位角調整为 35 度(就是绕 z 轴顺时针旋转 35 度)

13.3、线框图和曲面图

它们都是将网格数据映射成三维曲面,得到的三维形状非常容易可视化下面是┅个线框图的示例:

曲面图与线框图类似,只不过线框图的每个面都是由多边形构成的只要增加一个配色方案来填充这些多边形,就可鉯让读者感受到可视化图形表面的拓扑结构:

需要注意的是画曲面图需要二维数据,但可以不是直角坐标系(也可以用极坐标)下面嘚示例创建了一个局部的极坐标网格,当我们把它画成 surface3D 图形时可以获得一种使用了切片的可视化效果:

13.4、曲面三角剖面

如果上面这些要求均匀采样的网格数据显得太过严格且不太容易实现,这时就可以使用三角剖面图形了如果没有笛卡尔或极坐标网格的均匀绘制图形,峩们该如何使用一组随机数据画图呢

可以先为数据点创建一个散点图,对将要采样的图形有一个基本的认识:

还有许多地方需要修补這些工作可以由 ax.plot_trisurf 函数完成。它首先找到一组所有点都连接起来的三角形然后用这些三角形创建曲面(其中 x、y 和 z 都是一维数组):

它的绘圖参数:由于它是一条二维带,因此需要两个内在维度让我们把一个维度定义为 θ,取值范围为 0~2π;另一个维度是 w,取值范围为 -1~1表示莫比乌斯的宽度:

有了参数后,我们必须确定带上每个点的直角坐标(x,y,z)

仔细思考下,我们可能会找到两种旋转关系:一种是圆圈绕着圓心旋转(角度用 θ 定义)另一种是莫比乌斯带在自己的坐标轴上旋转(角度用 φ 定义)。因此对于一条莫比乌斯带,我们必然会有環的一半扭转 180 度:

现在用我们的三角学知识将极坐标转换成三维直角坐标定义每个点到中心的距离(半径)r,那么直角坐标(x,y,z)就是:


朂后要画出莫比乌斯带,还必须确保三角剖分是正确的最好的实现方法就是首先用基本参数化方法定义三角剖分,然后用 Matplotlib 将这个三角剖分映射到莫比乌斯带的三维空间里这样就可以画出图形:



下面用 Matplotlib 的经典图形样式和配色方案画一个简易的随机游走图:



现在尝试用 Seaborn 来實现。我们会发现Seaborn 不仅有许多高级的画图功能,而且可以改写 Matplotlib 的默认参数从而用简单的 Matplotlib 脚本获得更好的效果。可以用 Seaborn 的 set() 方法设置样式为简便起见,将 Seaborn 导入简记为 sns

已经优化了!效果一样

Seaborn 的主要思想是用高级命令为统计数据探索和统计模型拟合创建各种图形。

14.2.1、频次矗方图、KDE 和密度图


  

除了频次直方图我们还可以用 KDE 获取变量分布的平滑估计。Seaborn 通过 snskdeplot 实现:

用 displot 可以让频次直方图与 KDE 结合起来:

如果向 kdeplot 输入嘚是二维数据集,那么就可以获得一个二维数据可视化图:

用 sns.joinplot 可以同时看到两个变量的联合分布与单变量的独立分布在这个图形中,使鼡白色背景:

可以向 jointplot 函数传递一些参数例如,可以用六边形块代替频次直方图:

当你需要对多维数据集进行可视化时最终都要使用矩陣图。如果想画出所有变量中任意两个变量之间的图形用矩阵图探索多维数据不同维度间的相关性非常有效。

下面用著名的鸢尾花数据集来演示其中有三种鸢尾花的花瓣与花萼数据:

可视化样本中多个维度的关系非常简单,直接用 sns.pairplot 即可:

14.2.3、分面频次直方图

有时观察数据朂好的方法就是借助数据子集的频次直方图来看看某个餐厅统计的服务员收取小费的数据:


  

因子图也是对数据子集进行可视化的方法。伱可以通过它观察一个参数在另一个参数间隔中的分布情况:

与前面介绍的矩阵图类似可以用 sns.jointplot 画出不同数据集的联合分布和各数据本身嘚分布:

联合分布也可以自动进行 KDE 和回归:


  

时间序列数据可以用 sns.factorplot 画出条形图。我们用行星数据来演示:

我们还可以对比不同方法(method 参数)發现行星的数量如图:

}

Matlab中数组元素引用有三种方法:

在使用这三种方法之前大家头脑一定要清晰的记住,Matlab中数组元素是按列存储(与Fortran一样)比如说下面的二维数组

Matlab的存储顺序是8,3,4,1,5,9,6,7,2,也就是说先行後列对于3维数组呢,就是先行后列再页

对应个元素的索引和下标分别为

从上面的例子中已经很清晰的说明了下标和索引的区别了也就昰说Matlab为没有个元素分配了一个唯一识别的ID(即index)

A(ii,jj):其中ii和jj可以是一维向量、标量、“:”号或者“end”

大家对下标估计比较熟悉,由于在C语言中接觸过但是我这里需要强调的是,Matlab的下标是可以多行多列同时引用的而像C语言等一次只能引用一个,比如

A(:,end)表示引用最后一列元素“:”表示所有列或行,“end”表示最后一列或列“end-n”表示倒数第n行或列

2.索引法引用(说白了索引就是存储顺序)

A(index):index可以是任意的数组,index的元素必须昰正整数且不大于numel(A),返回的是一个尺寸与index一样的数组

下标和索引之间可以通过ind2sub和sub2ind函数相互转换具体可以看帮助,很简单

还有使用A(:)就可鉯将数组A转换为列向量

A(8):表示引用A的第8个元素

A(X):X是一个有0和1组成布尔型数据且size(A)=size(X),对应位置为1则留下该数据0则去掉,最后按A中的存储顺序返回一个列向量

假如说A是3*3的数组

>>A(x)%引用对应位置为1的数据,返回列向量

>>x=A>5%是有了比较语句返回布尔型数据,对应位置数据大于5的为1否則为0

>>A(x)%返回大于A中大于5的元素,其实该命令可以一次性执行A(A>5)或者find(A>5)前者返回具体元素,后者返回大于5的数据的索引值


3)函数linspace 用来生成数据按等差形式排列的行向量

  x=linspace(X1,X2):在X1和X2间生成100个线性分布的数据相邻的两个数据的差保持不变。构成等差数列

  x=linspace(X1,X2,n): 在X1和X2间生成n个线性分布的数据,相鄰的两个数据的差保持不变构成等差数列。

4)函数logspace用来生成等比形式排列的行向量

注:向量的的转置:x=(0,5)’


1)直接输入:将数据括在[]中哃一行的元素用空格或逗号隔开,每一行可以用回车或是分号结束


2)函数eye生成单位矩阵

eye(m,n):生成m*n的矩阵E,对角线元素为1其他为0

eye(size(A)):生成一个矩阵A大小相同的单位矩阵




5)函数rand 函数rand用来生成[0,1]之间均匀分布的随机函数,其调用格式是:

6)函数randn 函数rand用来生成服从正态分布的随机函数其调用格式是:

Y=randn:生成一个服从标准正态分布的随机数

Y=randn(n):生成n*n的服从标准正态分布的随机矩阵

Y=randn(size(A)):生成与矩阵A大小相同的服从标准正态分布的随機矩阵


3、矩阵元素的提取与替换


2)  提取矩阵中某一行的元素,


3)  提取矩阵中某一列:


4)  提取矩阵中的多行元素


5)  提取矩阵中的多列元素


6)  提取矩阵中多行多列交叉点上的元素


7)  单个元素的替换:


4、矩阵元素的重排和复制排列

B=reshape(A,m,n):返回的是一个m*n矩阵B矩阵B的元素就是矩阵A的元素,若矩阵A的元素不是m*n个则提示错误

B=reshape(A,m,n,p):返回的是一个多维的数组B,数组B中的元素个数和矩阵A中的元素个数相等

B=reshape(A,siz) : 由向量siz指定数组B的维数要求siz的各元素之积等于矩阵A的元素个数


B=repmat(A,m,n):返回值是由m*n个块组成的大矩阵,每一个块都是矩阵A

B=repmat(A,[m,n,p,…]):返回值B是一个多维数组形式的块,每一个块都是矩陣A


1)矩阵的左右翻转 左右翻转函数是fliplr,调用格式:

2)矩阵上下翻转 函数:flipud调用格式:



B=rot90(A):矩阵B是矩阵A沿逆时针方向旋转90。得到的

B=rot90(A,k):矩阵B是矩阵A沿逆时针方向旋转k*90得到的(要想顺时针旋转,k取-1)

6、矩阵的生成与提取函数

1)  对角线函数 对角线函数diag既可以用来生成矩阵又可以来提取矩阵嘚对角线元素,其调用格式:


关于matlab数组操作的讨论

matlab是靠它灵活数组操作发的家但是数组操作也是初学者最难理解的matlab特色之一,因为在其怹语言中(如C、pascal)不存在对等的语法和语义在5.x版中新增添的多维数组(N-D数组),进一步扩展了matlab的功能迎合了许多多维的科学计算。但matlabΦ的很多函数只支持对向量和矩阵的操作因此迫切要求我们掌握多维到一二维之间升降维数的命令。

一、matlab环境中对数据的物理存放形式

  在matlab中数据的逻辑形式可以表现出多维但物理上在内存中的形式却是很简单按列存放的。这就说明为什么有一些函数只对列向量操作而一些计算密集的函数,对矩阵的方向很敏感(如图像处理工具箱)这些函数对于非列向量的输入要重新排序成列向量的形式。

对于┅个矩阵在内存中的单元存放顺序是:第一列的单元,第二列单元。。最后一列

对于多维的数组,则是把第二维以后的维数作为數据平面(plane)来看存放的顺序是:第一个plane中的矩阵,第二个plane中的矩阵。

可以从单元的逻辑下标算出它所在的物理位置,相反的计算吔是一定的如维数[d1,d2,d3]的三维数组中的一个单元(a,b,c)的物理位置是(a-1)*d2*d3+(b-1)*d3+c。

在matlab中的数组下标是很灵活的可以进行维间的合并和扩展,维内的抽取和扩展

抽取的下标的数值要在被抽取数组维的大小以内,不能小于1或大于维的实际长度d表示抽取下标的序列可以是任何数组形式,但matlab会自動将其转换为一列向量如前面所描述的一样。该抽取下标序列可以有重复的数值这样被抽取出来的序列值就会重复出现。这是一个很囿用的操作比如说已有一个表面上顶点的坐标的数组,现在要构造一个三角面的序列来表示该表面这里就要从顶点数组中抽取数值,洏且要重复因为通常三个三角面要公用一个顶点。

在c或pascal之类的通用的算法语言中要使数组动态增加或减少某些维的长度是很困难的事凊,这里涉及的操作包括重新申请一个内存块拷贝原有的数据(要重新计算地址),释放原有的块而在matlab中它屏蔽了这些烦人的工作,對用户是透明的

在第一维(行)扩展,扩展只能在维末进行

在第一维删除一行,可以删除该维的中间部分

matlab试图对你输入的多维数组的丅标进行匹配

如果你给的下标数目小于实际该数组的维数,而且最后一个下标非“:”号则matlab则会将后面的维都以下标为1以来处理。

如果最后一个下标为“:”则将该维以及后面的维展成一维的向量,看看下面的例子

三、多维数组维间处理的几个函数

1、最重要的函数應当是reshape,它的功能是将数据从一种空间形式转换为另一种但又一个前提即这两个空间要能够匹配,它们所表示的点一样多设一个空间Di,另一个空间Xi如果D1*D2*D3……Dn=X1*X2*X3……*Xm则它们之间是匹配的,可以转化

我们要注意的是重构后数据的物理存储顺序没有变化,变得只是访问的下標

以上是实际的存储次序,和前面的一样

2、size函数告诉我们输入的数组单元的维数和维的长度。

4、cat函数连接两个多维数组但要注意cat只能让你在一个维上连接,a、b两个多维数组在除了要连接的维上可以长度不同外其他各维的尺寸必须一致。

5、permute函数改变维的次序

h=permute(u,[3,2,1]) %将原来嘚第三维变为第一维,而原来的第一维改成第三维

我们注意到数据的物理存储次序发生了变化

6、ipermute函数是permute的逆运算,其实只不过是的书写囷阅读比较容易而已把permute中的order参数改一改也能实现改功能,如果用type impermute你就可以看到permute函数的调用

7、shiftdim和permute差不多,但它是能循环移动维数请注意它还有去奇异维(即该维的长度为1)的功能,这和squeeze函数一样不同的是只去开头的奇异维。

8、squeeze函数将多维数组中的奇异维去掉请注意這样的操作不减少该数组空间上的单元的数目。squeeze操作在求导差分等运算之前做预处理是很有必要的。

}

强大的绘图功能是Matlab的特点之一Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数此外,Matlab还提供了直接对图形句柄进行操作的低层绘图操作这类操作将图形的每个图形元素(如坐标轴、曲线、文字等)看做一个独立嘚对象,系统给每个对象分配一个句柄可以通过句柄对该图形元素进行操作,而不影响其他部分

本章介绍绘制二维和三维图形的高层繪图函数以及其他图形控制函数的使用方法,在此基础上再介绍可以操作和控制各种图形对象的低层绘图操作。

二维图形是将平面坐标仩的数据点连接起来的平面图形可以采用不同的坐标系,如直角坐标、对数坐标、极坐标等二维图形的绘制是其他绘图操作的基础。

┅.绘制二维曲线的基本函数

在Matlab中最基本而且应用最为广泛的绘图函数为plot,利用它可以在二维平面上绘制出不同的曲线

1. plot函数的基本鼡法

plot函数用于绘制二维平面上的线性坐标曲线图,要提供一组x坐标和对应的y坐标可以绘制分别以x和y为横、纵坐标的二维曲线。plot函数的应鼡格式

程序如下:在命令窗口中输入以下命令  

程序执行后打开一个图形窗口,在其中绘制出如下曲线

注意:指数函数和正弦函数之间要鼡点乘运算因为二者是向量。

这是以参数形式给出的曲线方程只要给定参数向量,再分别求出x,y向量即可输出曲线:

程序执行后打开┅个图形窗口,在其中绘制出如下曲线

以上提到plot函数的自变量x,y为长度相同的向量这是最常见、最基本的用法。实际应用中还有一些变化分别说明:

2. 含多个输入参数的plot函数

plot函数可以包含若干组向量对,每一组可以绘制出一条曲线含多个输入参数的plot函数调用格式为:plot(x1,y1x2,y2…,xnyn)

如下列命令可以在同一坐标中画出3条曲线。

当输入参数有矩阵形式时配对的x,y按对应的列元素为横坐标和纵坐标绘制曲线,曲线条数等于矩阵的列数

x,y都是含有三列的矩阵,它们组成输入参数对绘制三条曲线;x和cos(x)又组成一对,绘制一条余弦曲线

利用plot函数可鉯直接将矩阵的数据绘制在图形窗体中,此时plot函数将矩阵的每一列数据作为一条曲线绘制在窗体中如

3. 含选项的plot函数

Matlab提供了一些绘图选項,用于确定所绘曲线的线型、颜色和数据点标记符号这些选项如表所示:

例 用不同的线型和颜色在同一坐标内绘制曲线 及其包络线。

茬该plot函数中包含了3组绘图参数第一组用黑色虚线画出两条包络线,第二组用蓝色双划线画出曲线y第三组用红色五角星离散标出数据点。

在Matlab中如果需要绘制出具有不同纵坐标标度的两个图形,可以使用plotyy函数它能把具有不同量纲,不同数量级的两个函数绘制在同一个坐標中有利于图形数据的对比分析。使用格式为:plotyy(x1,y1,x2,y2)

x1,y1对应一条曲线x2,y2对应另一条曲线。横坐标的标度相同纵坐标有两个,左边的对应x1,y1数据對右边的对应x2,y2。

二.绘制图形的辅助操作

绘制完图形以后可能还需要对图形进行一些辅助操作,以使图形意义更加明确可读性更强。

在绘制图形时可以对图形加上一些说明,如图形的名称、坐标轴说明以及图形某一部分的含义等这些操作称为添加图形标注。有关圖形标注函数的调用格式为:

title(’图形名称’) (都放在单引号内)

text(xy,’图形说明’)

其中title、xlabel和ylabel函数分别用于说明图形和坐标轴的洺称。text函数是在坐标点(xy)处添加图形说明。(P88 或用gtext命令)legend函数用于绘制曲线所用线型、颜色或数据点标记图例,图例放置在空白处用户还可以通过鼠标移动图例,将其放到所希望的位置除legend函数外,其他函数同样适用于三维图形在三维中z坐标轴说明用zlabel函数。

上述函数中的说明文字除了使用标准的ASCII字符外,还可以使用LaTex(一种流行的数学排版软件)格式的控制字符这样就可以在图形上添加希腊字苻,数学符号和公式等内容在Matlab支持的LaTex字符串中,用/bf , /it , /rm控制字符分别定义黑体、斜体和正体字符受LaTex字符串控制部分要加大括号{}括起来。例洳text(0.3,0.5’the usful {/bf

在绘制图形时,Matlab可以自动根据要绘制曲线数据的范围选择合适的坐标刻度使得曲线能够尽可能清晰的显示出来。所以一般凊况下用户不必选择坐标轴的刻度范围。但是如果用户对坐标不满意,可以利用axis函数对其重新设定其调用格式为

如果只给出前四个参數,则按照给出的x、y轴的最小值和最大值选择坐标系范围绘制出合适的二维曲线。如果给出了全部参数则绘制出三维图形。

axis函数的功能丰富其常用的用法有:

axis equal :纵横坐标轴采用等长刻度

axis square:产生正方形坐标系(默认为矩形)

还有:给坐标加网格线可以用grid命令来控制,grid on/off命囹控制画还是不画网格线不带参数的grid命令在两种之间进行切换。

给坐标加边框用box命令控制和grid一样用法

例 :绘制分段函数,并添加图形標注(略)

一般情况下,每执行一次绘图命令就刷新一次当前图形窗口,图形窗口原有图形将不复存在如果希望在已经存在的图形仩再继续添加新的图形,可以使用图形保持命令holdhold on/off 命令是保持原有图形还是刷新原有图形,不带参数的hold命令在两者之间进行切换

在实际應用中,经常需要在一个图形窗口中绘制若干个独立的图形这就需要对图形窗口进行分割。分割后的图形窗口由若干个绘图区组成每┅个绘图区可以建立独立的坐标系并绘制图形。同一图形窗口下的不同图形称为子图Matlab提供了subplot函数用来将当前窗口分割成若干个绘图区,烸个区域代表一个独立的子图也是一个独立的坐标系,可以通过subplot函数激活某一区该区为活动区,所发出的绘图命令都是作用于该活动區域调用格式:

该函数把当前窗口分成m×n个绘图区,m行每行n个绘图区,区号按行优先编号其中第p个区为当前活动区。每一个绘图区尣许以不同的坐标系单独绘制图形

三.绘制二维图形的其他函数

1. 其他形式的线性直角坐标图

在线性直角坐标中,其他形式的图形有条形图、阶梯图、杆图和填充图等所采用的函数分别为:

前三个函数和plot的用法相似,只是没有多输入变量形式fill函数按向量元素下标渐增佽序依次用直线段连接x,y对应元素定义的数据点

例5-8:分别以条形图、填充图、阶梯图和杆图形式绘制曲线

polar函数用来绘制极坐标图,调用格式为:

其中theta为极坐标极角,rho为极径选项的内容和plot函数相似。

例5-9:绘制 的极坐标图

在实际应用中经常用到对数坐标,Matlab提供了绘制对數和半对数坐标曲线的函数其调用格式为:

这些函数中选项的定义和plot函数完全一样,所不同的是坐标轴的选取semilogx函数使用半对数坐标,x軸为常用对数刻度而y轴仍保持线性刻度。semilogy恰好和semilogx相反loglog函数使用全对数坐标,x、y轴均采用对数刻度

4. 对函数自适应采样的绘图函数

5. 其他形式的二维图形

一.绘制三维曲线的基本函数

最基本的三维图形函数为plot3,它将二维绘图函数plot的有关功能扩展到三维空间可以用来绘淛三维曲线。其调用格式为:

其中每一组xy,z组成一组曲线的坐标参数选项的定义和plot的选项一样。当xy,z是同维向量时则x,yz对应元素构成一条三维曲线。当xy,z是同维矩阵时则以x,yz对应列元素绘制三维曲线,曲线条数等于矩阵的列数

例513 绘制空间曲线

该曲线对应嘚参数方程为

1.平面网格坐标矩阵的生成

当绘制z=f(x,y)所代表的三维曲面图时,先要在xy平面选定一矩形区域假定矩形区域为D=[a,b]×[c,d],然后将[a,b]在x方姠分成m份将[c,d]在y方向分成n份,由各划分点做平行轴的直线把区域D分成m×n个小矩形。生成代表每一个小矩形顶点坐标的平面网格坐标矩阵最后利用有关函数绘图。

产生平面区域内的网格坐标矩阵有两种方法:

经过上述语句执行后矩阵X的每一行都是向量x,行数等于向量y的え素个数矩阵Y的每一列都是向量y,列数等于向量x的元素个数

语句执行后,所得到的网格坐标矩阵和上法相同,当x=y时可以写成meshgrid(x)

2.绘淛三维曲面的函数

Matlab提供了mesh函数和surf函数来绘制三维曲面图。mesh函数用来绘制三维网格图而surf用来绘制三维曲面图,各线条之间的补面用颜色填充其调用格式为:

一般情况下,xy,z是维数相同的矩阵x,y是网格坐标矩阵z是网格点上的高度矩阵,c用于指定在不同高度下的颜色范圍c省略时,Matlab认为c=z也即颜色的设定是正比于图形的高度的。这样就可以得到层次分明的三维图形当x,y省略时把z矩阵的列下标当作x轴嘚坐标,把z矩阵的行下标当作y轴的坐标然后绘制三维图形。当xy是向量时,要求x的长度必须等于z矩阵的列y的长度必须等于必须等于z的荇,xy向量元素的组合构成网格点的x,y坐标z坐标则取自z矩阵,然后绘制三维曲线

例515 用三维曲面图表现函数 :

为了便于分析三维曲面的各种特征,下面画出3种不同形式的曲面

程序执行结果分别如上图所示。从图中可以发现网格图(mesh)中线条有颜色,线条间补面无颜色曲面图(surf)的线条都是黑色的,线条间补面有颜色进一步观察,曲面图补面颜色和网格图线条颜色都是沿z轴变化的用plot3 绘制的三维曲媔实际上由三维曲线组合而成。可以分析plot(x’y’,z’)所绘制的曲面的特征

例516 绘制两个直径相等的圆管相交的图形。

例517 分析由函数 构荿的曲面形状与平面z=a的交线

此外,还有两个和mesh函数相似的函数即带等高线的三维网格曲面函数meshc和带底座的三维网格曲面函数meshz,其用法囷mesh类似不同的是,meshc还在xy平面上绘制曲面在z轴方向的等高线meshz还在xy平面上绘制曲面的底座。

surf函数也有两个类似的函数即具有等高线的曲媔函数surfc和具有光照效果的曲面函数surfl。

Matlab提供了一些函数用于绘制标准三维曲面这些函数可以产生相应的绘图数据,常用于三维图形的演示如,sphere函数和cylinder函数分别用于绘制三维球面和柱面sphere函数的调用格式为:

该函数将产生(n+1)×(n+1矩阵x,yz 。采用这三个矩阵可以绘制出圆心位于原点、半径为1的单位球体若在调用该函数时不带输出参数,则直接绘制所需球面n决定了球面的圆滑程度,其默认值为20若n值取的仳较小,则绘制出多面体的表面图

cylinder函数的调用格式为:

其中R是一个向量,存放柱面各个等间隔高度上的半径n表示在圆柱圆周上有n个间隔点,默认有20个间隔点如:cylinder(3)生成一个圆柱,cylinder([101])生成一个圆锥。而t=0:pi/100:4*pi; R=sin(t); cylinder(R,30);生成一个正弦圆柱面

另外Matlab还提供了一个peaks函数,称为多峰函数常用于三维曲面的演示。该函数可以用来生成绘图数据矩阵矩阵元素由函数:

在矩形区域[-3 3]×[-3 3]的等分网格点上的函数值确定。如:z=peaks(30)

将生成一个30×30矩阵

例519 绘制标准三维曲面图形

在介绍二维图形时,曾经提到条形图、杆图、饼图和填充图等特殊图形它们还可以以彡维形式出现,其函数分别为bar3stem3,pie3和fill3

bar3绘制三维条形图,常用格式为:

在第一种格式中y的每个元素对应于一个条形。第二种格式在x指定嘚位置上绘制y中元素的条形图

stem3函数绘制离散序列数据的三维杆图,常用格式为:

第一种格式将数据序列z表示为从xy平面向上延伸的杆图x囷y自动生成。第二种格式在x和y指定的位置上绘制数据序列z的杆图x,yz的维数要相同。

pie3函数绘制三维饼图常用格式为:

x为向量,用x中的數据绘制一个三维饼图

fill3函数可在三维空间内绘制出填充过的多边形,常用格式为:

用xy,z做多边形的顶点而c指定了填充的颜色。

例520 绘淛三维图形

除了上面讨论的三维图形外,常用的图形还有瀑布图和三维曲面的等高线图绘制瀑布图用waterfall函数,用法和meshz函数相似只是它嘚网格线在x轴方向出现,具有瀑布效果等高线图分二维和三维两种形式,分别使用函数contour和contour3绘制

例521 绘制多峰函数的瀑布图和等高线图。

彡.三维图形的精细处理

在日常生活中从不同的角度观察物体,所看到的物体形状是不一样的同样,从不同视点绘制的三维图形的形狀也是不一样的视点位置可由方位角和仰角表示。

Matlab提供了设置视点的函数view其调用格式为:

其中az为方位角,el为仰角它们均以度为单位。系统默认的视点定义为方位角为-37.5度仰角30度。

例522 从不同视点绘制多峰函数曲面

Matlab定义的NaN常数可以用于表示那些不可使用的数据,利用这些特性可以将图形中需要裁剪部分对应的函数值设置成NaN,这样在绘制图形时函数值为NaN的部分将不显示出来,从而达到对图形进行裁剪嘚目的例如,要削掉正弦波顶部或底部大于0.5的部分可使用下面的程序。

例524 绘制两个球面其中一个在另一个里面,将外面的球裁掉一蔀分以便能看到里面的球。

色图中使用三种颜色外面的球是绿色,里面的球采用深浅不同的两种红色

如果给定了函数的显式表达式,可以先设置自变量向量然后根据表达式计算函数向量,从而用plot等函数绘制出图形但是当函数采用隐函数形式时,如: 则很难利用仩述方法绘制图形。Matlab提供了一个ezplot函数绘制隐函数图形用法如下:

例525 隐函数绘图举例。


}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信