Skip to content

Latest commit

 

History

History
1273 lines (923 loc) · 67.6 KB

File metadata and controls

1273 lines (923 loc) · 67.6 KB

matplotlib笔记(基于 matplotlib 1.5.1 )

一、matplotlib配置

matplotlib配置信息是从配置文件中读取的。在配置文件中可以为matplotlib几乎所有的属性指定永久有效的默认值。

1. 查看配置

你可以通过 matplotlib.rcParams字典访问所有已经加载的配置项

查看matplotlib配置

2. 修改配置

  • 你可以通过 matplotlib.rcParams字典修改所有已经加载的配置项

    通过rcParams修改配置

  • 你可以通过matplotlib.rc(*args,**kwargs)来修改配置项,其中args 是你要修改的属性,kwargs是属性的关键字属性

    通过rc函数修改配置

  • 你可以调用matplotlib.rcdefaults()将所有配置重置为标准设置。

    恢复默认配置

3. 配置文件

如果不希望在每次代码开始时进行参数配置,则可以在项目中给出配置文件。配置文件有三个位置:

  • 系统级配置文件。通常在python的site-packages目录下。每次重装matplotlib之后该配置文件就会被覆盖。

  • 用户级配置文件。通常在$HOME目录下。可以用matplotlib.get_configdir()命令来查找当前用户的配置文件目录。

    恢复默认配置

  • 当前工作目录。即项目的目录。在当前目录下,可以为目录所包含的当前项目给出配置文件,文件名为matplotlibrc

配置文件的内容常见的有以下几种:

  • axes:设置坐标轴边界和表面的颜色、坐标刻度值大小和网格的显示
  • backend:设置目标输出TkAgg和GTKAgg
  • figure:控制dpi、边界颜色、图像大小和子区(subplot)设置
  • font:字体(font family)、字体大小和样式设置
  • grid:设置网格颜色和线型
  • legend:设置图例以及其中的文本显示
  • line:设置线条(颜色、线型、宽度等)和标记
  • patch: 填充2D空间的图形图像,如多边形和圆。控制线宽、颜色和抗锯齿设置等。
  • savefig:对保存的图形进行单独设置。如渲染的文件背景为白色。
  • text:设置字体颜色、文本解析(纯文本和latex标记)等。
  • verbose:设置matplotlib执行期间的信息输出,如silent、helpful、debug和debug--annoying
  • xticks和yticks:为x、y轴的主刻度和次刻度设置颜色、大小、方向以及标签大小

二、 matplotlib Artist

matplotlib有三个层次的API:

  • matplotlib.backend_bases.FigureCanvas:代表了一个绘图区,在这个绘图区上图表被绘制
  • matplotlib.backend_bases.Renderer:代表了渲染器,它知道如何在绘图区上绘图。
  • matplotlib.artist.Artist:代表了图表组件,它知道如何利用渲染器在绘图区上绘图。

通常用于有95%以上的时机都是与matplotlib.artist.Artist类打交道,它是高层次的绘图控制。

matplotlib中有两种Artist

  • primitive:代表了我们在绘图区域上绘制的基础的绘图组件,比如Line2DRectangleText 以及AxesImage等等。

  • container:代表了放置primitive的那些绘图组件。比如AxisAxes以及Figure,如图所示

    Artist

matplotlib的标准使用流程为:

  • 创建一个Figure实例对象fig
  • 使用fig实例创建一个或者多个Axes实例,或者创建一个或者多个Subplot实例
  • 使用Axes实例的方法来创建primitive

1. Artist的属性

每个在图形中出现的元素都是Artist

  • Figure.patch属性:是一个Rectangle,代表了图表的矩形框,它的大小就是图表的大小, 并且可以通过它设置图表的背景色和透明度。

  • Axes.patch属性:也是一个Rectangle,代表了绘图坐标轴内部的矩形框(白底黑边), 通过它可以设置Axes的颜色、透明度等。

  • 所有的Artist有下列属性。:

    • .alpha属性:透明度。值为0--1之间的浮点数
    • .animated属性:一个布尔值,表示是否用于加速动画绘制
    • .axes属性:返回这个Artist所属的axes,可能为None
    • clip_box属性:用于剪切Artistbounding box
    • clip_on属性:是否开启clip
    • clip_path属性:Artist沿着该path执行clip
    • contains属性:一个picking function用于测试Artist是否包含pick point
    • figure属性:该Artist所属的Figure,可能为None
    • gid属性:该Artistid字符串
    • label:一个text label
    • picker:一个python object用于控制object picking
    • transform:转换矩阵
    • .url属性:一个url string,代表本Artist
    • visible:布尔值,控制Artist是否绘制
    • zorder:决定了Artist的绘制顺序。zorder越小就越底层,则越优先绘制。

    这些属性可以通过旧式的settergetter函数访问和设置。如:

    • o.get_alpha()o.set_alpha(0.5)
    • 如果你想一次设置多个属性,也可以用:o.set(alpha=0.5,zorder=2)这种方式
    • 你可以使用matplotlib.artist.getp(o)来一次获取o的所有属性

    Artist所有属性

2. container Artist:

a. Figure

matplotlib.figure.Figure是最顶层的container Artist,它包含了图表中的所有元素。

  • Figure.patch属性:Figure的背景矩形
  • Figure.axes属性:持有的一个Axes实例的列表(包括Subplot)
  • Figure.images属性:持有的一个FigureImages patch列表
  • Figure.lines属性:持有一个Line2D实例的列表(很少使用)
  • Figure.legends属性:持有的一个Figure Legend实例列表(不同于Axes.legends)
  • Figure.patches属性:持有的一个Figure pathes实例列表(很少使用)
  • Figure.texts属性:持有的Figure Text实例列表
1> Figure 的 Axes

当你执行Figure.add_subplot()或者Figure.add_axes()时,这些新建的Axes都被添加到Figure.axes列表中。

由于Figure维持了current axes,因此你不应该手动的从Figure.axes列表中添加删除元素,而是要通过Figure.add_subplot()Figure.add_axes()来添加元素,通过Figure.delaxes()来删除元素。但是你可以迭代或者访问Figure.axes中的Axes,然后修改这个Axes的属性。

可以通过Figure.gca()获取current axes,通过Figure.sca()设置current axes

2> Figure 的 primitive

Figure也有它自己的textlinepatchimage。你可以直接通过add primitive语句直接添加。但是注意Figure默认的坐标系是以像素为单位,你可能需要转换成figure坐标系:(0,0)表示左下点,(1,1)表示右上点。

Figure

b. Axes类

Axes类是matplotlib的核心,你在大多数时间都是在与它打交道。Axes代表了plotting area。大量的用于绘图的Artist存放在它内部,并且它有许多辅助方法来创建和添加Artist给它自己,而且它也有许多赋值方法来访问和修改这些Artist

它有许多方法用于绘图,如.plot().text().hist().imshow()等方法用于创建大多数常见的primitive(如Line2DRectangleTextImage等等)。这些方法会创建primitive Artist实例,并且添加这些实例到对应的container上去,然后必要的时候会绘制这些图形。

Subplot就是一个特殊的Axes,其实例是位于网格中某个区域的Subplot实例。其实你也可以在任意区域创建Axes,通过Figure.add_axes([left,bottom,width,height])来创建一个任意区域的Axes,其中left,bottom,width,height都是[0--1]之间的浮点数,他们代表了相对于Figure的坐标。

Axes类

1> .patch 属性

Axes包含了一个.patch属性,对于卡迪尔坐标系而言,它是一个Rectangle;对于极坐标而言,它是一个Circle。这个.patch属性决定了plotting region的形状、背景和边框。

Axes背景

2> 常用绘图方法

当调用Axes.plot()方法时,该方法会创建一个matplotlib.lines.Line2D实例,然后会利用传给.plot()的关键字参数来更新该Line2D的属性,然后将这个Line2D添加到Axes.lines列表中。该方法返回的刚创建的Line2D列表,因为你可以传递多个(x,y)值从而创建多个Line2D

当调用Axes.hist()方法时,类似于.plot()方法,不过它会添加patchesAxes.patches列表。

Axe绘图方法

