返回介绍

基本概念

发布于 2024-05-19 17:49:12 字数 7017 浏览 0 评论 0 收藏 0

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 参数来指定背景色

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文