title: matplotlib 外观和基本配置笔记

notebook: Python

tags:matplotlib

参考资料,如何使用matplotlib绘制出数据图形,参考另一篇matplotlib绘制多种图形笔记

  1. 通过在python GUI中,新建一个文件,并且可以运行(非常似Matlab)。执行文件就会批量执行绘图命令,这样就在学习matplotlib的过程中可以尝试修改几个小参数。
  2. 这些知识掌握以后,还需要学习pylab这个模块和IPython

绘制函数曲线

figure()

matplotlib.pyplot.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=<class 'matplotlib.figure.Figure'>, **kwargs)

parameter keyword parameter value
num integer or string. 如果缺省, 那么自动增加fig num; 如果 fig num已存在,则激活那个figure, 并且返回(对于其他parameter,可能修改这个figure 的相应属性)
figsize (width, height)
facecolor the figure's whole background color; 比如图表中折线图范围外的部分,就是背景
bordercolor 不经常使用

通常,在pyplot.figure(...,...)pyplot.show()之间的pyplot语句都是画在一张图上面的。

如果没有调用pyplot.figure(...,...)语句,那么pyplot.plot(), pyplot.show()语句就是另外新建了一个figure。

plot()绘曲线

matplotlib.pyplot.plot(*args, **kwargs)

plot()函数有很多参数项,分为

  1. Axes.args类参数项

    args参数可以多个 \(x,y\) 变量对

  2. kwargs类参数项

    kwargs参数项 表示了 Line2D对象的属性,参数项可以表示很多Line2D的属性,每个参数项可以用 parameter keyword = "parameter value"的形式表示,常用的参数项是:

    • label: 此名字在图示(legend)中显示。只要在字符串前后添加"$"符号,matplotlib就会使用其内嵌的latex引擎绘制的数学公式

    • marker, markersize, markerfacecolor, markeredgecolor

    • color, linewidth

    • url, visible

    • 注意:label这个属性,在调用pyplot.legend()后显示在图示里面

      各属性的可选参数值参考

  3. pyplot.plot()中可以画出多条曲线

    1. 多个参数

      1. 使用pyplot.plot(x1, y1, 'g^', x2, y2, 'g-')不同形式的曲线
      2. 使用pyplot.plot(x1, y1, x2, y2, 'g-')则相同形式的曲线
    2. 先调用pyplot.figure()多次调用pyplot.plot(*args, **kwargs)

      这样每条曲线可以设置很多Line2D的属性,比如label
  4. 给曲线设置属性,如果pyplot.plot()方法不能全部设置外观属性,那么可以通过 先分配对象,再设置属性的办法 绘图

    	line = plt.plot(x, x * x)
    line.set_antialiased(False)
     	lines = plt.plot(x, np.sin(x), x, cos(x))
    plt.setp(lines, color = "r", linewidth = 2.0)

xlabel(), ylabel(), title()

legend()

  1. pyplot.plot()pyplot.legend()搭配使用
  2. 在使用pyplot.subplot()情形时,就是pyplot.subplot()pyplot.legend()搭配使用

subplot()绘制多轴图

一个绘图对象(figure)可以包含多个轴(axis),在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图(即axes属性中有多个实例)

pyplot.subplot(numRows, numCols, plotNum)

subplot将整个绘图区域等分为numRows行 * numCols列个子区域,然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1

如果希望某个轴占据整个行或者整个列的话,可以如下调用:

plt.subplot(2,2,1)

plt.subplot(2,2,2)

plt.subplot(2,1,2)

xlim(), ylim()

显示X轴/Y轴的范围

注: 在显示图中, 左下角有一些鼠标可以选的选项,比如"左右拖动曲线"

参数设置

  1. matplotlib.rcParams["savefig.dpi"]可以查看保存图像的像素设置
  2. rcParams 是一个字典变量,保存了绘图配置的各个选项的“关键字:参数值”对
    1. 通过rc_params() 来读取配置文件,结果保存在rcParams字典中
    2. 修改raParams字典中个别选项使用matplotlib.rc([keyword = "parameter value"]*)的方式
    3. 修改了rcParams后,重置rcParams时,matplotlib.rcdefaults()
    4. 修改了配置文件后,更新rcParams时,matplotlib.rcParams.update(matplotlib.rc_params)

绘制一般的数据图(直方图/散点图/圆形图)

Figure

一般示例程序中都直接采用了``pyplot.subplot()和pyplot.axes()的方法,不过在我程序时,使用fig = plt.figure(), fig.add_subplot(), fig.add_axes()的流程

参考User Guide,翻译如下:

Figure图表包括组成图标的所有元素,Figure对象有如下属性包含其它的Artist对象:

attribute name type 介绍
patch Rectangle 作为背景的 Rectangle 对象
axes list of Axes Axes对象列表
images list of FigureImage FigureImage 对象列表,用来显示图片
legends list of Legend Legend 对象列表
lines list of Line2D Line2D对象列表
texts list of Text Text对象列表,用来显示文字

最大的Artist容器是matplotlib.figure.Figure,它包括组成图表的所有元素。图表的背景是一个Rectangle对象,用Figure.patch属性表示。当你通过调用add_subplot或者add_axes方法往图表中添加轴或子图(实际轴就是子图时),这些子图都将添加到Figure.axes属性中,同时这两个方法也返回添加进axes属性的对象,注意返回值的类型有所不同,实际上AxesSubplot是Axes的子类。

为了支持pylab中的gca()等函数,Figure对象内部保存有当前轴的信息,因此不建议直接对Figure.axes属性进行列表操作,而应该使用add_subplot, add_axes, delaxes等方法进行添加和删除操作。但是使用for循环对axes中的每个元素进行操作是没有问题的,下面的语句打开所有子图的栅格。

  1. 上表中的属性,是直接fig.linesfig.images这样调用的,由于linesimages这几个属性都是list类,那么可以使用list类的函数,如下:
	>>> from matplotlib.lines import Line2D