你不应该直接通过Axes.linesAxes.patches列表来添加图表。因为当你通过.plot().hist()等方法添加图表时,matplotlib会做许多工作而不仅仅是添加绘图组件到Axes.lines或者Axes.patches列表中。

但是你可以使用Axes的辅助方法.add_line().add_patch()方法来添加。

Axe手动添加绘图组件

3> 常用 Axes 方法

下面是Axes用于创建primitive Artist以及添加他们到相应的container中的方法:

  • ax.annotate():创建text annotationAnnotate对象),然后添加到ax.texts列表中。
  • ax.bar():创建bar chartRectangle对象),然后添加到ax.patches列表中。
  • ax.errorbar():创建error bar plotLine2D对象和Rectangle对象),然后添加到ax.lines 列表中和ax.patches列表中。
  • ax.fill():创建shared areaPolygon对象),然后添加到ax.patches列表中
  • ax.hist():创建histogramRectangle对象),然后添加到ax.patches列表中。
  • ax.imshow():创建image dataAxesImage对象),然后添加到ax.images列表中。
  • ax.legend():创建axes legendsLegend对象),然后添加到ax.legends列表中。
  • ax.plot():创建xy plotLine2D对象),然后添加到ax.lines列表中。
  • ax.scatter():创建scatter chartsPolygonCollection对象),然后添加到 ax.collections列表中。
  • ax.text():创建textText对象),然后添加到ax.texts列表中。
4> Axes 的坐标轴

另外Axes还包含两个最重要的Artist container

  • ax.xaxisXAxis对象的实例,用于处理xtick以及label的绘制
  • ax.yaxisYAxis对象的实例,用于处理ytick以及label的绘制

Axes包含了许多辅助方法来访问和修改XAxisYAxis,这些辅助方法其实内部调用的是XAxisYAxis的方法。因此通常情况下你不需要直接调用XAxisYAxis的方法。

Axe坐标轴

c. Axis类

matplotlib.axis.Axis实例处理tick linegrid linetick label以及axis label的绘制。通常你可以独立的配置y轴的左边tick以及右边的tick,也可以独立地配置x轴的上边tick以及下边的tick

Axis也存储了数据用于内部的缩放以及自适应处理。它还有Locator实例和Formatter实例用于控制tick摆放的位置以及tick的标注字符串。

每个Axis都有一个.label属性,也有major tick列表和minor tick列表。这些tickXTickYTick的实例,他们存放着实际的line primitive以及text primitive来渲染tick以及ticklabel

tick是动态创建的,只有在需要创建的时候才创建(比如缩放的时候)。Axis也提供了一些辅助方法来获取tick labeltick location等等:

  • Axis.get_major_ticks():获取major tick列表(一个Tick对象的列表)

  • Axis.get_minor_ticks():获取minor tick列表(一个Tick对象的列表)

  • Axis.get_ticklocs():获取tick location列表。 可以通过minor=True|False关键字参数控制输出minor还是majortick location

  • Axis.get_ticklabels():获取tick label列表(一个Text实例的列表)。 可以通过minor=True|False关键字参数控制输出minor还是majortick label

  • Axis.get_ticklines():获取tick line列表(一个Line2D实例的列表)。 可以通过minor=True|False关键字参数控制输出minor还是majortick line

  • Axis.get_scale():获取坐标轴的缩放属性,如'log'或者'linear'

  • Axis.get_view_interval():获取内部的axis view limits实例

  • Axis.get_data_interval():获取内部的axis data limits实例

  • Axis.get_gridlines():获取grid line的列表

  • Axis.get_label():获取axis label(一个Text实例)

  • Axis.get_major_locator():获取major tick locator(一个matplotlib.ticker.Locator实例)

  • Axis.get_minor_locator():获取minor tick locator(一个matplotlib.ticker.Locator实例)

  • Axis.get_major_formatter():获取major tick formatter(一个matplotlib.ticker.Formatter实例)

  • Axis.get_minor_formatter():获取minor tick formatter(一个matplotlib.ticker.Formatter实例)

  • Axis.grid():一个开关,用于控制major或者minortickon|off

    Axis tick

d. Tick类

matplotlib.axis.Tick类是从Figure-->Axes-->Tick这个container体系中最末端的containerTick容纳了tickgrid line以及tick对应的label。所有的这些都可以通过Tick的属性获取:

  • Tick.tick1line:一个Line2D实例
  • Tick.tick2line:一个Line2D实例
  • Tick.gridline:一个Line2D实例
  • Tick.label1:一个Text实例
  • Tick.label2:一个Text实例
  • Tick.gridOn:一个布尔值,决定了是否绘制tickline
  • Tick.tick1On:一个布尔值,决定了是否绘制1st tickline
  • Tick.tick2On:一个布尔值,决定了是否绘制2nd tickline
  • Tick.label1On:一个布尔值,决定了是否绘制1st tick label
  • Tick.label2On:一个布尔值,决定了是否绘制2nd tick label

y轴分为左右两个,因此tick1*对应左侧的轴;tick2*对应右侧的轴。 x轴分为上下两个,因此tick1*对应上侧的轴;tick2*对应下侧的轴。

Tick

3. primitive

a. Line2D类

matplotlib.lines.Line2D类是matplotlib中的曲线类(基类是matplotlib.artist.Artist),它可以有各种各样的颜色、类型、以及标注等等。它的构造函数为:

Line2D(xdata, ydata, linewidth=None, linestyle=None,
	color=None, marker=None, markersize=None, markeredgewidth
	=None, markeredgecolor=None, markerfacecolor
	=None, markerfacecoloralt=’none’, fillstyle=None,
	antialiased=None, dash_capstyle=None, solid_capstyle=None,
	dash_joinstyle=None, solid_joinstyle=None, pickradius=5,
	drawstyle=None, markevery=None, **kwargs)

这些关键字参数都是Line2D的属性。其属性有:

  • 继承自Artist基类的属性: .alpha.animated.axes.clip_box、..clip_on.clip_path.contains.figure.gid.label.picker.transform.url.visible.zorder
  • .antialiased或者.aa属性:一个布尔值。如果为True则表示线条是抗锯齿处理的
  • .color或者.c属性:一个matplotlib color值,表示线条的颜色,
  • .dash_capstyle属性:为'butt' or 'round' or 'projecting',表示虚线头端类型
  • .dash_joinstyle属性:为'miter' or 'round' or 'bevel',表示虚线连接处类型
  • .dashes属性:一个数值序列,表示虚线的实部、虚部的尺寸。如果为(None,None)则虚线成为实线
  • .drawstyle属性:为'default'or'steps'or'step-pre'or'step-mid'or'step-post',表示曲线类型。
    • 'default':点之间以直线连接
    • 'steps*':绘制阶梯图。其中steps等价于steps-pre,是为了保持兼容旧代码
  • .fillstyle属性:为'full'or'left'or'right'or'bottom'or'top'or'none'表示marker的填充类型。
    • 'full':填充整个marker
    • none:不填充marker
    • 其他值:表示填充一半marker
  • .linestyle或者ls属性:指定线型,可以为以下值:
    • '-'或者'solid':表示实线
    • '--'或者dashed:表示虚线
    • '-.'或者dash_dot:表示点划线
    • ':'或者'dotted':表示点线
    • 'None'或者' '或者'':表示没有线条(不画线)
  • .linewidth或者lw属性:为浮点值,表示线条宽度
  • .marker属性:可以为一系列的字符串,如'.'、','、'o'....,表示线条的marker
  • .markeredgecolor或者.mec属性:可以为matplotlib color,表示marker的边的颜色
  • .markeredgewidth或者.mew属性:可以为浮点数,表示marker边的宽度
  • .markerfacecolor或者.mfc属性:可以为matplotlib color,表示marker的前景色
  • .markerfacecoloralt或者.mfcalt属性:可以为matplotlib color,表示marker的可选前景色
  • .markersize或者.ms属性:可以为浮点数,表示marker的大小
  • .markevery属性:指定每隔多少个点绘制一个marker,可以为以下值:
    • None:表示每个点都绘制marker
    • N:表示每隔N个点绘制marker,从0开始
    • (start,N):表示每隔N个点绘制marker,从start开始
    • [i,j,m,n]:只有点i,j,m,nmarker绘制
    • ...其他值参考文档
  • .pickradius属性:浮点值,表示pick radius
  • .solid_capstyle属性:可以为'butt'、'round'、'projecting',表示实线的头端类型
  • .sold_joinstyle属性:可以为'miter'、'round'、'bevel',表示实线连接处的类型
  • .xdata属性:可以为一维的numpy.array,表示x轴数据
  • .ydata属性:可以为一维的numpy.array,表示y轴数据

