1. 概述

1.1 matplotlib的三层api

matplotlib的原理或者说基础逻辑是,用Artist对象在画布(canvas)上绘制(Render)图形。
就和人作画的步骤类似:
① 准备一块画布或画纸
② 准备好颜料、画笔等制图工具
③ 作画

所以matplotlib有三个层次的API:
matplotlib.backend_bases.FigureCanvas 代表了绘图区,所有的图像都是在绘图区完成的

  • matplotlib.backend_bases.Re**nderer 代表了渲染器**,可以近似理解为画笔,控制如何在 FigureCanvas 上画图。

matplotlib.artist.Artist 代表了具体的图表组件,即调用了Renderer的接口在Canvas上作图。

前两者处理程序和计算机的底层交互的事项,第三项Artist就是具体的调用接口来做出我们想要的图,比如图形、文本、线条的设定。所以通常来说,我们95%的时间,都是用来和matplotlib.artist.Artist类打交道的。

1.2 Artist的分类

Artist有两种类型:primitivescontainers

  • primitive是基本要素,它包含一些我们要在绘图区作图用到的标准图形对象,如曲线Line2D,文字text,矩形Rectangle,图像image等。


  • container是容器,即用来装基本要素的地方,包括图形figure、坐标系Axes和坐标轴Axis。

他们之间的关系如下图所示:
20201122230916134.jpeg

1.3 matplotlib标准用法

matplotlib的标准使用流程为:
① 创建一个Figure实例;
② 使用Figure实例创建一个或者多个AxesSubplot实例;
③ 使用Axes实例的辅助方法来创建primitive

值得一提的是,Axes是一种容器,它可能是matplotlib API中最重要的类,并且我们大多数时间都花在和它打交道上。更具体的信息会在之后容器小节说明。

一个流程示例及说明如下:
声明,以下代码在Ipython Shell中运行
**
第一步:创建了一个空白的Figure实例对象。(对应1.2里关系图的最外层)

  1. %matplotlib
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. # step 1
  5. # 我们用 matplotlib.pyplot.figure() 创建了一个Figure实例
  6. fig = plt.figure()

image.png

第二步:在Figure实例中创建2个绘图区,并在第一个绘图区创建了一个subplot实例。(对应1.2关系图的中间层)

  1. # step 2
  2. # 然后用Figure实例创建了一个两行一列(即可以有两个subplot)的绘图区,并同时在第一个位置创建了一个subplot
  3. ax = fig.add_subplot(2, 1, 1) # two rows, one column, first plot

image.png

第三步:用Axes实例的方法画了一条曲线 (对应1.2关系图的最里层)

  1. # step 3
  2. # 然后用Axes实例的方法画了一条曲线
  3. t = np.arange(0.0, 1.0, 0.01)
  4. s = np.sin(2*np.pi*t)
  5. line, = ax.plot(t, s, color='blue', lw=2)

image.png

小知识:
在IPython运行%matplotlib这行代码的作用是什么?
这行代码是Ipython内置的一个魔法命令(官网文:Built-in magic commands),这些魔法命令能够帮助我们快速完成某些工作。这个命令的完整用法是%matplotlib [-l] [gui] 。这行代码只需要运行一次即可。
这个魔法命令是用来快速设置matplotlib后端交互工作的类型(backend),默认使用TkAgg
如果你在画图过程出现无法显示图片(plt.show() 不显示图片),那就有可能是后端交互设置的问题,遇到这种问题可以参考这个教程:matplotlib中的plot.show()不显示图片

  1. In [2]: %matplotlib # 默认使用TkAgg
  2. Using matplotlib backend: TkAgg
  3. In [3]:%matplotlib qt # 可以指定交互的后端类型,有的需要安装相应的模块
  4. Using matplotlib backend: qt
  5. In [4]: %matplotlib --list # 查看支持的后端类型
  6. Available matplotlib backends: ['osx', 'qt4', 'qt5', 'gtk3', 'notebook', 'wx', 'qt', 'nbagg',
  7. 'gtk', 'tk', 'inline']

