Matplotlib是一个Python 2D绘图库,能够以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形,用来绘制各种静态,动态,交互式的图表。
Matplotlib已经成为python中公认的数据可视化工具,我们所熟知的pandas和seaborn的绘图接口其实也是基于matplotlib所作的高级封装。
Matplotlib的图像是画在figure(如windows,jupyter窗体)上的,每一个figure又包含了一个或多个axes(一个可以指定坐标系的子区域)。最简单的创建figure以及axes的方式是通过pyplot.subplots
命令,创建axes以后,可以使用Axes.plot
绘制最简易的折线图。
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots() # 创建一个包含一个axes的figure
ax.plot([1, 2, 3, 4], [1, 4, 2, 3]) # 绘制图像
?
matplotlib.pyplot
方法能够直接在当前axes上绘制图像,如果用户未指定axes,matplotlib会帮你自动创建一个。所以上面也可以简化为以下这一行代码。
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
一个完整的matplotlib图像通常会包括以下四个层级,这些层级也被称为容器
Figure
:顶层级,用来容纳所有绘图元素
Axes
:容纳了大量元素用来构造一幅幅子图,一个figure可以由一个或多个子图组成
Axis
:axes的下属层级,用于处理所有和坐标轴,网格有关的元素
Tick
:axis的下属层级,用来处理所有和刻度有关的元素
将通过各种命令方法来操纵图像中的每一个部分,从而达到数据可视化的最终效果
matplotlib提供了两种最常用的绘图接口
显式创建figure和axes,在上面调用绘图方法
依赖pyplot自动创建figure和axes,并绘图
x = np.linspace(0, 2, 100)
fig, ax = plt.subplots()
ax.plot(x, x, label='linear')
ax.plot(x, x**2, label='quadratic')
ax.plot(x, x**3, label='cubic')
ax.set_xlabel('x label')
ax.set_ylabel('y label')
ax.set_title("Simple Plot")
ax.legend()
?采用第二种绘图接口,绘制同样的图:
x = np.linspace(0, 2, 100) # 生成了一个从0到2的数组,包含100个元素
plt.plot(x, x, label='linear')
plt.plot(x, x**2, label='quadratic')
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()
matplotlib的基础逻辑是,用Artist对象在画布(canvas)上绘制(Render)图形。
就和人作画的步骤类似:
所以matplotlib有三个层次的API:
matplotlib.backend_bases.FigureCanvas
?代表了绘图区,所有的图像都是在绘图区完成的matplotlib.backend_bases.Renderer
?代表渲染器,可以理解为画笔,控制如何在Canvas 上图。matplotlib.artist.Artist
?代表了具体的图表组件,即调用了Renderer的接口在Canvas上作图。
前两者处理程序和计算机的底层交互的事项,第三项Artist就是具体的调用接口来做出我们想要的图,比如图形、文本、线条的设定。
Artist有两种类型:primitives
?和containers
。primitive
是基本要素,它包含一些我们要在绘图区作图用到的标准图形对象,如曲线Line2D,文字text,矩形Rectangle,图像image等。container
是容器,即用来装基本要素的地方,包括图形figure、坐标系Axes和坐标轴Axis。
matplotlib的标准使用流程为:
Figure
实例Figure
实例创建一个或者多个Axes
或Subplot
实例Axes
实例的辅助方法来创建primitive
>>>在matplotlib中,一个图形对象(Figure)中的坐标轴(Axes),Figure是一个顶层容器,用于容纳整个绘图区域。而Axes则是Figure内部的一个子容器,用于绘制具体的图形。
>>>Matplotlib库中的primitive,通常译为“原始对象”,是用于创建和操作图形的基元。这些基元包括线、矩形、圆形等,它们是构成复杂图形的基本元素。通过使用这些primitive,开发者可以灵活地定制和配置他们的图形。
import matplotlib.pyplot as plt
import numpy as np
# step 1
# 我们用 matplotlib.pyplot.figure() 创建了一个Figure实例
fig = plt.figure()
# step 2
# 然后用Figure实例创建了一个两行一列(即可以有两个subplot)的绘图区,并同时在第一个位置创建了一个subplot
ax = fig.add_subplot(2, 1, 1) # two rows, one column, first plot
# step 3
# 然后用Axes实例的方法画了一条曲线
t = np.arange(0.0, 1.0, 0.01)
s = np.sin(2*np.pi*t)
line, = ax.plot(t, s, color='blue', lw=2)
在图形中的每一个元素都对应着一个matplotlib?Artist
,且都有其对应的配置属性列表。
Figure
本身包含一个Rectangle,Rectangle的大小就是Figure的大小;你可以用来设置Figure的背景色和透明度。
每个Axes
边界框(默认白底黑边),也有一个Rectangle,通过它可以设置Axes的颜色、透明度等。
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是否绘制plt.figure().patch
plt.axes().patch
?
Artist对象的所有属性都通过相应的?get_*
?和?set_*
?函数进行读写。
例如下面的语句将alpha属性设置为当前值的一半:
a = o.get_alpha()
o.set_alpha(0.5*a)
如果想一次设置多个属性,也可以用set方法:
o.set(alpha=0.5, zorder=2)
可以使用?matplotlib.artist.getp(o,"alpha")
?来获取属性,如果指定属性名,则返回对象的该属性值;如果不指定属性名,则返回对象的所有的属性和值。
import matplotlib
# Figure rectangle的属性
matplotlib.artist.getp(fig.patch)
我们还需要知道如何获取该对象。
Artist
包含两种对象:基本要素-primitives
?和?容器-containers
。primitives
是基本要素,它包含一些我们要在绘图区作图用到的标准图形对象,如曲线Line2D,文本text,矩形Rectangle,图像image等。container
是容器,即用来装基本要素的地方,包括图形figure、坐标系Axes和坐标轴Axis。
在matplotlib中曲线的绘制,主要是通过类?matplotlib.lines.Line2D
?来完成的。
它的基类:?matplotlib.artist.Artist
matplotlib中线-line
的含义:它表示可以是连接所有顶点的实线样式,也可以是每个顶点的标记。
它的构造函数:
class 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)
常用的的参数有:
有三种方法可以用设置线的属性:?
1)?直接在plot()函数中设置
2)?通过获得线对象,对线对象进行设置
x = range(0,5)
y = [2,5,7,8,10]
line ,= plt.plot(x, y, '-') # '-'表示线段的样式为实线
# 逗号在这段代码中的作用是将plt.plot(x, y, '-')的返回值赋给变量line。
# plt.plot()函数返回一个包含线条对象的列表,这里只有一个线条对象,所以使用逗号将返回值解包并赋值给line。
line.set_antialiased(False) # 关闭抗锯齿功能,使得线段的边缘更加平滑。
?
3)?获得线属性,使用setp()函数设置
x = range(0,5)
y = [2,5,7,8,10]
lines = plt.plot(x, y)
plt.setp(lines, color='r', linewidth=10)
?
绘制直线line?常用的方法有两种
import matplotlib.pyplot as plt
x = range(0,5)
y = [2,5,7,8,10]
plt.plot(x,y)
?[<matplotlib.lines.Line2D at 0x2c3bcd7de20>]
?
import matplotlib.pyplot as plt
fig, axs = plt.subplots(2, 2) # 创建一个2x2的子图矩阵
axs[0, 0].plot([0, 1], [0, 1]) # 在第一个子图中绘制一条线
plt.show()
?
? ?2.Line2D对象绘制
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
fig = plt.figure()
ax = fig.add_subplot(111)
# 在图形对象上添加一个子图,并将其赋值给变量ax。add_subplot()函数接受一个参数,表示子图的位置。# # 在这里,参数111表示将子图放置在图形对象的中心位置。
line = Line2D(x, y)
ax.add_line(line)
ax.set_xlim(min(x), max(x))
ax.set_ylim(min(y), max(y))
plt.show()
pyplot.figure().add_subplot
是 Matplotlib 库中的一个方法,用于在图形中添加子图。这个方法通常与 pyplot.figure()
一起使用,以创建一个新的图形对象并添加子图。
此外还可以绘制误差折线图等各种图形。
collections类是用来绘制一组对象的集合,collections有许多不同的子类,RegularPolyCollection, CircleCollection, 分别对应不同的集合子类型。其中比较常用的就是散点图,它是属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个:
scatter绘制散点图
x = [0,2,4,6,8,10]
y = [10]*len(x)
s = [20*2**n for n in range(len(x))]
plt.scatter(x,y,s=s)
plt.show()
容器会包含一些primitives
,并且容器还有它自身的属性。
比如Axes Artist
,它是一种容器,它包含了很多primitives
,比如Line2D
,Text
;
matplotlib.figure.Figure
是Artist
最顶层的container
-对象容器,它包含了图表中的所有元素。一张图表的背景就是在Figure.patch
的一个矩形Rectangle
。
当我们向图表添加Figure.add_subplot()
或者Figure.add_axes()
元素时,这些都会被添加到Figure.axes
列表中。
fig = plt.figure()
ax1 = fig.add_subplot(211) # 作一幅2*1的图,选择第1个子图
ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.3]) # 位置参数,四个数分别代表了(left,bottom,width,height)
print(ax1)
print(fig.axes) # fig.axes 中包含了subplot和axes两个实例, 刚刚添加的
fig = plt.figure()
ax1 = fig.add_subplot(211)
for ax in fig.axes:
ax.grid(True)
# 创建网格图
Figure容器的常见属性:Figure.patch
属性:Figure的背景矩形Figure.axes
属性:一个Axes实例的列表(包括Subplot)Figure.images
属性:一个FigureImages patch列表Figure.lines
属性:一个Line2D实例的列表(很少使用)Figure.legends
属性:一个Figure Legend实例列表(不同于Axes.legends)Figure.texts
属性:一个Figure Text实例列表
matplotlib.axes.Axes
是matplotlib的核心。大量的用于绘图的Artist
存放在它内部,并且它有许多辅助方法来创建和添加Artist
给它自己,而且它也有许多赋值方法来访问和修改这些Artist
。
和Figure
容器类似,Axes
包含了一个patch属性,对于笛卡尔坐标系而言,它是一个Rectangle
;对于极坐标而言,它是一个Circle
。这个patch属性决定了绘图区域的形状、背景和边框。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
fig = plt.figure()
ax = fig.add_subplot(111)
rect = ax.patch # axes的patch是一个Rectangle实例
rect.set_facecolor('green')
Axes容器的常见属性有:artists
: Artist实例列表?patch
: Axes所在的矩形实例?collections
: Collection实例?images
: Axes图像?legends
: Legend 实例?lines
: Line2D 实例?patches
: Patch 实例?texts
: Text 实例?xaxis
: matplotlib.axis.XAxis 实例?yaxis
: matplotlib.axis.YAxis 实例。