Matplotlib的详细使用及原理

认识matplotlib

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]) 

Figure的组成 

一个完整的matplotlib图像通常会包括以下四个层级,这些层级也被称为容器

  • Figure:顶层级,用来容纳所有绘图元素

  • Axes:容纳了大量元素用来构造一幅幅子图,一个figure可以由一个或多个子图组成

  • Axis:axes的下属层级,用于处理所有和坐标轴,网格有关的元素

  • Tick:axis的下属层级,用来处理所有和刻度有关的元素

将通过各种命令方法来操纵图像中的每一个部分,从而达到数据可视化的最终效果

两种绘图接口

matplotlib提供了两种最常用的绘图接口

  1. 显式创建figure和axes,在上面调用绘图方法

  2. 依赖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的三层API

matplotlib的基础逻辑是,用Artist对象在画布(canvas)上绘制(Render)图形。
就和人作画的步骤类似:

  1. 准备一块画布或画纸
  2. 准备好颜料、画笔等制图工具
  3. 作画

所以matplotlib有三个层次的API:

matplotlib.backend_bases.FigureCanvas 代表了绘图区,所有的图像都是在绘图区完成的
matplotlib.backend_bases.Renderer 代表渲染器,可以理解为画笔,控制如何在Canvas 上图。
matplotlib.artist.Artist 代表了具体的图表组件,即调用了Renderer的接口在Canvas上作图。
前两者处理程序和计算机的底层交互的事项,第三项Artist就是具体的调用接口来做出我们想要的图,比如图形、文本、线条的设定。

Artist的分类

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

matplotlib标准用法

matplotlib的标准使用流程为:

  1. 创建一个Figure实例
  2. 使用Figure实例创建一个或者多个AxesSubplot实例
  3. 使用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)

自定义你的Artist对象 

Artist属性

在图形中的每一个元素都对应着一个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)

 基本元素 - primitives

我们还需要知道如何获取该对象。

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)

常用的的参数有:

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

有三种方法可以用设置线的属性: 

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)

 

如何绘制lines

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

  • pyplot方法绘制
  • Line2D对象绘制
  1. pyplot方法绘制
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类是用来绘制一组对象的集合,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个:

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

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()

对象容器 - Object container

容器会包含一些primitives,并且容器还有它自身的属性。
比如Axes Artist,它是一种容器,它包含了很多primitives,比如Line2DText

Figure容器

matplotlib.figure.FigureArtist最顶层的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

Axes容器

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 实例。

相关推荐

  1. Python Pickle库原理使用详解

    2023-12-28 18:00:03       26 阅读
  2. nacos原理使用方法

    2023-12-28 18:00:03       24 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-28 18:00:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-28 18:00:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-28 18:00:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-28 18:00:03       18 阅读

热门阅读

  1. Cnas认证路上你关心的那些个问题

    2023-12-28 18:00:03       33 阅读
  2. 2024 Python开发者转型Go开发

    2023-12-28 18:00:03       29 阅读
  3. linux使用内核编译其中一个模块

    2023-12-28 18:00:03       33 阅读
  4. 国产银河麒麟服务器开放防火墙命令

    2023-12-28 18:00:03       32 阅读
  5. Android 电话拨打界面按back键不结束通话活动

    2023-12-28 18:00:03       30 阅读
  6. 少年chen-zhe (关于洛谷)

    2023-12-28 18:00:03       37 阅读
  7. 安卓逆向笔记之AndroidManifest.xml篇

    2023-12-28 18:00:03       35 阅读
  8. shell脚本调试技巧

    2023-12-28 18:00:03       36 阅读
  9. 群晖Nas Docker镜像自动部署

    2023-12-28 18:00:03       35 阅读
  10. django调用矩阵分解推荐算法模型做推荐系统

    2023-12-28 18:00:03       35 阅读