在IPythonShell中还可以用以下方法指定backend,但是这个方法在使用plt.show()之后才会显示图片,并且不关闭图片的话,会阻塞当前的线路。(只是作为讲解说明,不推荐使用)

  1. import matplotlib
  2. matplotlib.use('TkAgg')

在Jupyter Notebook(以前叫IPython Notebook)中使用%matplotlib inline来快速设置matplotlib后端交互工作的类型(backend)。

2. 自定义你的Artist对象

2.1 Artist属性

在图形中的每一个元素都对应着一个matplotlib Artist,且都有其对应的配置属性列表。
Figure本身包含一个Rectangle,Rectangle的大小就是Figure的大小;你可以用来设置Figure的背景色和透明度。
每个Axes边界框(默认白底黑边),也有一个Rectangle,通过它可以设置Axes的颜色、透明度等。

这些实例都存储在成员变量(member variables) Figure.patchAxes.patch中。 (Patch是一个来源于MATLAB的名词,它是图形上颜色的一个2D补丁,包含rectangels-矩形circles-圆 plygons-多边形

换个表达方式:

  • Figure.patch属性:是一个Rectangle,代表了图表的矩形框,它的大小就是图表的大小, 并且可以通过它设置figure的背景色和透明度。
  • Axes.patch属性:也是一个Rectangle,代表了绘图坐标轴内部的矩形框(白底黑边), 通过它可以设置Axes的颜色、透明度等。


每个matplotlib Artist都有以下属性:

  • .alpha属性:透明度。值为0—1之间的浮点数。
  • .axes属性:返回这个Artist所属的axes,可能为None。
  • .figure属性:该Artist所属的Figure,可能为None。
  • .label:一个text label。
  • .visible:布尔值,控制Artist是否绘制。

这里仅列举几个常见的属性,更详细的属性清单请查阅官方文档:Artist属性列表

  1. # .patch
  2. plt.figure().patch
  3. plt.axes().patch

这里返回了matplotlib.patches.Rectangle对象。
image.png
image.png

2.2 属性调用方式

Artist对象的所有属性都通过相应的 get_*set_*函数进行读写。
例如下面的语句将alpha属性设置为当前值的一半:

  1. a = o.get_alpha()
  2. o.set_alpha(0.5*a)

如果想一次设置多个属性,也可以用set方法:

  1. o.set(alpha=0.5, zorder=2)

可以使用 matplotlib.artist.getp(o,”alpha”) 来获取属性,如果指定属性名,则返回对象的该属性值;如果不指定属性名,则返回对象的所有的属性和值。
image.png
完整的返回结果如下:

  1. In [13]: import matplotlib
  2. In [14]: matplotlib.artist.getp(fig.patch)
  3. agg_filter = None
  4. alpha = None
  5. animated = False
  6. antialiased or aa = False
  7. bbox = Bbox(x0=0.0, y0=0.0, x1=1.0, y1=1.0)
  8. capstyle = butt
  9. children = []
  10. clip_box = None
  11. clip_on = True
  12. clip_path = None
  13. contains = None
  14. data_transform = BboxTransformTo( TransformedBbox( Bbox...
  15. edgecolor or ec = (1.0, 1.0, 1.0, 1.0)
  16. extents = Bbox(x0=0.0, y0=0.0, x1=640.0, y1=480.0)
  17. facecolor or fc = (1.0, 1.0, 1.0, 1.0)
  18. figure = Figure(640x480)
  19. fill = True
  20. gid = None
  21. hatch = None
  22. height = 1
  23. in_layout = False
  24. joinstyle = miter
  25. label =
  26. linestyle or ls = solid
  27. linewidth or lw = 0.0
  28. patch_transform = CompositeGenericTransform( BboxTransformTo( ...
  29. path = Path(array([[0., 0.], [1., 0.], [1.,...
  30. path_effects = []
  31. picker = None
  32. rasterized = None
  33. sketch_params = None
  34. snap = None
  35. transform = CompositeGenericTransform( CompositeGenericTra...
  36. transformed_clip_path_and_affine = (None, None)
  37. url = None
  38. verts = [[ 0. 0.] [640. 0.] [640. 480.] [ 0. 480....
  39. visible = True
  40. width = 1
  41. window_extent = Bbox(x0=0.0, y0=0.0, x1=640.0, y1=480.0)
  42. x = 0
  43. xy = (0, 0)
  44. y = 0
  45. zorder = 1

3. 基本元素 - primitives

现在我们知道了如何检查和设置给定对象的属性,我们还需要知道如何获取该对象。

前文介绍到,Artist包含两种对象:基本要素-primitives和 容器-containers
primitives是基本要素,它包含一些我们要在绘图区作图用到的标准图形对象,如曲线Line2D,文本text,矩形Rectangle,图像image等。
container是容器,即用来装基本要素的地方,包括图形figure、坐标系Axes和坐标轴Axis。

本章重点介绍下 primitives 的几种类型:曲线-Line2D,矩形-Rectangle,图像-image (其中文本-Text较为复杂,会在之后单独详细说明。)

3.1 2DLines

在matplotlib中曲线的绘制,主要是通过类 matplotlib.lines.Line2D来完成的。
它的基类: matplotlib.artist.Artist

matplotlib中线-line的含义:它表示的可以是连接所有顶点的实线样式,也可以是每个顶点的标记。此外,这条线也会受到绘画风格的影响,比如,我们可以创建虚线种类的线。
它的构造函数:

matplotlib.lines.Line2D(xdata, ydata, linewidth=None, linestyle=None, color=None, marker=None, markersize=None, markeredgewidth=None, markeredgecolor=None, markerfacecolor=None, markerfacecoloralt=’none’, fillstyle=None, antialiased=None, dash_capstyle=None, solid_capstyle=None, dash_joinstyle=None, solid_joinstyle=None, pickradius=5, drawstyle=None, markevery=None, **kwargs)

其中常用的的参数有:

  • xdata:需要绘制的line中点的在x轴上的取值,若忽略,则默认为range(1,len(ydata)+1)
  • ydata:需要绘制的line中点的在y轴上的取值
  • linewidth:线条的宽度
  • linestyle:线型
  • color:线条的颜色
  • marker:点的标记,详细可参考markers API
  • markersize:标记的size

其他详细参数可参考Line2D官方文档

3.1.1 如何设置Line2D的属性

有三种方法可以用设置线的属性。
①直接plot()函**数中设置**。

  1. import matplotlib.pyplot as plt
  2. x = range(0,5)
  3. y = [2,5,7,8,10]
  4. plt.plot(x,y, linewidth=10) # 设置线的粗细参数为10
  5. plt.show()

image.png

②通过获得线对象,对线对象进行设置

  1. # 在ipython里需要加上这一行,创建新的Figure实例,以免把图像画到上一个Figure实例里
  2. plt.figure()
  3. x = range(0,5)
  4. y = [2,5,7,8,10]
  5. line, = plt.plot(x, y, '-')
  6. line.set_antialiased(False) # 关闭抗锯齿功能

(前面的截图方式太占地方了,也不整洁,下面就不截整个绘图窗口了)
image.png

③获得线属性,使用**setp()**函数设置

  1. plt.figure()
  2. x = range(0,5)
  3. y = [2,5,7,8,10]
  4. lines = plt.plot(x, y)
  5. plt.setp(lines, color='r', linewidth=10)

image.png

3.1.2 如何绘制lines

①绘制直线line
常用的方法有两种

  • pyplot方法绘制
  • Line2D对象绘制

1)pyplot方法绘制

  1. plt.figure()
  2. x = range(0,5)
  3. y = [2,5,7,8,10]
  4. plt.plot(x,y)

image.png

2)Line2D对象绘制

  1. from matplotlib.lines import Line2D
  2. x = range(0,5)
  3. y = [2,5,7,8,10]
  4. fig = plt.figure()
  5. ax = fig.add_subplot(111)
  6. line = Line2D(x, y)
  7. ax.add_line(line)
  8. ax.set_xlim(min(x), max(x))
  9. ax.set_ylim(min(y), max(y))
  10. plt.show()

image.png

②errorbar绘制误差折线图
pyplot里有个专门绘制误差线的功能,通过errorbar类实现,它的构造函数:

matplotlib.pyplot.errorbar(x, y, yerr=None, xerr=None, fmt=’’, ecolor=None, elinewidth=None, capsize=None, barsabove=False, lolims=False, uplims=False, xlolims=False, xuplims=False, errorevery=1, capthick=None, , data=None, *kwargs)

其中最主要的参数是前几个:

  • x:需要绘制的line中点的在x轴上的取值
  • y:需要绘制的line中点的在y轴上的取值
  • yerr:指定y轴水平的误差
  • xerr:指定x轴水平的误差
  • fmt:指定折线图中某个点的颜色,形状,线条风格,例如‘co–’
  • ecolor:指定error bar的颜色
  • elinewidth:指定error bar的线条宽度

绘制errorbar

  1. fig = plt.figure()
  2. x = np.arange(10)
  3. y = 2.5 * np.sin(x / 20 * np.pi)
  4. yerr = np.linspace(0.05, 0.2, 10)
  5. plt.errorbar(x, y + 3, yerr=yerr, label='both limits (default)')

image.png

3.2 patchas

matplotlib.patches.Patch类是二维图形类。它的基类是matplotlib.artist.Artist,它的构造函数:详细清单见 matplotlib.patches API

Patch(edgecolor=None, facecolor=None, color=None, linewidth=None, linestyle=None, antialiased=None, hatch=None, fill=True, capstyle=None, joinstyle=None, **kwargs)

3.2.1 Rectangle-矩形

Rectangle矩形类在官网中的定义是: 通过锚点xy及其宽度和高度生成。
Rectangle本身的主要比较简单,即xy控制锚点,width和height分别控制宽和高。它的构造函数:

matplotlib.patches.Rectangle(xy, width, height, angle=0.0, **kwargs)


在实际中最常见的矩形图是hist直方图和bar条形图。

① hist-直方图

matplotlib.pyplot.hist(x,bins=None,range=None, density=None, bottom=None, histtype=‘bar’, align=‘mid’, log=False, color=None, label=None, stacked=False, normed=None)

下面是一些常用的参数:

  • x: 数据集,最终的直方图将对数据集进行统计
  • bins: 统计的区间分布
  • range: tuple, 显示的区间,range在没有给出bins时生效
  • density: bool,默认为false,显示的是频数统计结果,为True则显示频率统计结果,这里需要注意,频率统计结果=区间数目/(总数*区间宽度),和normed效果一致,官方推荐使用density
  • histtype: 可选{‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’}之一,默认为bar,推荐使用默认配置,step使用的是梯状,stepfilled则会对梯状内部进行填充,效果与bar类似
  • align: 可选{‘left’, ‘mid’, ‘right’}之一,默认为’mid’,控制柱状图的水平分布,left或者right,会有部分空白区域,推荐使用默认
  • log: bool,默认False,即y坐标轴是否选择指数刻度
  • stacked: bool,默认为False,是否为堆积状图

hist绘制直方图

  1. plt.figure()
  2. x=np.random.randint(0,100,100) #生成[0-100)之间的100个数据,即数据集
  3. bins=np.arange(0,101,10) #设置连续的边界值,即直方图的分布区间[0,10),[10,20)...
  4. plt.hist(x,bins,color='fuchsia',alpha=0.5)#alpha设置透明度,0为完全透明
  5. plt.xlabel('scores')
  6. plt.ylabel('count')
  7. plt.xlim(0,100)#设置x轴分布范围
  8. plt.show()

np.random.randint(0,100,100)这行代码生成了100个数值在[0.100)区间内的随机数。所以每次执行上面这个代码块的结果都会不一样的。
image.png

Rectangle矩形类绘制直方图

  1. import pandas as pd
  2. import re
  3. df = pd.DataFrame(columns = ['data'])
  4. df.loc[:,'data'] = x # 前面生成的100个随机数
  5. df['fenzu'] = pd.cut(df['data'], bins=bins, right = False,include_lowest=True)
  6. df_cnt = df['fenzu'].value_counts().reset_index()
  7. df_cnt.loc[:,'mini'] = df_cnt['index'].astype(str).map(lambda x:re.findall('\[(.*)\,',x)[0]).astype(int)
  8. df_cnt.loc[:,'maxi'] = df_cnt['index'].astype(str).map(lambda x:re.findall('\,(.*)\)',x)[0]).astype(int)
  9. df_cnt.loc[:,'width'] = df_cnt['maxi']- df_cnt['mini']
  10. df_cnt.sort_values('mini',ascending = True,inplace = True)
  11. df_cnt.reset_index(inplace = True,drop = True)
  12. #用Rectangle把hist绘制出来
  13. fig = plt.figure()
  14. ax1 = fig.add_subplot(111)
  15. #rect1 = plt.Rectangle((0,0),10,10)
  16. #ax1.add_patch(rect)
  17. #ax2 = fig.add_subplot(212)
  18. for i in df_cnt.index:
  19. rect = plt.Rectangle((df_cnt.loc[i,'mini'],0),df_cnt.loc[i,'width'],df_cnt.loc[i,'fenzu'])
  20. #rect2 = plt.Rectangle((10,0),10,5)
  21. ax1.add_patch(rect)
  22. #ax1.add_patch(rect2)
  23. ax1.set_xlim(0, 100)
  24. ax1.set_ylim(0, 16)
  25. plt.show()

image.png

②bar-柱状图

matplotlib.pyplot.bar(left, height, alpha=1, width=0.8, color=, edgecolor=, label=, lw=3)

下面是一些常用的参数:

  • left:x轴的位置序列,一般采用range函数产生一个序列,但是有时候可以是字符串
  • height:y轴的数值序列,也就是柱形图的高度,一般就是我们需要展示的数据;
  • alpha:透明度,值越小越透明
  • width:为柱形图的宽度,一般这是为0.8即可;
  • color或facecolor:柱形图填充的颜色;
  • edgecolor:图形边缘颜色
  • label:解释每个图像代表的含义,这个参数是为legend()函数做铺垫的,表示该次bar的标签

bar绘制柱状图

  1. plt.figure()
  2. y = range(1,17)
  3. plt.bar(np.arange(16), y, alpha=0.5,
  4. width=0.5, color='yellow',
  5. edgecolor='red',
  6. label='The First Bar', lw=3)

image.png

Rectangle矩形类绘制柱状图

  1. fig = plt.figure()
  2. ax1 = fig.add_subplot(111)
  3. for i in range(1,17):
  4. rect = plt.Rectangle((i+0.25,0),0.5,i)
  5. ax1.add_patch(rect)
  6. ax1.set_xlim(0, 16)
  7. ax1.set_ylim(0, 16)
  8. plt.show()

image.png

3.2.2 Polygon-多边形

matplotlib.patches.Polygon类是多边形类。其基类是matplotlib.patches.Patch,它的构造函数:

matplotlib.patches.Polygon(xy, closed=True, **kwargs)

参数说明:

  • xy是一个N×2的numpy.array,为多边形的顶点。
  • closed为True则指定多边形将起点和终点重合从而显式关闭多边形。

matplotlib.patches.Polygon类中常用的是fill类,它是基于xy绘制一个填充的多边形,它的定义:

matplotlib.pyplot.fill(args, data=None, *kwargs)

参数说明 : 关于x、y和color的序列,其中color是可选的参数,每个多边形都是由其节点的x和y位置列表定义的,后面可以选择一个颜色说明符。您可以通过提供多个x、y、[颜色]组来绘制多个多边形。

fill绘制图形

  1. plt.figure()
  2. x = np.linspace(0, 5 * np.pi, 1000)
  3. y1 = np.sin(x)
  4. y2 = np.sin(2 * x)
  5. plt.fill(x, y1, color = "g", alpha = 0.3)

image.png


3.2.3Wedge-契形

matplotlib.patches.Polygon类是多边形类。其基类是matplotlib.patches.Patch,它的构造函数:

class matplotlib.patches.Wedge(center, r, theta1, theta2, width=None, **kwargs)

一个Wedge-契形 是以坐标x,y为中心,半径为r,从θ1扫到θ2(单位是度)。
如果宽度给定,则从内半径r -宽度到外半径r画出部分楔形。wedge中比较常见的是绘制饼状图pie。

matplotlib.pyplot.pie语法:

matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)

制作数据x的饼图,每个楔子的面积用x/sum(x)表示。
其中最主要的参数是前4个:

  • x:契型的形状,一维数组。
  • explode:如果不是等于None,则是一个len(x)数组,它指定用于偏移每个楔形块的半径的分数。
  • labels:用于指定每个契型块的标记,取值是列表或为None。
  • colors:饼图循环使用的颜色序列。如果取值为None,将使用当前活动循环中的颜色。
  • startangle:饼状图开始的绘制的角度。

pie绘制饼状图

  1. labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
  2. sizes = [15, 30, 45, 10]
  3. explode = (0, 0.1, 0, 0)
  4. fig1, ax1 = plt.subplots()
  5. ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90)
  6. ax1.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.
  7. plt.show()

image.png

wedge绘制饼图

  1. from matplotlib.patches import Circle, Wedge
  2. from matplotlib.collections import PatchCollection
  3. fig = plt.figure()
  4. ax1 = fig.add_subplot(111)
  5. theta1 = 0
  6. sizes = [15, 30, 45, 10]
  7. patches = []
  8. patches += [
  9. Wedge((0.3, 0.3), .2, 0, 54), # Full circle
  10. Wedge((0.3, 0.3), .2, 54, 162), # Full ring
  11. Wedge((0.3, 0.3), .2, 162, 324), # Full sector
  12. Wedge((0.3, 0.3), .2, 324, 360), # Ring sector
  13. ]
  14. colors = 100 * np.random.rand(len(patches))
  15. p = PatchCollection(patches, alpha=0.4)
  16. p.set_array(colors)
  17. ax1.add_collection(p)
  18. plt.show()

image.png


3.3 collections

collections类是用来绘制一组对象的集合,collections有许多不同的子类,如RegularPolyCollection , CircleCollection, Pathcollection, 分别对应不同的集合子类型。

其中比较常用的就是散点图,它是属于PathCollection子类,scatter方法提供了该类的封装,根据x与y绘制不同大小或颜色标记的散点图。 它的构造方法:

Axes.scatter(self, x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=, edgecolors=None, , plotnonfinite=False, data=None, *kwargs)

其中最主要的参数是前5个:

  • x:数据点x轴的位置
  • y:数据点y轴的位置
  • s:尺寸大小
  • c:可以是单个颜色格式的字符串,也可以是一系列颜色
  • marker: 标记的类型

scatter绘制散点图

  1. plt.figure()
  2. x = [0,2,4,6,8,10]
  3. y = [10]*len(x)
  4. s = [20*2**n for n in range(len(x))]
  5. plt.scatter(x,y,s=s)
  6. plt.show()

image.png

3.4 images

images是matplotlib中绘制image图像的类,其中最常用的imshow可以根据数组绘制成图像images的构造函数:

matplotlib.image.AxesImage(ax, cmap=None, norm=None, interpolation=None, origin=None, extent=None, filternorm=True, filterrad=4.0, resample=False, **kwargs)

imshow的构造函数:

matplotlib.pyplot.imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=, filternorm=1, filterrad=4.0, imlim=, resample=None, url=None, , data=None, *kwargs)

使用imshow画图时首先需要传入一个数组,数组对应的是空间内的像素位置和像素点的值interpolation参数可以设置不同的插值方法,具体效果如下。

  1. methods = [None, 'none', 'nearest', 'bilinear', 'bicubic', 'spline16',
  2. 'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric',
  3. 'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc', 'lanczos']
  4. grid = np.random.rand(4, 4)
  5. fig, axs = plt.subplots(nrows=3, ncols=6, figsize=(9, 6),
  6. subplot_kw={'xticks': [], 'yticks': []}) # 不显示坐标轴
  7. for ax, interp_method in zip(axs.flat, methods):
  8. ax.imshow(grid, interpolation=interp_method, cmap='viridis')
  9. ax.set_title(str(interp_method))
  10. plt.tight_layout()
  11. plt.show()

这里生成了4x4个值域在[0,1]之间的随机数。这一共16个数值分别表示这16小方块所在位置的像素点的值。使用不同的插值方法,使得方框之间产生了不同形状和颜色的渐变。
image.png