b. Text类

matplotlib.text.Text类是绘制文字的类(基类是matplotlib.artist.Artist)。它的构造函数为:

Text(x=0, y=0, text='', color=None, verticalalignment='baseline',
	horizontalalignment=’left’, multialignment=None, fontproperties
	=None, rotation=None, linespacing=None, rotation_
	mode=None, usetex=None, wrap=False, **kwargs)

这些关键字参数也是属性。其属性有:

  • 继承自Artist基类的属性: .alpha.animated.axes.clip_box、..clip_on.clip_path.contains.figure.gid.label.picker.transform.url.visible.zorder
  • .backgroundcolor属性:背景色,可以为任何matplotlib color
  • .bbox属性:文本框的边框。其值是FancyBboxPatch类的属性字典。
  • .color属性:字体颜色,可以为任何matplotlib color
  • .family或者.name或者.fontfamily或者.fontname属性:字体的名字。可以是string或者string list(表示可以为若干个名字,优先级依次递减)。string必须是一个真实字体的名字,或者一个字体的class name
  • .fontproperties或者.font_properties属性:字体的属性,值是一个matplotlib.font_manager.FontProperties实例(该实例一次性设置字体的很多属性,比如字体类型、字体名字、字体大小、宽度、...)
  • .horizontalalignment或者.ha属性:水平对齐方式,可以为'center'、'right'、'left'
  • .linespacing属性:为浮点数,单位为font size,表示行间距
  • .multialignment属性:multiline text对齐方式,可以为'left'、'right'、'center'
  • .position属性:为一个元组(x,y),表示文本框的位置
  • .rotation属性:字体旋转角度。可以为下列值:
    • 浮点数,表示角度
    • 'vertical'、'horizontal'
  • .rotation_mode属性:旋转模式。可以为下列值:
    • 'anchor':文本首先对齐,然后根据对齐点来旋转
    • None:文本先旋转,再对齐
  • .size或者.fontsize属性:字体大小。可以为下列值:
    • 浮点值,表示字体大小
    • 'xx-small'、'x-small'、'small'、'medium'、'large'、'x-large'、'xx-large'
  • .stretch或者.fontstretch属性:字体沿水平方向的拉伸。可以为下列值:
    • 整数,在[0---1000]之间
    • 'ultra-condensed'、'extra-condensed'、'condensed'、'semi-condensed'、'normal'、'semi-expanded'、'expanded'、'extra-expanded'、'ultra-expanded'
  • .style或者.fontstyle属性:字体样式,可以为'normal'、'italic'、'oblique'
  • .text属性:文本字符串,可以为任意字符串(他可以包含'\n'换行符或者LATEX语法)
  • .variant或者.fontvariant属性:表示字体形变,可以为下列值:'normal'、'small-caps'
  • .verticalalignment或者.ma或者.va属性:表示文本的垂直对齐,可以为下列值:
    • 'center'、'top'、'bottom'、'baseline'
  • .weight或者.fontweight属性:设置字体的weight,可以为下列值:
    • 一个整数值,在[0---1000]之间
    • 'ultralight'、'light'、'normal'、'regular'、'book'、'medium'、 'roman'、'semibold'、'demibold'、'demi'、'bold'、'heavy'、 'extrabold'、'black'
  • .x属性:一个浮点值,表示文本框位置的x
  • .y属性:一个浮点值,表示文本框位置的y

c. Annotation类

matplotlib.text.Annotation类是图表中的图式,它是一个带箭头的文本框,用于解说图表中的图形。它的基类是matplotlib.text.Text matplotlib.text._AnnotationBase。其构造函数为:

Annotation(s, xy, xytext=None, xycoords=’data’, textcoords=None, arrowprops
	=None, annotation_clip=None, **kwargs)

在位置xytext处放置一个文本框,该文本框用于解释点xy,文本框的文本为s

  • s:文本框的文本字符串
  • xy:被解释的点的坐标
  • xytext:文本框放置的位置。如果为None,则默认取xy
  • xycoordsxy坐标系,默认取'data'坐标系(即xy是数据坐标系中的点)。可以为以下值:
    • 'figure points':从figure左下角开始的点
    • 'figure pixesl':从figure左下角开始的像素值
    • 'figure fraction'(0,0)代表figure的左下角,(1,1)代表figure的右上角
    • 'axes points':从axes左下角开始的点
    • 'axes pixels':从axes左下角开始的像素
    • 'axes fraction'(0,0)代表axes的左下角,(1,1)代表axes的右上角
    • 'data':使用被标注对象的坐标系
    • 'offset points':指定从xy的便宜点
    • 'polar':极坐标系
  • textcoords:文本框坐标系(即xytext是文本坐标系中的点),默认等于xycoords
  • arrowprops:指定文本框和被解释的点之间的箭头。如果不是None,则是一个字典,该字典设定了matplotlib.lines.Line2D的属性。
    • 如果该字典有一个arrowstyle属性,则该键对应的值也是一个字典,创建一个FancyArrowsPatch实例, 实例属性由该字典指定。
    • 如果该字典没有arrowstyle属性,则创建一个YAArrow实例,
  • annotation_clip:控制超出axes区域的annotation的显示。如果为Trueannotation 只显示位于axes区域内的内容。
  • 额外的关键字参数全部是设置Text的属性

d. Legend

matplotlib.legend.Legend是图例类,它的基类是matplotlib.artist.Artist。其构造函数为:

Legend(parent, handles, labels, loc=None, numpoints=None, markerscale
	=None, markerfirst=True, scatterpoints=None,
	scatteryo�sets=None, prop=None, fontsize=None, borderpad
	=None, labelspacing=None, handlelength=None,
	handleheight=None, handletextpad=None, borderaxespad
	=None, columnspacing=None, ncol=1, mode=None,
	fancybox=None, shadow=None, title=None, framealpha
	=None, bbox_to_anchor=None, bbox_transform=None,
	frameon=None, handler_map=None)

其关键字参数为:

  • parent:持有该legendartist
  • loc:图例的位置。其值可以为字符串或者数字:
    • best或0:自动计算
    • upper right或1: 右上角
    • upper left或2:上角
    • lower left或3:下角
    • lower right或4:右下角
    • right或5:右边
    • center left或6:中间偏左
    • center right或7:中间偏右
    • lower center或8:中间底部
    • upper center或9:中间顶部
    • center或10:正中央
  • handle:一个artist列表,添加这些artistlegend
  • lebels:一个字符串列表添加到legend
  • prop:字体属性
  • fontsize: 字体大小(只有prop未设置时有效)
  • markerscale: marker的缩放比例(相对于原始大小)
  • markerfirst: 如果为True,则marker放在label左侧;否则marker放在label右侧
  • numpoints: the number of points in the legend for line
  • scatterpoints: the number of points in the legend for scatter plot
  • scatteryo�sets: a list of yo�sets for scatter symbols in legend
  • frameon: if True, draw a frame around the legend. If None, use rc
  • fancybox: if True, draw a frame with a round fancybox. If None, use rc
  • shadow: if True, draw a shadow behind legend
  • framealpha: If not None, alpha channel for the frame.
  • ncol: number of columns
  • borderpad: the fractional whitespace inside the legend border
  • labelspacing: the vertical space between the legend entries
  • handlelength: the length of the legend handles
  • handleheight: the height of the legend handles
  • handletextpad: the pad between the legend handle and text
  • borderaxespad: the pad between the axes and legend border
  • columnspacing:the spacing between columns
  • title: 图例的标题
  • bbox_to_anchor: the bbox that the legend will be anchored.
  • bbox_transform: the transform for the bbox. transAxes if Noneloc a location code
  • 其他关键字参数用于设置属性

