Matplotlib 基础知识(一)


基本概念

数据格式

  • matplotlib 接受 numpy.array 的数据格式进行绘制。

  • pandas numpy.matrix 格式对象最好进行转换。

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    a = pandas.DataFrame(np.random.rand(4, 5), columns = list('abcde'))
    a_asarray = a.values
    
    b = np.matrix([[1, 2], [3, 4]])
    b_asarray = np.asarray(b)

调用风格

  1. 类似matlab风格,调用 plt 的函数进行绘制,作用于当前的 axes 对象上。

    • 适用于交互编程,如 jupyter-notebook

      x = np.linspace(0, 2, 100)
      plt.plot(x, x, label='linear')  # Plot some data on the (implicit) axes.
      plt.plot(x, x**2, label='quadratic')  # etc.
      plt.plot(x, x**3, label='cubic')
      plt.xlabel('x label')
      plt.ylabel('y label')
      plt.title("Simple Plot")
      plt.legend()
  2. 面向对象 (OO) 风格,调用 Axes 的函数进行绘制,作用于调用函数的 axes 对象上。

    • 适用于非交互编程,函数复用的场景。

      x = np.linspace(0, 2, 100)
      
      # fig 是 Figure 对象
      # ax 是 AxesSubplot 对象
      fig, ax = plt.subplots()
      
      ax.plot(x, x, label='linear')  # Plot some data on the axes.
      ax.plot(x, x**2, label='quadratic')  # Plot more data on the axes...
      ax.plot(x, x**3, label='cubic')  # ... and some more.
      
      ax.set_xlabel('x label')
      ax.set_ylabel('y label')
      ax.set_title("Simple Plot")
      ax.legend()

概念解释

参与绘图的主要元素

  1. Canvas

    • 实际进行绘图的对象,对用户隐藏。
  2. Figure

    • 类似绘图时使用的画板,上面可以放很多的画纸。

      # 只创建画布,不创建绘制区域,可以之后再创建
      fig = plt.figure()
      # 创建画布,附带一个绘制区域
      fig, ax = plt.subplots()
      # 创建画布,附带 2*2 个绘制区域
      fix, axs = plt.subplots(2, 2)
      
  3. Axes

    • 类似绘图时使用的画纸。
    • 一个 Figure 对象可以有很多个 Axes,但每个 Axes 只能从属于一个 Figure
    • 具有2或3个 Axis 对象,即图上的坐标轴。
    • 函数接口包括:
      • 刻度范围:set_xlim, set_ylim;
      • 标题:set_title;
      • 坐标轴标签:set_xlabel, set_ylabel 等。
  4. Axis

    • 图上的坐标轴,管理轴上的刻度和刻度名称、范围。
    • 通过 LocatorFormator 控制名称的位置和格式。
  5. Artist

    • 每个绘制对象都是一个Artist对象,从属于一个Axes对象。

代码抽象

def plotter(ax, xdata, ydata, **params):
   return ax.plot(xdata, ydata, **params)

data1, data2, data3, data4 = np.random.randn(4, 100)
fig, ax = plt.subplots(1, 1)
plotter(ax, data1, data2, marker='x')
fig, (ax1, ax2) = plt.subplots(1, 2)
plotter(ax1, data1, data2, marker='x')
plotter(ax2, data3, data4, marker='o')

设置后端的不同方式

  1. rcParams['backend'] 配置文件 matplotlibrc

  2. MPLBACKEND 环境变量

    # Linux
    > export MPLBACKEND=qt5agg
    > python simple_plot.py
    
    > MPLBACKEND=qt5agg python simple_plot.py
    
    # Windows
    > set MPLBACKEND=qt5agg
    > python simple_plot.py
  3. matplotlib.use

    import matplotlib
    matplotlib.use('qt5agg')

交互模式与非交互模式

  1. 交互模式即时更新图像:PyQt/PySide, PyGObject, Tkinter, wxPython, or macOS/Cocoa。

    plt.ion()
    plt.title()
    
    ax = plt.gca()
    ax.set_title()
  2. 非交互模式调用 show 一次性绘制所有对象。阻塞进程,直到手动关闭绘制的图像窗口。

    plt.ioff()
    ... ...
    plt.show()

文章作者: 一汪白水
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 一汪白水 !
  目录