matplotlib拥有广泛的代码库,对许多新用户来说可能令人生畏。但是,大多数matplotlib用法都可以通过一个相当简单的概念框架和一些重要知识来理解,所以,这篇博客主要介绍一些基本的使用模式、最佳实践以及注意事项,让你更深刻的认识matplotlib的工作方式。

matplotlib一般概念

提醒一句话:everything in matplotlib is organized in a hierarchy.

Parts of Image

state-machine environment

  在层次结构的最顶部是matplotlib “state-machine environment”,它由matplotlib.pyplot模块提供。在此级别,简单函数用于将绘图元素(线条,图像,文本等)添加到当前图形中的当前轴。Pyplot的 “state-machine environment”与MATLAB的行为类似,对于具有MATLAB经验的用户来说应该是最熟悉的 。

Figure

  即整个图像,该图记录了所有子轴,一些“特殊”的artist(标题,图形图例等)和画布(不要过于纠结画布,它是一个至关重要的,因为它是实际上绘图的对象,以获得你的Plot内容,但作为用户它或多或少是不可见的)。一个图像可以有任意数量的Axes,但是应该至少有一个。

fig = plt.figure()  # an empty figure with no axes
fig.suptitle('No axes on this figure')  # Add a title so we know which it isfig, ax_lst = plt.subplots(2, 2)  # a figure with a 2x2 grid of Axes