属性为:

  • 继承自Artist基类的属性: .alpha.animated.axes.clip_box、..clip_on.clip_path.contains.figure.gid.label.picker.transform.url.visible.zorder

e. Patch类

matplotlib.patches.Patch类是二维图形类。它的基类是matplotlib.artist.Artist。其构造函数为:

Patch(edgecolor=None, facecolor=None, color=None,
linewidth=None, linestyle=None, antialiased=None,
hatch=None, fill=True, capstyle=None, joinstyle=None,
**kwargs)

参数为:

  • edgecolor:可以为matplotlib color,表示边线条的颜色,若为none则表示无颜色
  • facecolor:可以为matplotlib color,表示前景色,若为none则表示无颜色
  • color可以为matplotlib color,表示边线条和前景色的颜色。
  • linewidth:为浮点数,表示线条宽度
  • linestyle:指定线型,可以为以下值:
    • '-'或者'solid':表示实线
    • '--'或者dashed:表示虚线
    • '-.'或者dash_dot:表示点划线
    • ':'或者'dotted':表示点线
    • 'None'或者' '或者'':表示没有线条(不画线)
  • antialiased:一个布尔值。如果为True则表示线条是抗锯齿处理的
  • hatch:设置hatching pattern,可以为下列的值:
    • '\''|''-''+''x''o''0''.''*'
  • fill:为布尔值。如果为True则填充图形,否则不填充
  • capstyle:为'butt' or 'round' or 'projecting',表示线条头端类型
  • joinstyle:可以为'miter'、'round'、'bevel',表示矩形线条接头类型
  • 其他关键字参数用于设置属性

如果 edgecolor, facecolor, linewidth, or antialiasedNone则这些值从 rc params中读取

属性如下:

  • 继承自Artist基类的属性: .alpha.animated.axes.clip_box、..clip_on.clip_path.contains.figure.gid.labelpath_e�ects.picker.transform.url.visible.zorder
  • .antialiased或者.aa属性:一个布尔值。如果为True则表示线条是抗锯齿处理的
  • .capstyle属性:为'butt' or 'round' or 'projecting',表示线条头端类型
  • .color属性:可以为matplotlib color,表示边线条和前景色的颜色。
  • .edgecolor或者.ec属性:可以为matplotlib color,表示边线条的颜色,若为none则表示无颜色
  • .facecolor或者.fc属性:可以为matplotlib color,表示前景色,若为none则表示无颜色
  • .fill属性:为布尔值。如果为True则填充图形,否则不填充
  • .hatch属性:设置hatching pattern,可以为下列的值:
    • '\''|''-''+''x''o''0''.''*'
  • .joinstyle属性:可以为'miter'、'round'、'bevel',表示矩形线条接头类型
  • .linestyle或者.ls属性:指定线型,可以为以下值:
    • '-'或者'solid':表示实线
    • '--'或者dashed:表示虚线
    • '-.'或者dash_dot:表示点划线
    • ':'或者'dotted':表示点线
    • 'None'或者' '或者'':表示没有线条(不画线)
  • .linewidth或者.lw属性:为浮点数,表示线条宽度

f. Rectangle 类

matplotlib.patches.Rectangle类是矩形类(基类是matplotlib.patches.Patch),其构造函数为:Rectangle(xy,width,height,angle=0.0,**kwargs)。 参数为:

  • xy:矩形左下角坐标
  • width:矩形宽度
  • height:矩形高度
  • 其他关键字参数用于设置属性

其属性有:

  • 继承自Artist基类的属性: .alpha.animated.axes.clip_box、..clip_on.clip_path.contains.figure.gid.label.picker.transform.url.visible.zorder
  • 继承自Patch基类的属性: .antialiased或者.aa.capstyle.color.edgecolor或者.ec.facecolor或者.fc.fill.hatch.joinstyle.linestyle或者.ls.linewidth或者.lw属性

g. Polygon类

matplotlib.patches.Polygon类是多边形类。其基类是matplotlib.patches.Patch。其构造函数为: Polygon(xy, closed=True, **kwargs)。参数为:

  • xy是一个N×2numpy array,为多边形的顶点。
  • closedTrue则指定多边形将起点和终点重合从而显式关闭多边形。
  • 其他关键字参数用于设置属性

Polygon的属性有:

  • 继承自Artist基类的属性: .alpha.animated.axes.clip_box、..clip_on.clip_path.contains.figure.gid.label.picker.transform.url.visible.zorder
  • 继承自Patch基类的属性: .antialiased或者.aa.capstyle.color.edgecolor或者.ec.facecolor或者.fc.fill.hatch.joinstyle.linestyle或者.ls.linewidth或者.lw属性

h. PolyCollection类

matplotlib.collections.PolyCollection是多边形集合类,其基类是matplotlib.collections._CollectionWithSizes。它的构造函数为:

PolyCollection(verts, sizes=None, closed=True, **kwargs)

其关键字参数为:

  • verts:一个顶点序列。每个顶点都由xy元组或者xy数组组成
  • sizes:一个浮点数序列,依次指定每个顶点正方形的边长。如果序列长度小于顶点长度,则循环从序列头部再开始挑选
  • closed:如果为True,则显式封闭多边形
  • edgecolors: collection的边的颜色
  • 其他关键字参数用于设置属性

下面为属性:

  • 继承自Artist基类的属性: .alpha.animated.axes.clip_box、..clip_on.clip_path.contains.figure.gid.label.picker.transform.url.visible.zorder
  • .facecolors: collection的前景色
  • .linewidths: collection的边线宽
  • .antialiaseds:抗锯齿属性,可以为True或者False
  • .off�sets: 设置collection的偏移
  • .norm: 归一化对象
  • .cmap:color map

三、基本概念

matplotlib被划分为不同的层次:

  • matplotlib.pyplot模块:位于matplotlib的顶层,它是一个state-machine environment。该模块中的很多函数是用于给当前Figure的当前Axes添加plot element,比如linetextimage等。它非常类似于Matlab的用法。
  • 下一层是面向对象的接口:在这一层pyplot只是用部分函数来创建Figure,然后通过该Figure显式的创建Axes,然后通过面向对象的接口在该Axes上添加图形。极端情况下用户可以完全抛弃pyplot而完全使用面向对象的接口。

对于非交互式绘图,官方文档推荐用pyplot创建Figure,然后使用面向对象接口来绘图。

1. 输入数据

matplotlib的所有plotting function期待输入numpy.array或者numpy.ma.masked_array类型的数据作为输入。某些长得像numpy.array的数据比如numpy.matrix类型的输入数据可能会导致matplotlib工作异常。如果确实需要使用numpy.matrix,你应该首先将它转换为numpy.array

2. matplotlib 、 pyplot 、 pylab 的关系

  • matplotlib:它是整个package
  • matplotlib.pyplot:是matplotlib的一个module。它为底层的面向对象接口提供了一个state-machine interface。这个state-machine必要的时候隐式创建FigureAxes,并维护current Figurecurrent Axes
  • pylab是一个便利的module,它导入了matplotlib.pyplot以及numpy,它只是为了plot以及math方便而用。官方文档不推荐使用它。

3. 代码风格

官方文档不推荐 MATLAB风格的代码。因为MATLAB风格代码维护了全局状态,你执行同一个plot多次可能会发现结果是不同的。 官方文档推荐使用如下风格:

import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(...)
ax.show()

这样的风格使得在绘图事件中,每个角色都很清楚,数据的流动也很清楚。

4. backend

matplotlib可以适用于非常广泛的场景:

  • matplotlib可以交互式地用于python shell
  • matplotlib可以嵌入到wxpython或者pygtkGUI程序中
  • matplotlib可以在脚本中使用从而生成postscript image

为了适应于这些场景,matplotlib针对这些target生成不同的输出格式。这种能力称之为backend

与之相对的frontend指的是用户使用matplotlib而编写的代码

有两种类型的backend

  • 交互式的backend:应用于pygtkwxpythontkinterqt4macosx等中
  • 非交互式的backend:用于生成image file(如PNG、SVG、PDF、PS等格式文件,这些backend的名字暗示了要存储的文件的格式)