>>> fig = plt.figure()
>>> line1 = Line2D([0,1],[0,1], transform=fig.transFigure, figure=fig, color="r")
>>> line2 = Line2D([0,1],[1,0], transform=fig.transFigure, figure=fig, color="g")
>>> fig.lines.extend([line1, line2])
>>> fig.show()
  1. 不过,要使用add_subplot()和add_axes()增加子图

    1. add_subplot(*args,**kwargs)

      fig.add_subplot(*args,**kwargs)的参数,和pyplot.subplot(*args,**kwargs)的参数是相似的用法,如:

      1. fig.add_subplot(2,1,1)

      2. fig.add_subplot(2,1,1, facecolor = 'r')

      3. fig.add_subplot(sub)----kwargs参数

      4. kwargs是Axes对象

    2. add_axes(*args,**kwargs)

      fig.add_axes(*args,**kwargs)的参数,和pyplot.axes(*args,**kwargs)的参数是相似的用法

      1. args[left,bottom,width,height],每个参数都是小数,表示在图片中的相对比例(位置/长度),如:

        fig.add_axes([0.1,0.1,0.5,0.5]), 其中用rect 表示[0.1,0.1,0.5,0.5]

        多次使用这样的语句可以在一个子图上叠加另一个子图
      2. 注意,rect的参数含义是left, bottom, width, height,是定好左下角坐标后的相对大小;
      3. args 参数的作用像pyplot.figure的num变量的作用,可以标识一个子图。当fig.add_axes(rect)中的rect在fig中已经存在时,fig.add_axes(rect)会返回已存在的那个子图。如果想在原位置覆盖一个新子图,要使用语句fig.add_axes(rect, label='axes1)和fig.add_axes(rect, label='axes2'),通过不同的label关键字表示不同的子图。
      4. kwargs参数参加axes的属性
Figure分配子图的位置

gridSpec类

子图往往可以设置为显示为个性化的排列效果,类似网页的元素位置布置,比如将一行/一列中多个相邻位置的子图合并,形成不是平均分割的子图划分,这样的需要不是简单通过fig.subplot()的参数实现的。subplot()中个性化的子图位置划分是通过gridSpec类来设置的。

  1. 实例代码

    	import matplotlib.gridspec as gridspec
    G = gridspec.GridSpec(3, 3)
    axes_1 = plt.subplot(G[0, :])
    axes_1.text(0.5,0.5, 'Axes 1',ha='center',va='center',size=24,alpha=.5)
    axes_2 = plt.subplot(G[1,:-1])
    axes_2.text(0.5,0.5, 'Axes 2',ha='center',va='center',size=24,alpha=.5)
    axes_3 = plt.subplot(G[1:, -1])
    axes_3.text(0.5,0.5, 'Axes 3',ha='center',va='center',size=24,alpha=.5)
    axes_4 = plt.subplot(G[-1,0])
    axes_4.text(0.5,0.5, 'Axes 4',ha='center',va='center',size=24,alpha=.5)
    axes_5 = plt.subplot(G[-1,-2])
    axes_5.text(0.5,0.5, 'Axes 5',ha='center',va='center',size=24,alpha=.5)
  2. 说明

    1. matplot.gridspec.GridSpec的定义为class matplotlib.gridspec.GridSpec(nrows, ncols, left=None, bottom=None, right=None, top=None, wspace=None, hspace=None, width_ratios=None, height_ratios=None)

      1. 其中,这个类的作用是相当于一个定位桩;
      2. left, bottom, right, top参数是0-1之间的小数,表示在figure中的相对位置,这个相对位置就是GridSpec在fig中的位置(子图再以这个GridSpec为参照来定位)--一个figure中有同时使用多个GridSped的么?或者是通过SubplotGridSpec来弄吧~
        1. left, bottom, right, top四个参数并不组成一个rect类的实例
      3. wspace和hspace使用的小数/整数都可以
      4. width_ratios表示每列的宽度比例,达到的效果是某些列稍微宽一些,另几列较窄;

        1. width_ratios是一个数组,元素个数与ncols相同;最好的表示方法是各元素和为1

        2. width_ratios中的表示的列宽,并不包含wspace的占用空间
    2. subplot()中使用GridSpec的位置序号是从0起始的,参数的用法同数组索引的用法。

Axes

参考Axes API,Axes容器不仅设定背景(patch, Rectangle类)和坐标Circle类,还包括了大多数的绘图元素类:Axis, Tick, Line2D, Text, Polygon等等。以上这些绘图元素都是Artist的子类,Axes容器提供了相应的get和set函数。

Axes 有齐全的绘图函数,可以绘制折线图、直方图、光谱图、统计图等等。入门使用方法链接

attribute name type 介绍
artists list of Artist 一个子图中的绘图元素的列表
patch Rectangle 作为背景的 Rectangle 对象
collections list of Collection instances
images list of AxesImage AxesImage 对象列表,用来显示图片
legends list of Legend Legend 对象列表
lines list of Line2D Line2D对象列表
patches list of patches
texts list of Text Text对象列表,用来显示文字
xaxis matplotlib.xaxis.XAxis 子图的横坐标属性类
yaxis matplotlib.yaxis.YAxis 子图的纵坐标属性类
  1. Axes的基本绘图函数

    • 基本绘图方法

      lper method Artist Container
      annotate - text annotations Annotate ax.texts
      bar - bar charts Rectangle ax.patches
      .errorbar - error bar plots Line2D and Rectangle ax.lines and ax.patches
      .fill - shared area Polygon ax.patches
      .hist - histograms Rectangle ax.patches
      .imshow - image data AxesImage ax.images
      .legend - axes legends Legend ax.legends
      .plot - xy plots Line2D ax.lines
      .scatter - scatter charts PolygonCollection ax.collections
      .text - text Text ax.texts
  2.  1. set_xlim(left = xxx, right = xxx)
    2. set_ylim(top = xxx, bottom = xxx)

Axis

Axis容器包括坐标轴上的刻度线(tickline)、刻度文本(ticklabel)、坐标网格(grid)以及坐标轴标题(label)等内容。

  1. 刻度包括主刻度和副刻度

    1. 主刻度是区间较大的刻度,绘图中一般显示得明显;副刻度是区间较小的刻度,绘图中显示得紧密,不明显,分别通过axis.get_major_ticks()和Axis.get_minor_ticks()方法获得。

    2. 实际上每个刻度线都是一个XTick或者YTick对象,包括实际的刻度线和刻度文本。为了分别设置刻度线和文本更方便,Axis对象提供了get_ticklabels和get_ticklines方法

      	for label in axis.get_ticklabels():
      label.set_color("red")
      label.set_rotation(45)
      label.set_fontsize(6)
      for line in axis.get_ticklines():
      line.set_color("green")
      line.set_markersize(25)
      line.set_markeredgewidth(3)
    3. 调整横坐标显示在图表上方或者图表下方

      1. 横坐标的刻度线和刻度文本显示在图表上方或者图表下方

        XAxis.tick_top() | XAxis.tick_bottom()

        不能同时上方下方都显示横坐标的刻度文本
      2. 设置横坐标的刻度线显示在图表的上方或者图表下方

        XAxis.set_ticks_position()

        1. "both", "top", "bottom", "default", "none"
          1. XAxis.set_ticks_position("top")XAxis.tick_top()是相同效果;
          2. XAxis.set_ticks_position("bottom")XAxis.tick_bottom()是相同效果。
        2. XAxis.set_ticks_position("both")是上下都有刻度线
      3. 调整纵坐标显示在图表左侧或者右侧
        1. YAxis.tick_left() | YAxis.tick_right()
    4. 调整坐标的刻度线在直方图中的对齐

      在画直方图的图示时,设置tick对齐直方图的左边、右边还是中间

Axis中设置刻度线、刻度文本的最直接方法:
1. 外观设置(刻度线左右/上下 + 刻度文本左右/上下 + 刻度线长短/粗细/颜色 + 刻度文本颜色/倾角等)
```
for tick in ax1.xaxis.get_major_ticks():
tick.label1On = True
tick.label2On = True
tick.tick1On = True
tick.tick2On = True
tick.tick1line.set_color('red')
tick.tick1line.set_markersize(35)
tick.tick1line.set_markeredgewidth(5)
tick.label1.set_color('blue')
tick.tick2line.set_color('blue')
tick.tick2line.set_markersize(25)
tick.tick2line.set_markeredgewidth(10)
``` 1. 上面的方法,可以很细致地设置一些图示的细节,达到了个性化设置的目的;
2. 对于需要简洁代码的场景,可以使用的`XAxis.tick_top()`这样的代码直接设置刻度线和刻度文本的位置,可以说各有利弊。
2. 刻度文本设置
直接使用列表赋值

Patch

Legend图示

入门参考

legend图示是分一个个条目(entry-->key:label)的

legend中一个个条目分别对应底层的一个个handle(这些handle只对限定的曲线才会默认生成)

  1. legend()函数的参数

    1. pyplot.legend(),axe.legend()

      a. legend(曲线实例名)

      b. legend(曲线实例名,label名)

      	line_up, = plt.plot([1,2,3], label='Line 2')
      line_down, = plt.plot([3,2,1], label='Line 1')
      plt.legend(handles=[line_up, line_down])

      	line_up, = plt.plot([1,2,3], label='Line 2')
      line_down, = plt.plot([3,2,1], label='Line 1')
      plt.legend([line_up, line_down], ['Line Up', 'Line Down'])
    2. 参数列表

      ameter key name parameter value 注解
      dles [artiest name] 曲线名;第一个参数,不加关键字handles也可以,一定是[]包围的
      'best', 'upper(lower/center) left(right)', 'right', 'lower(upper) center', 'center' ---
      x_to_anchor (float, float) legend location in bbox_transform coordinates,可以调整图示legend显示到Axe外面
      l integer 图示的分栏数,默认是1,即1栏; 可以分成2栏/3栏,显示效果好
      e "expand" or None 使得这个图示框会调整宽度
      tsize 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large' 或者integer
      points / scatterpoints integer
      kerfirst True/False 是否曲线标识在前
      abelspacing** float or None 条目之间的垂直间距
      olumnspacing** float or None 分栏之间的平行间距
      dow True/False 是否有背景(背景颜色legend.get_frame().set_facecolor('')
      ecolor 'inherit'或者'blue','pink' 背景颜色
      ecolor 'inherit'或者'blue','pink' 背景边界颜色
      1. bbox_to_anchor参数可以把图示框显示在figure外面,配合loc参数的值,可以调整图示偏左/偏右显示。
      2. bbox_to_anchor的参数 (1.05, 1)或者(0.,1.02, 1., 1.02)这样
      3. shadow参数的作用还不清楚
  2. tips

    1. 一个figure添加多个图示legend,及多条曲线对应各自的legend等,

      代码是这么写:

      	import matplotlib.pyplot as plt
      line1, = plt.plot([1,2,3], label="Line 1", linestyle='--')
      line2, = plt.plot([3,2,1], label="Line 2", linewidth=4)
      <!-- -->
      # Create a legend for the first line.
      first_legend = plt.legend(handles=[line1], loc=1)
      # Add the legend manually to the current Axes.
      ax = plt.gca().add_artist(first_legend)
      <!-- -->
      # Create another legend for the second line.
      plt.legend(handles=[line2], loc=4)
      plt.show()

      这里面,多个legend要使用ax = plt.gca().add_artist(first_legend)这样的语句

    2. handlers

Axes.annotate类

使用方法只调用一个函数Axes.annotate(*args, **kwargs),如:

ax1.annotate('what a setup',xy=(0.2,0.2),xytext=(0.2,0.8),fontsize=12,

arrowprops=dict(arrowstyle="<|-"))

其中args参数如下:

parameter key name parameter value 注解
s 注释文字 注释文字
xy 被注释点的坐标 xy=(0.8,0,8)
xytext 注释文字所在坐标 xytext=(0.2, 0.8)
xycoords 以上两个坐标采用的坐标系 default to 'data',被注释点使用的坐标系
arrowprops dict(arrowstyle="fancy", connectionstyle="") 文字和注释点之间标线的样式,FancyArrowPatch

PS:有一个博主十几篇关于应用matplotlib绘图的博客Chris Chen,我看了以后非常有启发,已关注他的博客更新。

Matplotlib外观和基本配置笔记的更多相关文章

  1. Bandwidthd+Postgresql数据库配置笔记

    Bandwidthd+Postgresql数据库配置笔记 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/zjianbo/article/detai ...

  2. 软件安装配置笔记(三)——ArcGIS系列产品安装与配置(补档)(附数据库连接及数据导入)

    在前两篇安装配置笔记之后,就忘记把其他安装配置笔记迁移过来了,真是失误失误!趁现在其他文档需要赶紧补上. 目录: 一.ArcMap 二.ArcMap连接数据库并导入数据 三.Arcgis Pro 四. ...

  3. linux文件权限目录配置笔记

    ###linux 文件权限目录配置笔记 ---------- 多人多任务环境 linux 一般将文件可存取的身份分为三个类别:owner group others Permission deny ls ...

  4. php +apache +mysql 配置笔记

    2013年11月5日 14:27:46 php +apache +mysql 配置笔记 mysql 正常安装 忽略. 1,配置笔记:安装apache 的成功标志是:安装完成之后,在浏览器输入http: ...

  5. Linux下Ganglia集群监控安装、配置笔记

    http://www.blogjava.net/henry14/archive/2011/12/17/ganglia.html 枪声依旧 Linux下Ganglia集群监控安装.配置笔记 Gangli ...

  6. logging模块配置笔记

    logging模块配置笔记 log文件的路径 #判断在当前的目录下是否有一个logs文件夹.没有则创建 log_dir = os.path.dirname(os.path.dirname(__file ...

  7. 关于php user ini 文件的配置笔记 (TODO)

    关于 user ini 文件的配置笔记 在使用 宝塔建网站时如果选中防跨域攻击就会在 项目目录生成 .user.ini 这里面是关于 open_basedir 的路径.

  8. FreeRADIUS + MySQL 安装配置笔记

    FreeRADIUS + MySQL 安装配置笔记 https://www.2cto.com/net/201110/106597.html

  9. 新装系统(CentOS7.4)环境初始化配置笔记

    新装系统(CentOS7.4)环境初始化配置笔记 一.概述 设备详情: Dell R730 服务器 (四个网卡,一根网线插在第2个网卡上) CentOS 7.4 x64 最小安装环境 二.网络环境配置 ...

随机推荐

  1. win7在安装时跳过输入用户名界面,直接开启管理员用户

    WIN7原版系统安装完后需要创建用户,为了追求纯净简化不必要的步骤,可以选择跳过创建用户直接启用内置管理员账户.首先,到了创建用户这一步先别急着往下点,此时按键盘的SHIFT + F10 组合键调出命 ...

  2. vue+echarts实现可拖动节点的折现图(支持拖动方向和上下限的设置)

    本篇文档主要是利用echarts实现可拖动节点的折现图,在echarts中找到了一个demo,传送门:https://echarts.baidu.com/examples/editor.html?c= ...

  3. 浅谈ES6基础——Promise

    IMAGE加载 Callback Hell function loadImg(src,callback,fail) { var img = document.createElement('img'); ...

  4. VmWare入门指南

    记得以前有大佬曾教过我们用win10的自带双系统运行Ubuntu,但这玩意儿好像玩起来并不简单(反正本人试了一上午也没成功),而且这个系统是和windows交互的,我们也很难调整性能参数.今天,我来教 ...

  5. 偏前端-vue.js学习之路初级(二)组件化构建

    vue.js   组件化构建 组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型.自包含和通常可复用的组件构建大型应用.仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树: ...

  6. css中可以继承的属性

    声明 : 本文源于https://www.cnblogs.com/thislbq/p/5882105.html CSS中可以和不可以继承的属性   一.无继承性的属性 1.display:规定元素应该 ...

  7. PHP 判断密码强度

                 $score = 0;            if(preg_match("/[0-9]+/",$str))            {           ...

  8. 利用python操作mrjob实例---wordcount

       网上利用java实现mr操作实例相对较多,现将python实现mr操作实例---Wordcount分享如下: 在操作前,需要作如下准备: 1.确保linux系统里安装有python3.5,pyt ...

  9. 17个C语言可以做的小案例项目

    C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,比如:不知道C语言可以开发哪些项目,可以应用在哪些实际的开发中……,这些迷茫也导致了我们在学习的过程 ...

  10. 20155239 《Java程序设计》实验三(敏捷开发与XP实践)实验报告

    实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 学会使用git 学会代码的重构 实现团队合作 团队分工 20155239:按照老师的实验三教程,逐步实验,编写代码,并用git上传,下载团 ...