Axes

  这就是所说的“plot”,它是具有数据空间的图像区域。给定的图形可以包含许多轴,但给定的Axes对象只能在一个图中。 Axes包含两个(或3D的三个)Axis对象(注意Axes和Axis之间的差异),它们负责数据限制(数据限制也可以通过set_xlim()set_ylim()来设置,每个Axes都有一个标题(通过set_title()设置),一个x标签(通过set_xlabel()设置)和一个通过set_ylabel()设置的y标签。

Axis

  这些是类似数字的对象,它们负责设置图形限制并生成刻度线和ticklabels(标记刻度线的字符串)。刻度线的位置由Locator对象确定,ticklabel字符串由Formatter格式化。正确的定位器和格式化器的组合可以非常精确地控制刻度位置和标签。

Artist

  基本上你在图上看到的一切都是artist,这包括Text对象,Line2D对象,集合对象,Patch对象……。渲染图形时,所有artist都被绘制到画布上。大多数artist都与轴有关;这样的artist不能被多个轴共享,也不能从一个轴移动到另一个轴。

matplotlib数据输入

  所有绘图函数都需要np.arraynp.ma.masked_array作为输入。像“array-like”的类(如pandas数据对象和np.matrix)可能会或可能不会按预期工作,最好在绘图之前将它们转换为np.array对象。

matplotlib、pyplot、pylab

  • matplotlib是整个包;
  • matplotlib.pyplot是matplotlib中的一个模块;
  • pylab是一个与matplotlib一起安装的模块;

  pylab是一个便利模块,它在单个名称空间中批量导入matplotlib.pyplot(用于绘图)和numpy(用于数学和使用数组)。虽然之前许多示例使用pylab,但不再推荐使用它。 另外,对于非交互式绘图,建议使用pyplot创建图形,然后使用OO界面进行绘图 。

Coding Style

编程风格很重要,对于matplotlib有两种编程风格,这在python matplotlib入门(一)Matplotlib工作流程 就总结过,一是 MATLAB-style,这是一种类似于matlab的代码风格;另一种是 OO-style,即面向对象的代码风格。

Backends

  matplotlib针对许多不同的用例和输出格式:有些人从python shell交互使用matplotlib,并在键入命令时弹出绘图窗口;有些人将matplotlib嵌入到图形用户界面(如wxpython或pygtk)中以构建丰富的应用程序;其他人在批处理脚本中使用matplotlib从一些数值模拟生成postscript图像;还有一些在Web应用程序服务器中生成posts动画以动态提供图形。 为了支持所有这些用例,matplotlib可以针对不同的输出,并且这些功能中的每一个都称为后端。“前端”是面向用户的代码,即绘图代码;而“后端”完成幕后的所有艰苦工作以制作图形。有两种类型的后端:用户界面后端和硬拷贝后端来制作图像文件(PNG,SVG,PDF,PS)。

# 方法1
#The backend parameter in your matplotlibrc file (see Customizing Matplotlib with style sheets and rcParams):backend : WXAgg   # use wxpython with antigrain (agg) rendering# 方法2
# If your script depends on a specific backend you can use the use() function:import matplotlib
matplotlib.use('PS')   # generate postscript output by default

注意:如果使用use()函数,则必须在导入matplotlib.pyplot之前完成此操作。导入pyplot后调用use()将不起作用。如果用户想要使用不同的后端,则使用use()将需要更改代码。因此,除非绝对必要,否则应避免显式调用use()

Performance

  1. 使用快速样式

    快速样式可用于自动将简化和分块参数设置为合理的设置,以加快绘制大量数据的速度。它可以通过运行简单地使用:

    import matplotlib.style as mplstyle
    mplstyle.use('fast')# 也可以使用多个样式组合,并确保fast在最后mplstyle.use(['dark_background', 'ggplot', 'fast'])
  2. 线分块(chunk)

    
    # 仅适用于以agg作为后端时import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    mpl.rcParams['path.simplify_threshold'] = 1.0# Setup, and create the data to ploty = np.random.rand(100000)
    y[50000:] *= 2
    y[np.logspace(1,np.log10(50000), 400).astype(int)] = -1mpl.rcParams['path.simplify'] = Truempl.rcParams['agg.path.chunksize'] = 0
    plt.plot(y)
    plt.show()mpl.rcParams['agg.path.chunksize'] = 10000
    plt.plot(y)
    plt.show()
  3. 标记简化

    标记也可以简化,尽管不如下面要介绍的线段简化强大 。标记简化仅适用于Line2D对象(通过属性markevery)。无论何处传递Line2D构造参数,例如matplotlib.pyplot.plot()matplotlib.axes.Axes.plot(),更多请参考 Markevery Demo

    plt.plot(x, y, markevery=10)

  4. 线段简化

    path.simplify参数是一个布尔值,表示线段是否简化;path.simplify_threshold参数控制简化的线段数量,更高的阈值会有更快的渲染。

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib as mpl# Setup, and create the data to ploty = np.random.rand(100000)
    y[50000:] *= 2
    y[np.logspace(1, np.log10(50000), 400).astype(int)] = -1
    mpl.rcParams['path.simplify'] = True# simplify_threshold 默认是1/9mpl.rcParams['path.simplify_threshold'] = 0.0
    plt.plot(y)
    plt.show()mpl.rcParams['path.simplify_threshold'] = 1.0
    plt.plot(y)
    plt.show()

matplotlib(四)核心模式以及注意事项相关推荐

  1. gRPC四种模式、认证和授权实战演示

    前言 上一篇对gRPC进行简单介绍,并通过示例体验了一下开发过程.接下来说说实际开发常用功能,如:gRPC的四种模式.gRPC集成JWT做认证和授权等. 正文 1. gRPC四种模式服务 以下案例演示 ...

  2. 2021年用独立站铁赚的四种模式

    近期独立站建站平台发布财报,在2020年一年时间里,GMV 翻了一番.这个结果充分说明了独立站越来越受到卖家们的青睐,布局独立站也成为了必备标配. 想在2021年里利用独立站走上人生巅峰?那必然离不开 ...

  3. 云计算技术架构-云计算四种模式(公有云、私有云、混合云、行业云)

    接下来几篇主要从技术角度介绍云计算的架构:  云计算四种模式:公有云.私有云.混合云和行业云(本文讲述)  云计算架构:基础架构层.云平台层.业务应用层和业务管理层  云计算服务模式:IaaS. ...

  4. Seata的四种模式介绍

    什么时候需要用到分布式事务: 就是指不是单个服务或者单个数据库架构下产生的事务,例如: 跨数据源的分布式事务 跨服务的分布式事务 Seata有四种模式: XA.AT(默认).TCC.Seaga XA: ...

  5. 浅析运动健身APP开发的四种模式

    健身行业是在"互联网+"的大潮中最早觉醒的行业之一,自2015年可谓运动健身APP开发爆发后,各类运动健身APP和智能硬件层出不穷,运动健身APP开发应用市场已被创业者视为开疆破土 ...

  6. Qt OpenGL(二十)——Qt OpenGL 核心模式版本

    Qt OpenGL(二十)--Qt OpenGL 核心模式版本 一.写在前面 在之前的OpenGL教程(1~19)中,采用的方式都是固定渲染管线,也就是OpenGL3.2版本之前的写法,但是OpenG ...

  7. OpenGL核心模式详细讲解[结合LearnOpenGL]

    OpenGL立即渲染模式&核心模式 OpenGL (for"Open Graphics Library") is an API (Application Programmi ...

  8. 饥荒独立服务器在线模式收不到,饥荒服务器四种模式介绍 | 手游网游页游攻略大全...

    发布时间:2016-03-13 近日有外媒宣称,独立制作团队rdt.32成功地进行了高清重制,并且它还有一个新的名字:.本作已经登陆了Steam的抢先体验 ... 标签: 原创资讯 凯撒大帝3 发布时 ...

  9. 商用WIFI 四种模式均分天下

    智能手机普及和移动电子商务借势O2O快速发展,使沉寂多年的智慧城市一夜之间又变得大热,其重要的标志是以北京.杭州.成都为代表的国内众多城市纷纷拿出时间表,宣布要实现城市全城或旅游风景区.公共交通等公共 ...

最新文章

  1. 不懂装饰器,就不是真正会 Python
  2. fcn从头开始_如何使用Go从头开始构建区块链
  3. pytorch中tensor类型转换
  4. java操作ElasticSearch(es)进行增删查改操作
  5. FM1288通过串口配置
  6. [摘译]js内存泄漏常见的四种情况
  7. Linux 异步IO
  8. Weak Pair (dfs+树状数组)
  9. vue对于ntko的应用经验
  10. 复变函数在计算机科学中的应用,051复变函数与实变函数
  11. 【新农合专题】新农合系统资料汇总贴(新增134个)
  12. java中的约瑟夫问题_java实现约瑟夫问题
  13. ctl文件去空格,word文档段落如何空格去掉 word文档段落前空格
  14. python爬取链家网_Python爬链家网租房信息
  15. Photoshop从入门到放弃
  16. C++,OpenCV 中template(模板)的简单理解
  17. android paint 圆角 绘制_android 绘制椭圆 圆角矩形 详细解析
  18. 里氏代换原则(Liskov Substitution Principle)
  19. 当你热爱现实, 世界就是你照见的自己
  20. 控制台Dmaven.multiModuleProjectDirectory=$M2_HOME

热门文章

  1. Linux上搭建h2引擎加载h2文件
  2. 【详细注释】1051 Pop Sequence (25 分)
  3. 给Dev-Cpp开挂
  4. mysql5.7主从同步与读写分离
  5. python应用html模板,Flask框架如何使用HTML模板
  6. java 10000阶乘_Java ForkJoinPool: 3秒计算100万的阶乘
  7. osgi框架和spring区别_BATJ面试必会之 Spring 篇(二)
  8. visual studio 怎么生成coredump文件_coredump详解
  9. elasticsearch 索引_Elasticsearch系列---索引管理
  10. jupyter notebook使用opencv的例子_Python安装Jupyter Notebook配置使用教程