有多种方法来设置backend,其中后面提到的方法会覆盖前面的方法设置的backend

  • matplotlibrc配置文件中设置的backend参数,如backend: WXAgg #使use wxpython with antigrain(agg) rendering
  • 设置MPLBACKEND环境变量,无论是在shell中设置还是在脚本中设置。
  • 对单个脚本设置backend时,可以直接在python命令后添加-d命令(这种方法不推荐,deprecated
  • 在脚本中使用特定的backend时,可以用matplotlib.use('PDF')命令。这条语句必须在import matplotlib.pyplot语句之前执行。如果在import matplotlib.pyplot之后执行use语句,则没有任何效果。通常建议避免使用use()方法,因为使用该脚本的人无法修改backend了。
  • 设定backend时,是忽略大小写的。因此GTKAgg也等价于gtkagg

  • 查看当前的backend可以用:matplotlib.get_backend()

a. rendering engine

matplotlib提供的常用的rendering engineAgg,它采用的是Anti-Grain Geometry C++ library。除了macosx之外的所有user interface都可以用agg rendering,如WXAgg,GTKAgg,QT4Agg,TkAgg这些backend。 某些user interface还支持其他引擎,如GTK支持Cario引擎,如GTKCariro backend

下面是所有的Rendering engine

  • AGG:输出png格式文件。它可以输出高质量的图形
  • PS:输出ps\eps格式文件。它是Postscript output
  • PDF:输出pdf格式文件。
  • SVG:输出svg格式文件
  • Cairo:可以输出png、ps、pdf、svg...等格式文件
  • GDK:可以输出png、jpg、tiff...等格式文件,它使用Gimp Drawing Kit

要想保存成指定类型文件,如PDF,那么首先要设置合适的backend

5. 交互式模式

使用交互式backend可以plotting to the screen,但是前提是matplotlib必须是interactive mode

你可以在matplotlibrc配置文件中设置matplotlib是否位于交互模式,也可以通过代码matplotlib.interacite()来设置matplotlib位于交互模式。你可以通过代码matplotlib.is_interactive()来判断代码是否交互模式。通常并不建议在绘图过程中修改交互模式,因此要提前修改交互模式再绘图。

交互模式也可以通过matplotlib.pyplot.ion()开启交互模式,由matplotlib.pyplot.ioff()关闭交互模式。另外交互模式支持ipythonpython shell,但是不支持IDLE IDE

交互模式

在交互模式下:

  • pyplot.plot()绘图之后图表马上显示,pyplot自动绘制到屏幕,不需要调用pyplot.show()
  • 图表显式之后你可以继续输入命令。任何对图形的修改会实时的反应到图表中去。
  • 使用面向对象的方法,如Axes的方法并不会自动调用draw_if_interactive()。如果你通过Axes来修改图表,想更新图表的话那么你需要手动调用.draw()方法。而pyplot模块中的函数会主动调用draw_if_interactive(),因此如果你是通过pyplot模块修改图表那么不需要手动调用.draw()方法就是实时绘制。

在非交互模式下:

  • 在绘图之后必须手动调用pyplot.show()才能显示图表。该函数会阻塞执行直到你关闭了图表窗口。
  • 所有的绘制工作会延迟到pyplot.show()函数调用
  • 在1.0版本以前,单个脚本文件中只能调用一次pyplot.show(),在1.01版本之后该限制被放松。

6. matplotlib的颜色

可以通过matplotlib.pyplot.colors()方法获取matplotlib支持的所有颜色。该方法不做任何事情,就是提供一个帮助文档。

matplotlib提供了下面颜色的别名:'b':蓝色;'g':绿色;'r':红色;'y':黄色;'c':青色;'k':黑色;'m':洋红色;'w':白色。

你也可以定制自己的颜色。有两种方法:

  • 使用HTML十六进制字符串:如'#eeefff'
  • 使用HTML颜色名字:如'red'
  • 使用一个归一化到闭区间[0-1]的RGB元组:如color=(0.3,0.3,0.4)

在创建Axes或者SubPlot时,可以给构造函数提供一个axisbg参数来指定背景色

四、布局

1. 简单布局

简单布局通过Figure.add_subplot(*args,**kwargs)方法来完成,它返回的是Axes实例。当然你也可以通过pyplot.subplot(*args,**kwargs)函数来完成,他返回的也是Axes实例,该函数只是一个便利函数。

SubPlot类是Axes类的子类。因此SubPlot对象也是Axes对象。

a. 典型用法

最典型用法是matplotlib.pyplot.subplot(nrows,ncols,plot_number)nrowsncols将图表划分成nrows*ncols大小的网格区域,每一个区域都能存放一个SubPlot;该函数创建plot_number位置处的SubPlot-axes。其中plot_number起始于1,最大值为nrows*ncols

如果nrowsncolsplot_number都是个位数,则你可以指定一个三位数来简化函数调用matplotlib.pyplot.subplot(integer),其中百分位代表nrows,十分位代表ncols,各位代表plot_number

b. 参数

  • axisbg关键字参数:指定subplot的背景色
  • polar关键字参数:指定subplot是否是极坐标。默认为False
  • projection
  • sharex关键字参数:指定subplot与其他Axes(由该参数值指定)共享xaxis attribute
  • sharey关键字参数:指定subplot是否与其他Axes(由该参数值指定)共享yaxis attribute

c. pyplot.subplots() 函数

你可以通过pyplot.subplots()函数一次性的创建多个SubPlot

pyplot.subplot()每次只会创建一个SubPlot

pyplot.subplots

其参数有:

  • nrows:行数,默认为1

  • ncols:列数,默认为1

  • sharex

    • 如果为True,则所有SubPlotX axis被共享。此时只有最后一行的X轴可见。
    • 如果为False,则SubPlotX axis不共享,每一个SbuPlotX轴可见。
    • 如果为字符串all,则等效于True
    • 如果为字符串none,则当小于False
    • 如果为字符串row,则每一行的SubPlot共享一个X轴(与False等效)
    • 如果为字符串col,则每一列的SubPlot共享一个X轴(与True等效)

    pyplot.subplots(sharex=True)

    pyplot.subplots(sharex='row')

    pyplot.subplots(sharex='col')

  • sharey

    • 如果为True,则所有SubPlotY axis被共享。此时只有第一列的Y轴可见。
    • 如果为False,则SubPlotY axis不共享,每一个SbuPlotY轴可见。
    • 如果为字符串all,则等效于True
    • 如果为字符串none,则当小于False
    • 如果为字符串row,则每一行的SubPlot共享一个Y轴(与True等效)
    • 如果为字符串col,则每一列的SubPlot共享一个Y轴(与False等效)
  • squeeze

    • 如果为True
      • 如果只创建了一个SubPlot,则返回一个变量(创建的SubPlot对象)
      • 如果创建了N*1或者1*NSubPlot,则返回一个1维向量
      • 如果创建了N*MSubPlot(其中N>1,M>1),则返回一个2维向量
    • 如果为False则始终返回一个2维向量
  • subplot_kw:一个字典参数,用于传递给Axes.add_subplot()来创建SubPlot

  • gridspec_kw:一个字典参数,用于传递给GridSpec构造函数来创建SubPlot存放的网格

  • fig_kw:一个字典参数,用于传递给pyplot.figure()函数。所有前述未能识别的感激案子参数都会传到这里。

其返回值为figure,ax。其中figure是一个Figure对象;ax取决于squeeze参数。

2. 使用 pyplot.subplot2grid() 函数

使用pyplot.subplot2grid()函数时,你只需要提供网格形状以及SubPlot位置即可,如: ax=pyplot.subplot2grid((2,2),(0,0)),它等价于ax=pyplot.subplot(2,2,1)。其中subplot2grid()的位置坐标从0开始。

subplot2grid()支持SubPlot横跨或者纵跨多个单元格。colspan关键字参数指定纵向的跨度;rowspanguan尖子参数指定横向的跨度。

pyplot.subplot2grid()

3. 使用 GridSpec 和 SubplotSpec

你可以直接创建matplotlib.gridspec.GridSpec然后通过它来创建SubPlot。如:

gs=matplotlib.gridspec.GridSpec(2,2) #网格2行2列
matplotlib.pyplot.subplot(gs[0,0])

等价于`matplotlib.pyplot.subplot2grid((2,2),(0,0))

GridSpec对对象提供了类似array的索引方法,其索引的结果是一个SubplotSpec对象实例。如果你想创建横跨多个网格的SubplotSpec,那么你需要对GridSpec对象执行分片索引,如pyplot.subplot(gs[0,:-1])

使用GridSpec和SubplotSpec

a. 调整 GridSpec layout

如果你使用GridSpec,那么你可以调整由GridSpec创建的SubplotSpeclayout parameter。如:

gs=gridspec.GridSpec(3,3)
gs.update(left=0.05,right=0.48,wspace=0.05)

这种用法类似于subplots_adjust,但是它仅仅影响由本GridSpec创建的SubplotSpec。其中gs.update()的关键字参数有:

  • left关键字参数:subplot左侧宽度
  • right关键字参数:subplot右侧宽度
  • bottom关键字参数:subplot底部高度
  • top关键字参数:subplot顶部高度
  • wspace关键字参数:subplot之间的空白宽度
  • hspace关键字参数:subplot之间的空白的高度

b. 从 SubplotSpec 创建 GridSpec :

你可以从SubplotSpec创建GridSpec。此时layout parameter由该SubplotSpec指定。如:

gs0=gridspec.GridSpec(1,2)
gs00=gridspec.GridSpecFromSubplotSpec(3,3,subplot_spec=gs0[0])

matplotlib.gridspec.GridSpecFromSubplotSpec(nrows, ncols, subplot_spec, wspace=None, hspace=None,height_ratios=None,width_ratios=None):创建一个GridSpec,它的subplot layout parameter继承自指定的SubplotSpec。其中nrows为网格行数,ncols为网格列数,subplot_spec为指定的SubplotSpec

从SubplotSpec创建GridSpec

c. 创建不同大小的 GridSpec 网格

默认情况下,GridSpec创建的网格都是相同大小的。当然你可以调整相对的高度和宽度。注意这里只有相对大小(即比例)是有意义的,绝对大小值是没有意义的。如:

gs=gridspec.GridSpec(2,2,width_ratios=[1,2],height_ratios=[4,1]
plt.subplot(gs[0]
....

这里width_ratios关键字参数指定了一行中,各列的宽度比例(有多少列就有多少个数字); height_ratios关键字参数指定了一列中,各行的高度比例(有多少行就有多少个数字)。

不同大小的GridSpec网格

d. GridSpec.tight_layout()

GridSpec.tight_layout(fig, renderer=None, pad=1.08, h_pad=None, w_pad=None, rect=None):tight_layout能够自动调整subplot param从而使得subplot适应figure area。它仅仅检查ticklabel、axis label、title等内容是否超出绘制区域。其参数为:

  • fig关键字参数:Figure对象,图表。
  • pad关键字参数:一个浮点数,单位是fontsize,表示figure edgeedges of subplots之间的填充区域。
  • h_pad关键字参数:一个浮点数,单位是fontsize,示subplots之间的高度,默认为pad
  • w_pad关键字参数:一个浮点数,单位是fontsize,示subplots之间的宽度,默认为pad
  • rect关键字参数:如果给定了该参数为一个列表或元组(是一个矩形的四要素,分别代表左下角坐标,宽度,高度),则指定了网格的轮廓矩形,所有的subplots都位于该矩形中。其坐标系是figure coordinate,从[0...1],如果没有提供该参数,则默认为(0, 0, 1, 1)

当然你可以使用matplotlib.pyplot.tight_layout()来达到同样的效果。

GridSpec.tight_layout()

五、 Path

matplotlib.patch对象底层的对象就是Path。它的基本用法如下:

import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches
verts = [
(0., 0.), # left, bottom
(0., 1.), # left, top
(1., 1.), # right, top
(1., 0.), # right, bottom
(0., 0.), # ignored
]
codes = [Path.MOVETO,
Path.LINETO,
Path.LINETO,
Path.LINETO,
Path.CLOSEPOLY,
]
path = Path(verts, codes)
fig = plt.figure()
ax = fig.add_subplot(111)
patch = patches.PathPatch(path)
ax.add_patch(patch)
ax.set_xlim(-2,2)
ax.set_ylim(-2,2)
plt.show()

Path

1. 创建和使用 PATH

PATH对象的创建通过matplotlib.path.Path(verts,codes)创建,其中:

  • vertsPATH的顶点。这些顶点必须构成一个封闭曲线。其中每个顶点必须指定x坐标和y坐标。
  • codes:指示如何使用这些PATH顶点。它与verts关系是一一对应的。有如下指令:
    • Path.STOP:结束path的标记
    • Path.MOVETO:画笔提起并移动到指定的顶点
    • Path.LINETO:画笔画直线,从current position到指定的顶点
    • Path.CURVE3:画笔画二阶贝塞尔曲线,从current position到指定的end point, 其中还有一个参数是指定的control point
    • Path.CURVE4:画笔画三阶贝塞尔曲线,从current position到指定的end point, 其中还有两个参数是指定的control points
    • Path.CLOSEPOLY:指定的point参数被忽略。该指令画一条线段, 从current pointstart point

可以通过matplotlib.patches.PathPatch(path)来构建一个PathPatch对象,然后通过Axes.add_patch(patch)Axes添加PathPatch对象.这样就添加了Path到图表中。

贝塞尔曲线

2. Compound Path

matplotlib中所有简单的patch primitive,如RectangleCirclePolygon等等,都是由简单的Path来实现的。而创建大量的primitive的函数如hist()bar()(他们创建了大量的Rectanle)可以使用一个compound path来高效地实现。

但是实际上bar()创建的是一系列的Rectangle,而没有用到compound path,这是由于历史原因,是历史遗留问题。(bar()函数先于Coupound Path出现)

下面是一个Compound Path的例子:

... 
verts = np.zeros((nverts, 2))  # nverts为顶点的个数加1(一个终止符)
codes = np.ones(nverts, int) * Path.LINETO
## 设置 codes :codes分成5个一组,
## 每一组以Path.MOVETO开始,后面是3个Path.LINETO,最后是Path.CLOSEPOLY 
codes[0::5] = Path.MOVETO
codes[4::5] = Path.CLOSEPOLY
## 设置顶点 verts ##
...
## 创建 Path 、PathPatch并添加  ##
barpath = Path(verts, codes)
patch = patches.PathPatch(barpath, facecolor='green',edgecolor='yellow', alpha=0.5)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.add_patch(patch)
ax.show()

六、 path effect

matplotlibpatheffects模块提供了一些函数来绘制path effect,该模块还定义了很多effect类。可以应用path effectArtist有:PatchLine2DCollection以及Text。每个Artistpath effect可以通过.set_path_effects()方法控制,其参数是一个可迭代对象,迭代的结果是AbstractPathEffect实例;也可以通过Artist构造函数的path_effects=关键字参数控制。

注意:effect类的关键字参数比如背景色、前景色等与Artist不同。因为这些effect类是更低层次的操作。

所有的effect类都继承自matplotlib.patheffects.AbstractPathEffect类。AbstractPathEffect的子类要覆盖AbstractPathEffect类的.draw_path(...)方法。

AbstractPathEffect类的构造函数有个offset关键字参数,表示effect偏移(默认为(0,0))

1. normal effect

最简单的effectnormal effect,它是matplotlib.patheffects.Normal类。它简单的绘制Artist,不带任何effect

如:

import matplotlib.pyplot as plt
import matplotlib.patheffects as path_effects
fig = plt.figure(figsize=(5, 1.5))
text = fig.text(0.5, 0.5, 'Hello path effects world!\nThis is the normal path effect.',
ha='center', va='center', size=20)
text.set_path_effects([path_effects.Normal()])
plt.show()

normal effect

2. drop-shadow effect

我们可以在基于PathArtist上应用drop-shadow effect(下沉效果)。如可以在filled patch Artist上应用matplotlib.patheffects.SimplePatchShadow,在line patch Artist上应用matplotlib.patheffects.SimpleLineShadow

drop-shadow effect

你可以通过path_effects=[path_effects.with*()]来指定path_effects参数,或者直接通过path_effects=[path_effects.SimpleLineShadow(),path_effects.Normal()]来指定path_effects参数。

  • 前者会自动地在normal effect后跟随指定的effect
  • 后者会显式的指定effect

3. stand-out effect

Strok effect可以用于制作出stand-out effect(突出效果)。

stand-out effect

4. 通用 PathPatchEffect

PathPatchEffect是一个通用的path effect类。如果对某个PathPatch设置了PathPatchEffect,则该effect.draw_path(...)方法执行的是由初始PathPatch计算的得到的一个新的PathPatch

与一般的effect类不同,PathPatchEffect类的关键字参数是与PathPatch一致的,因为除了offset关键字参数外,其他的任何关键字参数都会传递给PathPatch构造函数。如:

import matplotlib.pyplot as plt
import matplotlib.patheffects as path_effects
fig = plt.figure(figsize=(8, 1))
t = fig.text(0.02, 0.5, 'Hatch shadow', fontsize=75, weight=1000, va='center')
t.set_path_effects([path_effects.PathPatchEffect(offset=(4, -4), hatch='xxxx',
facecolor='gray'),
path_effects.PathPatchEffect(edgecolor='white', linewidth=1.1,
facecolor='black')])
plt.show()

PathPatchEffect

七、坐标变换

matplotlib中有四个坐标系:

  • 用户级的data坐标系:坐标转换对象为ax.transData。它是用户级坐标系,由xlimylim控制
  • Axes坐标系:坐标转换对象为ax.transAxes。它是Axes的坐标系,(0,0)Axes的左下角,(1,1)Axes的右上角。
  • Figure坐标系:坐标转换对象为fig.transFigure。它是Figure的坐标系,(0,0)Figure的左下角,(1,1)Figure的右上角。
  • display坐标系:它没有坐标转换对象。它显示的是display的像素坐标系,(0,0)display的左下角,(width,height)display的右上角。

前面三个坐标系的坐标转换对象有方法执行坐标转换,这些方法接受输入并产生输出:输入为本坐标系内的坐标点,输出为display坐标系中的坐标。(因此display坐标系没有坐标转换对象)。当然他们也有相关方法将来自于display坐标系中的坐标转换回本坐标系内的坐标。

Artist的构造函数中传入transform关键字参数(其值为坐标转换对象),就能够切换坐标系。如:ax.text(0.05,0.95,label,"This is a Text",transform=ax.transAxes),将Text放置于Axes坐标系中的(0.05,0.95)位置处。

通常不建议直接使用display坐标系。因为它固定了绝对坐标,导致你resize图表时你必须重新定位坐标。所以你必须监听resize事件,非常麻烦。

1. 用户的 data 坐标系

当调用ax.set_xlimit(x_min,x_max)以及ax.set_ylimit(y_min,y_max)时,即建立起了用户data坐标系。左下角坐标为(x_min,y_min),右上角坐标为(x_max,y_max)

有时候你可能并没有显式调用.set_xlimit()以及.set_ylimit()。其实matplotlib会隐式调用它们来设置坐标轴的数据范围。

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim(0, 10)
ax.set_ylim(-1, 1)
type(ax.transData)
ax.transData.transform((5, 0))

你可以调用ax.transData返回data坐标系的坐标转换对象。对该坐标转换对象调用.transform(point)方法会返回pointdisplay坐标系下的坐标。其中point是点在data坐标系下的坐标(x,y)。你也可以给.transform()方法一次传入多个点的坐标,此时输出也是对应于display坐标系下的一系列坐标。

你可以对ax.trandData返回的坐标转换对象调用.inverted()方法。该方法返回的是一个坐标逆转换对象。对该坐标逆转换对象调用.transform(point)方法会返回pointdata坐标系下的坐标。其中point是点在display坐标系下的坐标(x,y)。你也可以给.transform()方法一次传入多个点的坐标,此时输出也是对应于data坐标系下的一系列坐标。

当你调用了ax.set_xlim()或者ax.set_ylim()时,坐标转换对象会实时更新。

用户的data坐标系

2. Axes 坐标系

Axes坐标系中,(0,0)位于Axes的左下角,(1,1)位于Axes的右上角,(0.5,0.5)位于Axes的中心。当然你可以引用位于这之外的点,如(-0.1,1.1)

通常如果你需要在Axes中放置一些文字说明,那么一般都是采用Axes坐标系来定位。这样无论图形怎么缩放,这些Text都能位于正确的位置。

当然你也可以在Axes中通过Axes坐标系添加一些Patch,但是通常建议在data坐标系下添加。因为你在Axes中添加的图表当图表缩放时可能会出现问题。

3. 混合坐标系

有时候你需要混合data坐标系和Axes坐标系。通过matplotlib.transforms.blended_transform_factory( ax.transData, ax.transAxes)能够返回一个混合坐标系,该坐标系中:x坐标为data坐标系,y坐标为Axes坐标系。因此该坐标系中(1,1)表示的是data坐标系中x=1但是y位于最上方的点。

混合坐标系

有两个函数返回特定的混合坐标系:

  • matplotlib.axes.Axes.get_xaxis_transform():等价于 matplotlib.transforms.blended_transform_factory(ax.transData, ax.transAxes)x坐标为data坐标系,y坐标为Axes坐标系。常用于绘制x轴的labeltickgridline
  • matplotlib.axes.Axes.get_yaxis_transform().:等价于 matplotlib.transforms.blended_transform_factory(ax.transAxes,ax.transData)x坐标为Axes坐标系,y坐标为data坐标系。常用于绘制y轴的labeltickgridline

4. 利用坐标变换制造阴影效果

matplotlib.transform.ScaledTranslation(xt, yt, scale_trans)创建一个新的坐标转换对象,该坐标转换由xtyt经过scale_trans坐标转换而来。

它创建的是一个偏移对于的坐标变换。偏移的坐标是位于scale_trans中的。

  • 制作阴影的时候,将阴影的zorder调小,从而使得阴影首先绘制并位于底层

  • scale_transfig.dpi_scale_trans坐标转换对象时,xt,yt的单位是像素。还有一个方法也能达到同样的效果:matplotlib.transforms.offset_copy(trans,x=xt,y=yt,units='inches'),但是该方法返回的坐标转换对象是trans合成了偏移之后的效果。

    制造阴影效果

5. 直角坐标系、对数坐标系、极坐标系

a. 设置对数坐标系

通过Axes.set_xscale(value,**kwargs)/Axes.set_yscale(value,**kwargs)方法可以设置x轴/y轴是否对数坐标。其中value可以为:

  • linear:线性
  • log:对数。其中basex|basey关键字指定对数的基
  • logit:以2为底的对数
  • symlog:对数,其中basex|basey关键字指定对数的基

你也可以通过matplotlib.pyplot.xscale()matplotlib.pyplot.yscale()来设置对数坐标。一定要先添加数据后设置对数坐标。

对数坐标

b. 设置极坐标

通过Figure.add_axes((left,bottom,width,height), projection='polar')或者Figure.add_axes((left,bottom,width,height), polar=True)方法可以创建一个极坐标的Axes。其中polar关键字是为了兼容旧代码,新代码推荐用projection关键字,因为projection关键字不仅可以设置极坐标,还可以设置自定义坐标(它将坐标统一为映射关系)。

Figure.add_subplot(...)也是同样的设置

级坐标

八、技巧

1. 共享坐标轴

当你通过pyplot.subplot()pyplot.axes()函数或者Figure.add_subplot()Figure.add_axes()方法创建一个Axes时,你可以通过sharex关键字参数传入另一个Axes表示共享X轴;或者通过sharey关键字参数传入另一个Axes表示共享Y轴。

共享轴线时,当你缩放某个Axes时,另一个Axes也跟着缩放。

共享坐标轴

2. 创建多个 subplot

如果你想创建网格中的许多subplot,旧式风格的代码非常繁琐:

#旧式风格
fig=plt.figure()
ax1=fig.add_subplot(221)
ax2=fig.add_subplot(222,sharex=ax1,sharey=ax1)
ax3=fig.add_subplot(223,sharex=ax1,sharey=ax1)
ax4=fig.add_subplot(224,sharex=ax1,sharey=ax1)

新式风格的代码直接利用pyplot.subplots()函数一次性创建:

#新式风格的代码
fig,((ax1,ax2),(ax3,ax4))=plt.subplots(2,2,sharex=True,sharey=True)
ax1.plot(...)
ax2.plot(...)
...

它创建了Figure和对应所有网格SubPlot。你也可以不去解包而直接:

#新式风格的代码
fig,axs=plt.subplots(2,2,sharex=True,sharey=True)
ax1=axs[0,0]
ax2=axs[0,1]
ax3=axs[1,0]
ax4=axs[1,1]
...
...

返回的axs是一个nrows*ncolsarray,支持numpy的索引。

3. 调整日期显示

x轴为时间日期时,有可能间隔太密集导致显示都叠加在一起。此时可以用matplotlib.figure.Figure.autofmt_xdate()函数来自动调整X轴日期的显式。

你也可以调整X轴的显示格式。当X轴为时间时,其显示由Axes.fmt_xdata属性来提供。该属性是一个函数对象或者函数,接受一个日期参数,返回该日期的显示字符串。matplotlib已经提供了许多date formatter,你可以直接使用ax.fmt_xdata=matplotlib.dates.DateFormatter('%Y-%m-%d')

日期显示

4. fill_between()

Axes.fill_between(x,y1,y2=0,where=None,interpolate=False,step=None,**kwargs)方法在y1y2之间进行填充。

  • x:一个长度为N的array,X轴数据
  • y1:一个长度为N的array,Y轴数据1
  • y2:一个长度为N的array,Y轴数据2,填充就是在曲线[x,y1][x,y2]包围的区域内进行
  • where:可选的。
    • 如果为None,则表示任何地方都填充。
    • 如果不是None,那么就是一个长度为N的boolean array,填充只会在whereTrue的地方进行
  • interpolate:一个bool值。如果为True,则计算曲线[x,y1][x,y2]相交点并插入交点;如果为FalseNone则不计算两条曲线的交点。
  • setp:可选

通常建议提供一个alpha参数,用于设定填充的透明度。如果同一个区域被多个fill_between()填充,那么设定alpha之后会让每一层都能显示出来。

例如:

import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1234)
Nsteps = 500
t = np.arange(Nsteps)
mu = 0.002
sigma = 0.01
# the steps and position
S = mu + sigma*np.random.randn(Nsteps)
X = S.cumsum()
# the 1 sigma upper and lower analytic population bounds
lower_bound = mu*t - sigma*np.sqrt(t)
upper_bound = mu*t + sigma*np.sqrt(t)
fig, ax = plt.subplots(1)
ax.plot(t, X, lw=2, label='walker position', color='blue')
ax.plot(t, mu*t, lw=1, label='population mean', color='black', ls='--')
ax.fill_between(t, lower_bound, upper_bound, facecolor='yellow', alpha=0.5,
label='1 sigma range')
ax.legend(loc='upper left')
# here we use the where argument to only fill the region where the
# walker is above the population 1 sigma boundary
ax.fill_between(t, upper_bound, X, where=X>upper_bound, facecolor='blue', alpha=0.5)
ax.set_xlabel('num steps')
ax.set_ylabel('position')
ax.grid()  #开启网格

fill_between()

5. 设置透明 legend

通常如果你能确定,比如右上角,没有数据,那么你能够非常安全的将legend放置在右上角从而不会遮盖你的图表,如ax.legend(loc='upper right')。如果你不知道你的数据曲线的样子,那么你可以使用ax.legend(loc='best')matplotlib自动选择将legend放置在何处。

更有效的方法是设置legend为透明。方法为:ax.legend(loc='best',fancybox=True,framealpha=0.5)。 其中fancybox设置legend边框为圆角矩形,framealpha设置legend的透明度。

fill_between()

6. 放置 text box

当你在Axes中放置text box时,你最好将它放置在axes coordinates下,这样当你调整X轴或者Y轴时,它能够自动调整位置。

你也可以使用Text.bbox属性来让这个Text始终放在某个Patch中。其中.bbox是个字典,它存放的是该Patch实例的属性。

fill_between()

7. LATEX文字

要想在文本中使用LATEX,你需要使用'$...$'这种字符串(即使用'$'作为界定符)。通常建议使用raw字符串,即r'$...$'的格式,因为原生字符串不会转义'\',从而使得大量的LATEX词法能够正确解析。

8. 平移坐标轴:

Axes.spines是个字典,它存放了四个键,分别为: Axes.spines['left],Axes.spines['right],Axes.spines['top],Axes.spines['bottom] 他们都是一个matplotlib.spines.Spine对象,该对象继承自matplotlib.patches.Patch对象,主要是设置图形边界的边框。

  • Spine.set_color('none'):不显示这条边线

  • Spine.set_position((position))):将边线移动到指定坐标,其中position是一个二元元组,指定了 (position type,amount)position type可以是:

    • outward:在绘图区域之外放置边线,离开绘图区域的距离由 amount指定(负值则在会去区域内绘制)
    • axes:在 Axes coordinate内放置边线(从 0.0 到 1.0 )
    • data:在 data coordinate 内放置边线

    你也可以指定position为 : 'center',等价于 ('axes',0.5);或者 'zero',等价于 ('data',0.0)

9. 设置轴线 tick

Axes.xaxis返回一个matplotlib.axis.XAxis对象,Axes.yaxis返回一个matplotlib.axis.YAxis对象,他们都是 matplotlib.axis.Axis的子类对象,代表轴线。

  • Axis.set_ticks_position:设置 tick 位置,可以为: 'top' | 'bottom' | 'both' | 'default' | 'none',如果为 'None'则不显示 tick
  • Axis.set_label_position:设置label位置,可以为: 'top'| 'bottom'

10、matplotlib.colors

matplotlib.colors是一个模块,用于转换数字或者颜色参数到 RGB 或者RGBA

  • RGB:一个浮点数序列,有3个浮点数。每个数都是 0-1之间
  • RGBA:一个浮点数序列,有4个浮点数。每个数都是 0-1之间

它里面有个常用的功能就是生成一个 colormap,它用于将一个数字序列转换成一个颜色序列。通常有下列两个步骤:

  • 将数字归一化到0-1之间(通过 Normalize 类对象或者其子类对象)
  • 将0-1之间的数字映射到一个颜色 (通过 Colormap 类对象或者其子类对象)

matplotlib.colors.ColorConverter 提供了一个单例对象用于转换数字或者数字序列到 color

####a. ListedColormap matplotlib.colors.ListedColormap(colors, name=’from_list’, N=None)基类是matplotlib.colors.Colormap。它用于从一个list of colors中创建colormap

11. 绘制color map

  • matplotlib.pyplot.pcolor(*args, **kwargs):用于绘制颜色图,返回一个matplotlib.collections.Collection 对象。常用的调用方法为:

     pcolor(C)
     pcolor(C,**kwargs)
    
  • matplotlib.pyplot.pcolormesh(*args, **kwargs):用于绘制一个四边形网格。它类似于 pcolor(),但是机制不同,且返回的是QuadMesh对象。它绘图更快。常用的调用方法为:

     pcolormesh(C)
     pcolormesh(X,Y,C)
     pcolormesh(C,**kwargs)
    

其中参数为:

  • C:为一个 masked array。它会被转换成一个 ColorMap,然后对相应的网格图上颜色

  • XY是网格参数,通常他们是从 numpy.meshgrid(x_array,y_array))获取。其中 x_array是一维数组,代表划分X轴网格的横坐标; y_array是一维数组,代表划分Y轴网格的纵坐标

    X,Y,C 形状相同。其中X和Y对应于网格的划分,C对应于颜色的分配(相同C[i][j]值的网格,颜色相同)

    pcolormesh_pcolor

    pcolormesh_pcolor

12. 清除绘图

你可以通过 pyplot来清除绘图:

  • pyplot.cla():清除current axis。非当前axis不受影响
  • pyplot.clf():清除current figure。但是它不关闭window
  • pyplot.close():关闭window

你也可以通过面向对象的方法:

  • Figure.clf():清除该Figure对象的所有内容。

13. 清除X坐标和Y坐标:

Axes.set_xticks(())
Axes.set_yticks(())