强基初中数学&学Python——第253课 数字和数学第三方模块Matplotlib之七:封装端-艺术家(Artist)教程1

封装端

  这些教程涵盖了Matplotlib中一些更复杂的、封装后端(backend)功能的类和函数。它们可以用于特定的自定义和复杂的可视化。

 

艺术家(Artist)教程

  使用Artist对象在画布上渲染。

  Matplotlib API有三层。

  ● matplotlib.backend_bases.FigureCanvas(图形画布)是绘制图形的区域。

  ● matplotlib.backend_bases.Renderer(渲染器)是知道如何在图形画布上绘制的对象。

  ● matplotlib.artist.Artist(艺术家)是知道如何使用渲染器在画布上绘制的对象:

https://matplotlib.org/stable/api/artist_api.html#matplotlib.artist.Artist。

  FigureCanvas和Renderer处理与用户界面工具包(如wxPython)或绘图语言(如PostScript®)交谈的所有细节,Artist处理所有高级构造(如表示和布置图形、文本和线条)。典型的用户将花费95%的时间与Artists(艺术家)一起工作。

  Artists有两种类型:primitives(基本体)和containers(容器)。基本体表示我们要在画布上绘制的标准图形对象:Line2D(二维线)、Rectangle(矩形)、Text(文本)、AxesImage(Axes图像)等;容器是放置基本体们的空间——Axis(轴)、Axes(图表域)和Figure(图表)。标准用法是先创建一个Figure实例,然后使用这个Figure实例创建一个或多个Axes或Subplot实例,最后使用Axes实例助手方法创建基本体。在下面的示例中,我们使用matplotlib.pyplot.figure()创建了一个Figure实例,这是一种方便的方法,用于实例化Figure类,并将它们与用户界面或绘图工具包FigureCanvas连接。正如我们将在下面讨论的,这是不必要的——可以直接使用PostScript、PDF Gtk+或wxPython的FigureCanvas实例,直接实例化Figures并连接它们——但由于我们在这里关注的是Artist API,因此我们将让pyplot为我们处理其中的一些细节:Line2D:https://matplotlib.org/stable/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2DRectangle(矩形):https://matplotlib.org/stable/api/_as_gen/matplotlib.patches.Rectangle.html#matplotlib.patches.RectangleText(文本):https://matplotlib.org/stable/api/text_api.html#matplotlib.text.TextAxesImage(Axes图像):https://matplotlib.org/stable/api/image_api.html#matplotlib.image.AxesImageAxis(轴):https://matplotlib.org/stable/api/axis_api.html#matplotlib.axis.AxisAxes(图表域):https://matplotlib.org/stable/api/axes_api.html#matplotlib.axes.AxesFigure(图表):https://matplotlib.org/stable/api/figure_api.html#matplotlib.figure.Figurematplotlib.pyplot.figure():

https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.figure.html#matplotlib.pyplot.figure

· 

· 

· 

import matplotlib.pyplot as pltfig = plt.figure()ax = fig.add_subplot(2, 1, 1) # two rows, one column, first plot

  完整代码:

· 

· 

· 

· 

· 

ipython%matplotlib tkimport matplotlib.pyplot as pltfig = plt.figure()ax = fig.add_subplot(2, 1, 1) # 2行1列,第一个图表域(Axes)

 

  Axes可能是Matplotlib API中最重要的类,也是用户大部分时间都要使用的类。这是因为Axes是大多数对象进入的绘图区域,Axes有许多特殊的助手方法(plot()、text()、hist()和imshow())来创建最常见的基本体(分别为Line2D、text、Rectangle和AxesImage)。这些助手方法根据输入的数据(例如numpy数组和字符串),按需要创建原始Artist实例(例如Line2D),然后将它们添加到相关容器中,并在请求绘制时绘制它们。用户中大多数人可能都熟悉Subplot,这只是Axes的一个特例,它位于Subplot实例的常规逐行网格上。如果要在任意位置创建Axes,只需使用add_axes()方法,该方法的输入参数是在0~1相对图形坐标中获取[left,bottom,width,height]值的列表:plot():https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.plot.html#matplotlib.axes.Axes.plottext():https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.text.html#matplotlib.axes.Axes.texthist():https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.hist.html#matplotlib.axes.Axes.histimshow():https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.imshow.html#matplotlib.axes.Axes.imshowadd_axes():

https://matplotlib.org/stable/api/figure_api.html#matplotlib.figure.Figure.add_axes

· 

· 

fig2 = plt.figure()ax2 = fig2.add_axes([0.15, 0.1, 0.7, 0.3])

  完整代码:

· 

· 

· 

· 

· 

ipython%matplotlib tkimport matplotlib.pyplot as pltfig2 = plt.figure()ax2 = fig2.add_axes([0.15, 0.1, 0.7, 0.3])

 

  上面的add_axes()例子只作为插曲,现在继续进行开头的例子:

· 

· 

· 

· 

import numpy as npt = np.arange(0.0, 1.0, 0.01)s = np.sin(2*np.pi*t)line, = ax.plot(t, s, color='blue', lw=2)

  完整代码:

· 

· 

· 

· 

· 

· 

· 

· 

· 

ipython%matplotlib tkimport matplotlib.pyplot as pltfig = plt.figure()ax = fig.add_subplot(2, 1, 1) # 2行1列,第一个图表域(Axes)import numpy as npt = np.arange(0.0, 1.0, 0.01)s = np.sin(2*np.pi*t)llenline, = ax.plot(t, s, color='blue', lw=2)

 

  在本例中,ax是由上面的fig.add_subplot调用创建的Axes实例(请记住Subplot只是Axes的一个子类),接着调用ax.plot时,它会创建一个二维线(Line2D)实例并添加到Axes中。在下面的交互式IPython会话中,用户可以看到Axes.lines列表的长度为1,并且包含线(line)与调用line, = ax.plot...返回的线(line)是同一对象:

 

  随后如果调用ax.plot(保持状态为“on”,这是默认值),那么将向列表中添加其他线(line)。也可以通过调用线(line)的remove方法将其删除:

 

 

 

 

  Axes还具有助手方法来配置和装饰x轴和y轴刻度、刻度标签和轴标签:

  轴标签:

 

 

  刻度、刻度标签:

 

 

  当调用ax.set_xlabel时,它会把有关信息传递给X轴(XAxis)的Text实例。每个Axes实例都包含一个X轴(XAxis)和一个Y轴(YAxis)实例,用于处理刻度、刻度标签和轴标签的布局和绘图。ax.set_xlabel:https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xlabel.html#matplotlib.axes.Axes.set_xlabelXAxis:https://matplotlib.org/stable/api/axis_api.html#matplotlib.axis.XAxisYAxis:https://matplotlib.org/stable/api/axis_api.html#matplotlib.axis.YAxisText:

https://matplotlib.org/stable/api/text_api.html#matplotlib.text.Text

  尝试创建下图表。

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

import numpy as npimport matplotlib.pyplot as plt
fig = plt.figure()fig.subplots_adjust(top=0.8)ax1 = fig.add_subplot(211)ax1.set_ylabel('Voltage [V]')ax1.set_title('A sine wave')
t = np.arange(0.0, 1.0, 0.01)s = np.sin(2*np.pi*t)line, = ax1.plot(t, s, color='blue', lw=2)
# Fixing random state for reproducibilitynp.random.seed(19680801)
ax2 = fig.add_axes([0.15, 0.1, 0.7, 0.3])n, bins, patches = ax2.hist(np.random.randn(1000), 50,                            facecolor='yellow', edgecolor='yellow')ax2.set_xlabel('Time [s]')
plt.show()