matplotlib配置信息是从配置文件中读取的。在配置文件中可以为matplotlib几乎所有的属性指定永久有效的默认值。
你可以通过 matplotlib.rcParams字典访问所有已经加载的配置项
-
你可以通过
matplotlib.rcParams字典修改所有已经加载的配置项 -
你可以通过
matplotlib.rc(*args,**kwargs)来修改配置项,其中args是你要修改的属性,kwargs是属性的关键字属性 -
你可以调用
matplotlib.rcdefaults()将所有配置重置为标准设置。
如果不希望在每次代码开始时进行参数配置,则可以在项目中给出配置文件。配置文件有三个位置:
-
系统级配置文件。通常在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有三个层次的API:
matplotlib.backend_bases.FigureCanvas:代表了一个绘图区,在这个绘图区上图表被绘制matplotlib.backend_bases.Renderer:代表了渲染器,它知道如何在绘图区上绘图。matplotlib.artist.Artist:代表了图表组件,它知道如何利用渲染器在绘图区上绘图。
通常用于有95%以上的时机都是与matplotlib.artist.Artist类打交道,它是高层次的绘图控制。
matplotlib中有两种Artist:
-
primitive:代表了我们在绘图区域上绘制的基础的绘图组件,比如Line2D,Rectangle,Text以及AxesImage等等。 -
container:代表了放置primitive的那些绘图组件。比如Axis、Axes以及Figure,如图所示
matplotlib的标准使用流程为:
- 创建一个
Figure实例对象fig - 使用
fig实例创建一个或者多个Axes实例,或者创建一个或者多个Subplot实例 - 使用
Axes实例的方法来创建primitive
每个在图形中出现的元素都是Artist
-
Figure.patch属性:是一个Rectangle,代表了图表的矩形框,它的大小就是图表的大小, 并且可以通过它设置图表的背景色和透明度。 -
Axes.patch属性:也是一个Rectangle,代表了绘图坐标轴内部的矩形框(白底黑边), 通过它可以设置Axes的颜色、透明度等。 -
所有的
Artist有下列属性。:.alpha属性:透明度。值为0--1之间的浮点数.animated属性:一个布尔值,表示是否用于加速动画绘制.axes属性:返回这个Artist所属的axes,可能为Noneclip_box属性:用于剪切Artist的bounding boxclip_on属性:是否开启clipclip_path属性:Artist沿着该path执行clipcontains属性:一个picking function用于测试Artist是否包含pick pointfigure属性:该Artist所属的Figure,可能为Nonegid属性:该Artist的id字符串label:一个text labelpicker:一个python object用于控制object pickingtransform:转换矩阵.url属性:一个url string,代表本Artistvisible:布尔值,控制Artist是否绘制zorder:决定了Artist的绘制顺序。zorder越小就越底层,则越优先绘制。
这些属性可以通过旧式的
setter和getter函数访问和设置。如:o.get_alpha()、o.set_alpha(0.5)- 如果你想一次设置多个属性,也可以用:
o.set(alpha=0.5,zorder=2)这种方式 - 你可以使用
matplotlib.artist.getp(o)来一次获取o的所有属性
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实例列表
当你执行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。
Figure也有它自己的text、line、patch、image。你可以直接通过add primitive语句直接添加。但是注意Figure默认的坐标系是以像素为单位,你可能需要转换成figure坐标系:(0,0)表示左下点,(1,1)表示右上点。
Axes类是matplotlib的核心,你在大多数时间都是在与它打交道。Axes代表了plotting area。大量的用于绘图的Artist存放在它内部,并且它有许多辅助方法来创建和添加Artist给它自己,而且它也有许多赋值方法来访问和修改这些Artist。
它有许多方法用于绘图,如.plot()、.text()、.hist()、.imshow()等方法用于创建大多数常见的primitive(如Line2D,Rectangle,Text,Image等等)。这些方法会创建primitive Artist实例,并且添加这些实例到对应的container上去,然后必要的时候会绘制这些图形。
Subplot就是一个特殊的Axes,其实例是位于网格中某个区域的Subplot实例。其实你也可以在任意区域创建Axes,通过Figure.add_axes([left,bottom,width,height])来创建一个任意区域的Axes,其中left,bottom,width,height都是[0--1]之间的浮点数,他们代表了相对于Figure的坐标。
Axes包含了一个.patch属性,对于卡迪尔坐标系而言,它是一个Rectangle;对于极坐标而言,它是一个Circle。这个.patch属性决定了plotting region的形状、背景和边框。
当调用Axes.plot()方法时,该方法会创建一个matplotlib.lines.Line2D实例,然后会利用传给.plot()的关键字参数来更新该Line2D的属性,然后将这个Line2D添加到Axes.lines列表中。该方法返回的刚创建的Line2D列表,因为你可以传递多个(x,y)值从而创建多个Line2D。
当调用Axes.hist()方法时,类似于.plot()方法,不过它会添加patches到Axes.patches列表。
你不应该直接通过Axes.lines和Axes.patches列表来添加图表。因为当你通过.plot()和.hist()等方法添加图表时,matplotlib会做许多工作而不仅仅是添加绘图组件到Axes.lines或者Axes.patches列表中。
但是你可以使用Axes的辅助方法.add_line()和.add_patch()方法来添加。
下面是Axes用于创建primitive Artist以及添加他们到相应的container中的方法:
ax.annotate():创建text annotation(Annotate对象),然后添加到ax.texts列表中。ax.bar():创建bar chart(Rectangle对象),然后添加到ax.patches列表中。ax.errorbar():创建error bar plot(Line2D对象和Rectangle对象),然后添加到ax.lines列表中和ax.patches列表中。ax.fill():创建shared area(Polygon对象),然后添加到ax.patches列表中ax.hist():创建histogram(Rectangle对象),然后添加到ax.patches列表中。ax.imshow():创建image data(AxesImage对象),然后添加到ax.images列表中。ax.legend():创建axes legends(Legend对象),然后添加到ax.legends列表中。ax.plot():创建xy plot(Line2D对象),然后添加到ax.lines列表中。ax.scatter():创建scatter charts(PolygonCollection对象),然后添加到ax.collections列表中。ax.text():创建text(Text对象),然后添加到ax.texts列表中。
另外Axes还包含两个最重要的Artist container:
ax.xaxis:XAxis对象的实例,用于处理x轴tick以及label的绘制ax.yaxis:YAxis对象的实例,用于处理y轴tick以及label的绘制
Axes包含了许多辅助方法来访问和修改XAxis和YAxis,这些辅助方法其实内部调用的是XAxis和YAxis的方法。因此通常情况下你不需要直接调用XAxis和YAxis的方法。
matplotlib.axis.Axis实例处理tick line、grid line、tick label以及axis label的绘制。通常你可以独立的配置y轴的左边tick以及右边的tick,也可以独立地配置x轴的上边tick以及下边的tick。
Axis也存储了数据用于内部的缩放以及自适应处理。它还有Locator实例和Formatter实例用于控制tick摆放的位置以及tick的标注字符串。
每个Axis都有一个.label属性,也有major tick列表和minor tick列表。这些tick是XTick和YTick的实例,他们存放着实际的line primitive以及text primitive来渲染tick以及ticklabel。
tick是动态创建的,只有在需要创建的时候才创建(比如缩放的时候)。Axis也提供了一些辅助方法来获取tick label、tick location等等:
-
Axis.get_major_ticks():获取major tick列表(一个Tick对象的列表) -
Axis.get_minor_ticks():获取minor tick列表(一个Tick对象的列表) -
Axis.get_ticklocs():获取tick location列表。 可以通过minor=True|False关键字参数控制输出minor还是major的tick location。 -
Axis.get_ticklabels():获取tick label列表(一个Text实例的列表)。 可以通过minor=True|False关键字参数控制输出minor还是major的tick label。 -
Axis.get_ticklines():获取tick line列表(一个Line2D实例的列表)。 可以通过minor=True|False关键字参数控制输出minor还是major的tick 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或者minor的tick的on|off
matplotlib.axis.Tick类是从Figure-->Axes-->Tick这个container体系中最末端的container。Tick容纳了tick、grid line以及tick对应的label。所有的这些都可以通过Tick的属性获取:
Tick.tick1line:一个Line2D实例Tick.tick2line:一个Line2D实例Tick.gridline:一个Line2D实例Tick.label1:一个Text实例Tick.label2:一个Text实例Tick.gridOn:一个布尔值,决定了是否绘制ticklineTick.tick1On:一个布尔值,决定了是否绘制1st ticklineTick.tick2On:一个布尔值,决定了是否绘制2nd ticklineTick.label1On:一个布尔值,决定了是否绘制1st tick labelTick.label2On:一个布尔值,决定了是否绘制2nd tick label
y轴分为左右两个,因此tick1*对应左侧的轴;tick2*对应右侧的轴。x轴分为上下两个,因此tick1*对应上侧的轴;tick2*对应下侧的轴。
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':填充整个markernone:不填充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:表示每个点都绘制markerN:表示每隔N个点绘制marker,从0开始(start,N):表示每隔N个点绘制marker,从start开始[i,j,m,n]:只有点i,j,m,n的marker绘制- ...其他值参考文档
.pickradius属性:浮点值,表示pick radius.solid_capstyle属性:可以为'butt'、'round'、'projecting',表示实线的头端类型.sold_joinstyle属性:可以为'miter'、'round'、'bevel',表示实线连接处的类型.xdata属性:可以为一维的numpy.array,表示x轴数据.ydata属性:可以为一维的numpy.array,表示y轴数据
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值
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,则默认取xyxycoords:xy坐标系,默认取'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是文本坐标系中的点),默认等于xycoordsarrowprops:指定文本框和被解释的点之间的箭头。如果不是None,则是一个字典,该字典设定了matplotlib.lines.Line2D的属性。- 如果该字典有一个
arrowstyle属性,则该键对应的值也是一个字典,创建一个FancyArrowsPatch实例, 实例属性由该字典指定。 - 如果该字典没有
arrowstyle属性,则创建一个YAArrow实例,
- 如果该字典有一个
annotation_clip:控制超出axes区域的annotation的显示。如果为True则annotation只显示位于axes区域内的内容。- 额外的关键字参数全部是设置
Text的属性
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:持有该legend的artistloc:图例的位置。其值可以为字符串或者数字: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列表,添加这些artist到legend中lebels:一个字符串列表添加到legend中prop:字体属性fontsize: 字体大小(只有prop未设置时有效)markerscale:marker的缩放比例(相对于原始大小)markerfirst: 如果为True,则marker放在label左侧;否则marker放在label右侧numpoints: the number of points in the legend for linescatterpoints: the number of points in the legend for scatter plotscatteryo�sets: a list of yo�sets for scatter symbols in legendframeon: if True, draw a frame around the legend. If None, use rcfancybox: if True, draw a frame with a round fancybox. If None, use rcshadow: if True, draw a shadow behind legendframealpha: If not None, alpha channel for the frame.ncol: number of columnsborderpad: the fractional whitespace inside the legend borderlabelspacing: the vertical space between the legend entrieshandlelength: the length of the legend handleshandleheight: the height of the legend handleshandletextpad: the pad between the legend handle and textborderaxespad: the pad between the axes and legend bordercolumnspacing:the spacing between columnstitle: 图例的标题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
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 antialiased为None则这些值从rc params中读取
属性如下:
- 继承自
Artist基类的属性:.alpha、.animated、.axes、.clip_box、..clip_on、.clip_path、.contains、.figure、.gid、.label、path_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属性:为浮点数,表示线条宽度
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属性
matplotlib.patches.Polygon类是多边形类。其基类是matplotlib.patches.Patch。其构造函数为:
Polygon(xy, closed=True, **kwargs)。参数为:
xy是一个N×2的numpy array,为多边形的顶点。closed为True则指定多边形将起点和终点重合从而显式关闭多边形。- 其他关键字参数用于设置属性
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属性
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,比如line、text、image等。它非常类似于Matlab的用法。- 下一层是面向对象的接口:在这一层
pyplot只是用部分函数来创建Figure,然后通过该Figure显式的创建Axes,然后通过面向对象的接口在该Axes上添加图形。极端情况下用户可以完全抛弃pyplot而完全使用面向对象的接口。
对于非交互式绘图,官方文档推荐用
pyplot创建Figure,然后使用面向对象接口来绘图。
matplotlib的所有plotting function期待输入numpy.array或者numpy.ma.masked_array类型的数据作为输入。某些长得像numpy.array的数据比如numpy.matrix类型的输入数据可能会导致matplotlib工作异常。如果确实需要使用numpy.matrix,你应该首先将它转换为numpy.array
matplotlib:它是整个packagematplotlib.pyplot:是matplotlib的一个module。它为底层的面向对象接口提供了一个state-machine interface。这个state-machine必要的时候隐式创建Figure和Axes,并维护current Figure和current Axespylab是一个便利的module,它导入了matplotlib.pyplot以及numpy,它只是为了plot以及math方便而用。官方文档不推荐使用它。
官方文档不推荐 MATLAB风格的代码。因为MATLAB风格代码维护了全局状态,你执行同一个plot多次可能会发现结果是不同的。
官方文档推荐使用如下风格:
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(...)
ax.show()
这样的风格使得在绘图事件中,每个角色都很清楚,数据的流动也很清楚。
matplotlib可以适用于非常广泛的场景:
matplotlib可以交互式地用于python shellmatplotlib可以嵌入到wxpython或者pygtk等GUI程序中matplotlib可以在脚本中使用从而生成postscript image
为了适应于这些场景,matplotlib针对这些target生成不同的输出格式。这种能力称之为backend。
与之相对的
frontend指的是用户使用matplotlib而编写的代码
有两种类型的backend:
- 交互式的
backend:应用于pygtk、wxpython、tkinter、qt4、macosx等中 - 非交互式的
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()
matplotlib提供的常用的rendering engine是Agg,它采用的是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 outputPDF:输出pdf格式文件。SVG:输出svg格式文件Cairo:可以输出png、ps、pdf、svg...等格式文件GDK:可以输出png、jpg、tiff...等格式文件,它使用Gimp Drawing Kit
要想保存成指定类型文件,如
backend,
使用交互式backend可以plotting to the screen,但是前提是matplotlib必须是interactive mode。
你可以在matplotlibrc配置文件中设置matplotlib是否位于交互模式,也可以通过代码matplotlib.interacite()来设置matplotlib位于交互模式。你可以通过代码matplotlib.is_interactive()来判断代码是否交互模式。通常并不建议在绘图过程中修改交互模式,因此要提前修改交互模式再绘图。
交互模式也可以通过
matplotlib.pyplot.ion()开启交互模式,由matplotlib.pyplot.ioff()关闭交互模式。另外交互模式支持ipython和python 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版本之后该限制被放松。
可以通过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参数来指定背景色
简单布局通过Figure.add_subplot(*args,**kwargs)方法来完成,它返回的是Axes实例。当然你也可以通过pyplot.subplot(*args,**kwargs)函数来完成,他返回的也是Axes实例,该函数只是一个便利函数。
SubPlot类是Axes类的子类。因此SubPlot对象也是Axes对象。
最典型用法是matplotlib.pyplot.subplot(nrows,ncols,plot_number)。nrows和ncols将图表划分成nrows*ncols大小的网格区域,每一个区域都能存放一个SubPlot;该函数创建plot_number位置处的SubPlot-axes。其中plot_number起始于1,最大值为nrows*ncols。
如果nrows、ncols、plot_number都是个位数,则你可以指定一个三位数来简化函数调用matplotlib.pyplot.subplot(integer),其中百分位代表nrows,十分位代表ncols,各位代表plot_number。
axisbg关键字参数:指定subplot的背景色polar关键字参数:指定subplot是否是极坐标。默认为Falseprojection:sharex关键字参数:指定subplot与其他Axes(由该参数值指定)共享xaxis attributesharey关键字参数:指定subplot是否与其他Axes(由该参数值指定)共享yaxis attribute
你可以通过pyplot.subplots()函数一次性的创建多个SubPlot。
pyplot.subplot()每次只会创建一个SubPlot。
其参数有:
-
nrows:行数,默认为1 -
ncols:列数,默认为1 -
sharex:- 如果为
True,则所有SubPlot的X axis被共享。此时只有最后一行的X轴可见。 - 如果为
False,则SubPlot的X axis不共享,每一个SbuPlot的X轴可见。 - 如果为字符串
all,则等效于True - 如果为字符串
none,则当小于False - 如果为字符串
row,则每一行的SubPlot共享一个X轴(与False等效) - 如果为字符串
col,则每一列的SubPlot共享一个X轴(与True等效)
- 如果为
-
sharey:- 如果为
True,则所有SubPlot的Y axis被共享。此时只有第一列的Y轴可见。 - 如果为
False,则SubPlot的Y axis不共享,每一个SbuPlot的Y轴可见。 - 如果为字符串
all,则等效于True - 如果为字符串
none,则当小于False - 如果为字符串
row,则每一行的SubPlot共享一个Y轴(与True等效) - 如果为字符串
col,则每一列的SubPlot共享一个Y轴(与False等效)
- 如果为
-
squeeze:- 如果为
True:- 如果只创建了一个
SubPlot,则返回一个变量(创建的SubPlot对象) - 如果创建了
N*1或者1*N个SubPlot,则返回一个1维向量 - 如果创建了
N*M个SubPlot(其中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参数。
使用pyplot.subplot2grid()函数时,你只需要提供网格形状以及SubPlot位置即可,如:
ax=pyplot.subplot2grid((2,2),(0,0)),它等价于ax=pyplot.subplot(2,2,1)。其中subplot2grid()的位置坐标从0开始。
subplot2grid()支持SubPlot横跨或者纵跨多个单元格。colspan关键字参数指定纵向的跨度;rowspanguan尖子参数指定横向的跨度。
你可以直接创建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,那么你可以调整由GridSpec创建的SubplotSpec的layout 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之间的空白的高度
你可以从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。
默认情况下,GridSpec创建的网格都是相同大小的。当然你可以调整相对的高度和宽度。注意这里只有相对大小(即比例)是有意义的,绝对大小值是没有意义的。如:
gs=gridspec.GridSpec(2,2,width_ratios=[1,2],height_ratios=[4,1]
plt.subplot(gs[0]
....
这里width_ratios关键字参数指定了一行中,各列的宽度比例(有多少列就有多少个数字);
height_ratios关键字参数指定了一列中,各行的高度比例(有多少行就有多少个数字)。
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 edge和edges 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()来达到同样的效果。
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对象的创建通过matplotlib.path.Path(verts,codes)创建,其中:
verts:PATH的顶点。这些顶点必须构成一个封闭曲线。其中每个顶点必须指定x坐标和y坐标。codes:指示如何使用这些PATH顶点。它与verts关系是一一对应的。有如下指令:Path.STOP:结束path的标记Path.MOVETO:画笔提起并移动到指定的顶点Path.LINETO:画笔画直线,从current position到指定的顶点Path.CURVE3:画笔画二阶贝塞尔曲线,从current position到指定的end point, 其中还有一个参数是指定的control pointPath.CURVE4:画笔画三阶贝塞尔曲线,从current position到指定的end point, 其中还有两个参数是指定的control pointsPath.CLOSEPOLY:指定的point参数被忽略。该指令画一条线段, 从current point到start point
可以通过matplotlib.patches.PathPatch(path)来构建一个PathPatch对象,然后通过Axes.add_patch(patch)向Axes添加PathPatch对象.这样就添加了Path到图表中。
在matplotlib中所有简单的patch primitive,如Rectangle、Circle、Polygon等等,都是由简单的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()
matplotlib的patheffects模块提供了一些函数来绘制path effect,该模块还定义了很多effect类。可以应用path effect的Artist有:Patch、Line2D、Collection以及Text。每个Artist的path effect可以通过.set_path_effects()方法控制,其参数是一个可迭代对象,迭代的结果是AbstractPathEffect实例;也可以通过Artist构造函数的path_effects=关键字参数控制。
注意:
effect类的关键字参数比如背景色、前景色等与Artist不同。因为这些effect类是更低层次的操作。
所有的effect类都继承自matplotlib.patheffects.AbstractPathEffect类。AbstractPathEffect的子类要覆盖AbstractPathEffect类的.draw_path(...)方法。
AbstractPathEffect类的构造函数有个offset关键字参数,表示effect偏移(默认为(0,0))
最简单的effect是normal 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()
我们可以在基于Path的Artist上应用drop-shadow effect(下沉效果)。如可以在filled patch Artist上应用matplotlib.patheffects.SimplePatchShadow,在line patch Artist上应用matplotlib.patheffects.SimpleLineShadow。
你可以通过path_effects=[path_effects.with*()]来指定path_effects参数,或者直接通过path_effects=[path_effects.SimpleLineShadow(),path_effects.Normal()]来指定path_effects参数。
- 前者会自动地在
normal effect后跟随指定的effect - 后者会显式的指定
effect
Strok effect可以用于制作出stand-out effect(突出效果)。
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()
matplotlib中有四个坐标系:
- 用户级的
data坐标系:坐标转换对象为ax.transData。它是用户级坐标系,由xlim和ylim控制 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事件,非常麻烦。
当调用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)方法会返回point在display坐标系下的坐标。其中point是点在data坐标系下的坐标(x,y)。你也可以给.transform()方法一次传入多个点的坐标,此时输出也是对应于display坐标系下的一系列坐标。
你可以对ax.trandData返回的坐标转换对象调用.inverted()方法。该方法返回的是一个坐标逆转换对象。对该坐标逆转换对象调用.transform(point)方法会返回point在data坐标系下的坐标。其中point是点在display坐标系下的坐标(x,y)。你也可以给.transform()方法一次传入多个点的坐标,此时输出也是对应于data坐标系下的一系列坐标。
当你调用了ax.set_xlim()或者ax.set_ylim()时,坐标转换对象会实时更新。
在Axes坐标系中,(0,0)位于Axes的左下角,(1,1)位于Axes的右上角,(0.5,0.5)位于Axes的中心。当然你可以引用位于这之外的点,如(-0.1,1.1)。
通常如果你需要在Axes中放置一些文字说明,那么一般都是采用Axes坐标系来定位。这样无论图形怎么缩放,这些Text都能位于正确的位置。
当然你也可以在Axes中通过Axes坐标系添加一些Patch,但是通常建议在data坐标系下添加。因为你在Axes中添加的图表当图表缩放时可能会出现问题。
有时候你需要混合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轴的label、tick、gridline。matplotlib.axes.Axes.get_yaxis_transform().:等价于matplotlib.transforms.blended_transform_factory(ax.transAxes,ax.transData)。x坐标为Axes坐标系,y坐标为data坐标系。常用于绘制y轴的label、tick、gridline。
matplotlib.transform.ScaledTranslation(xt, yt, scale_trans)创建一个新的坐标转换对象,该坐标转换由xt和yt经过scale_trans坐标转换而来。
它创建的是一个偏移对于的坐标变换。偏移的坐标是位于
scale_trans中的。
-
制作阴影的时候,将阴影的
zorder调小,从而使得阴影首先绘制并位于底层 -
当
scale_trans为fig.dpi_scale_trans坐标转换对象时,xt,yt的单位是像素。还有一个方法也能达到同样的效果:matplotlib.transforms.offset_copy(trans,x=xt,y=yt,units='inches'),但是该方法返回的坐标转换对象是trans合成了偏移之后的效果。
通过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()来设置对数坐标。一定要先添加数据后设置对数坐标。
通过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(...)也是同样的设置
当你通过pyplot.subplot()、pyplot.axes()函数或者Figure.add_subplot()、Figure.add_axes()方法创建一个Axes时,你可以通过sharex关键字参数传入另一个Axes表示共享X轴;或者通过sharey关键字参数传入另一个Axes表示共享Y轴。
共享轴线时,当你缩放某个Axes时,另一个Axes也跟着缩放。
如果你想创建网格中的许多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*ncols的array,支持numpy的索引。
当x轴为时间日期时,有可能间隔太密集导致显示都叠加在一起。此时可以用matplotlib.figure.Figure.autofmt_xdate()函数来自动调整X轴日期的显式。
你也可以调整X轴的显示格式。当X轴为时间时,其显示由Axes.fmt_xdata属性来提供。该属性是一个函数对象或者函数,接受一个日期参数,返回该日期的显示字符串。matplotlib已经提供了许多date formatter,你可以直接使用ax.fmt_xdata=matplotlib.dates.DateFormatter('%Y-%m-%d')
Axes.fill_between(x,y1,y2=0,where=None,interpolate=False,step=None,**kwargs)方法在y1和y2之间进行填充。
x:一个长度为N的array,X轴数据y1:一个长度为N的array,Y轴数据1y2:一个长度为N的array,Y轴数据2,填充就是在曲线[x,y1]和[x,y2]包围的区域内进行where:可选的。- 如果为
None,则表示任何地方都填充。 - 如果不是
None,那么就是一个长度为N的boolean array,填充只会在where为True的地方进行
- 如果为
interpolate:一个bool值。如果为True,则计算曲线[x,y1]和[x,y2]相交点并插入交点;如果为False或None则不计算两条曲线的交点。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() #开启网格
通常如果你能确定,比如右上角,没有数据,那么你能够非常安全的将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的透明度。
当你在Axes中放置text box时,你最好将它放置在axes coordinates下,这样当你调整X轴或者Y轴时,它能够自动调整位置。
你也可以使用Text的.bbox属性来让这个Text始终放在某个Patch中。其中.bbox是个字典,它存放的是该Patch实例的属性。
要想在文本中使用LATEX,你需要使用'$...$'这种字符串(即使用'$'作为界定符)。通常建议使用raw字符串,即r'$...$'的格式,因为原生字符串不会转义'\',从而使得大量的LATEX词法能够正确解析。
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)
Axes.xaxis返回一个matplotlib.axis.XAxis对象,Axes.yaxis返回一个matplotlib.axis.YAxis对象,他们都是 matplotlib.axis.Axis的子类对象,代表轴线。
Axis.set_ticks_position:设置tick位置,可以为:'top' | 'bottom' | 'both' | 'default' | 'none',如果为'None'则不显示tickAxis.set_label_position:设置label位置,可以为:'top'| 'bottom'
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
-
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,然后对相应的网格图上颜色 -
X和Y是网格参数,通常他们是从numpy.meshgrid(x_array,y_array))获取。其中x_array是一维数组,代表划分X轴网格的横坐标;y_array是一维数组,代表划分Y轴网格的纵坐标X,Y,C 形状相同。其中X和Y对应于网格的划分,C对应于颜色的分配(相同C[i][j]值的网格,颜色相同)
你可以通过 pyplot来清除绘图:
pyplot.cla():清除current axis。非当前axis不受影响pyplot.clf():清除current figure。但是它不关闭windowpyplot.close():关闭window
你也可以通过面向对象的方法:
Figure.clf():清除该Figure对象的所有内容。
Axes.set_xticks(())
Axes.set_yticks(())