Matplotlib 是 Python 中最受欢迎的数据可视化软件包之一,支持跨平台运行,它是 Python 常用的 2D 绘图库,同时它也提供了一部分 3D 绘图接口。
Matplotlib 生成的图形主要由以下几个部分构成:
- Figure:指整个图形,您可以把它理解成一张画布,它包括了所有的元素,比如标题、轴线等;
- Axes:绘制 2D 图像的实际区域,也称为轴域区,或者绘图区;
- Axis:指坐标系中的垂直轴与水平轴,包含轴的长度大小(图中轴长为 7)、轴标签(指 x 轴,y轴)和刻度标签;
- Artist:您在画布上看到的所有元素都属于 Artist 对象,比如文本对象(title、xlabel、ylabel)、Line2D 对象(用于绘制2D图像)等。
1. 安装和导入
使用pip管理器来安装matplotlib库
pip install matplotlib
验证安装:
%pip show matplotlib
Name: matplotlib
Version: 3.7.2
Summary: Python plotting package
Home-page: https://matplotlib.org
Author: John D. Hunter, Michael Droettboom
Author-email: [email protected]
License: PSF
Location: /Users/a200007/work/notebook/d2l-zh/lib/python3.10/site-packages
Requires: python-dateutil, fonttools, contourpy, kiwisolver, cycler, packaging, numpy, pyparsing, pillow
Required-by: d2l
Note: you may need to restart the kernel to use updated packages.
首先导入 matplotlib 包中的 pyplot 模块,并以 as 起个别名方便使用。
import matplotlib.pyplot as plt
import numpy as np
设置中文字体来处理中文乱码:
plt.rcParams['font.sans-serif'] = ['Songti SC'] # 使用 字体
plt.rcParams['axes.unicode_minus'] = False
Mac下可用的中文字体参考:Mac下中文乱码处理方法
pyplot 模块提供了可以用来绘图的各种函数,包括绘制2D图形、3D图形、直方图、条形图、散点图等,绘图类型如下表所示。
函数名称 | 描述 |
---|---|
Plot | 在坐标轴上画线或者标记 |
Scatter | 绘制x与y的散点图 |
Hist | 绘制直方图 |
Bar | 绘制条形图 |
Barh | 绘制水平条形图 |
Pie | 绘制饼状图 |
Boxplot | 绘制箱型图 |
his2d | 绘制2D直方图 |
Polar | 绘制极坐标图 |
Stackplot | 绘制堆叠图 |
Stem | 用来绘制二维离散数据绘制(又称为“火柴图”) |
Step | 绘制阶梯图 |
Quiver | 绘制一个二维按箭头(注意:这里可能是Quiver的拼写错误,通常可能是Quiverplot或Quiver,代表箭头图或向量场图) |
本文将针对常使用的函数进行介绍,并给出示例。
2. 绘制线条
使用 NumPy 提供的函数 arange() 来生成(0,2π)之间的浮点数序列作为自变量x。
正弦函数是一个周期分布,2* π \pi π正好是一个周期。
x = np.arange(0, np.pi * 2, 0.05)
x
array([0. , 0.05, 0.1 , 0.15, 0.2 , 0.25, 0.3 , 0.35, 0.4 , 0.45, 0.5 ,
0.55, 0.6 , 0.65, 0.7 , 0.75, 0.8 , 0.85, 0.9 , 0.95, 1. , 1.05,
1.1 , 1.15, 1.2 , 1.25, 1.3 , 1.35, 1.4 , 1.45, 1.5 , 1.55, 1.6 ,
1.65, 1.7 , 1.75, 1.8 , 1.85, 1.9 , 1.95, 2. , 2.05, 2.1 , 2.15,
2.2 , 2.25, 2.3 , 2.35, 2.4 , 2.45, 2.5 , 2.55, 2.6 , 2.65, 2.7 ,
2.75, 2.8 , 2.85, 2.9 , 2.95, 3. , 3.05, 3.1 , 3.15, 3.2 , 3.25,
3.3 , 3.35, 3.4 , 3.45, 3.5 , 3.55, 3.6 , 3.65, 3.7 , 3.75, 3.8 ,
3.85, 3.9 , 3.95, 4. , 4.05, 4.1 , 4.15, 4.2 , 4.25, 4.3 , 4.35,
4.4 , 4.45, 4.5 , 4.55, 4.6 , 4.65, 4.7 , 4.75, 4.8 , 4.85, 4.9 ,
4.95, 5. , 5.05, 5.1 , 5.15, 5.2 , 5.25, 5.3 , 5.35, 5.4 , 5.45,
5.5 , 5.55, 5.6 , 5.65, 5.7 , 5.75, 5.8 , 5.85, 5.9 , 5.95, 6. ,
6.05, 6.1 , 6.15, 6.2 , 6.25])
然后使用 sin() 函数计算每个点的 y 值
y = np.sin(x)
y
array([ 0. , 0.04997917, 0.09983342, 0.14943813, 0.19866933,
0.24740396, 0.29552021, 0.34289781, 0.38941834, 0.43496553,
0.47942554, 0.52268723, 0.56464247, 0.60518641, 0.64421769,
0.68163876, 0.71735609, 0.75128041, 0.78332691, 0.8134155 ,
0.84147098, 0.86742323, 0.89120736, 0.91276394, 0.93203909,
0.94898462, 0.96355819, 0.97572336, 0.98544973, 0.99271299,
0.99749499, 0.99978376, 0.9995736 , 0.99686503, 0.99166481,
0.98398595, 0.97384763, 0.9612752 , 0.94630009, 0.92895972,
0.90929743, 0.88736237, 0.86320937, 0.83689879, 0.8084964 ,
0.7780732 , 0.74570521, 0.71147335, 0.67546318, 0.6377647 ,
0.59847214, 0.55768372, 0.51550137, 0.47203054, 0.42737988,
0.38166099, 0.33498815, 0.28747801, 0.23924933, 0.19042265,
0.14112001, 0.09146464, 0.04158066, -0.00840725, -0.05837414,
-0.10819513, -0.15774569, -0.20690197, -0.2555411 , -0.30354151,
-0.35078323, -0.39714817, -0.44252044, -0.48678665, -0.52983614,
-0.57156132, -0.61185789, -0.65062514, -0.68776616, -0.72318812,
-0.7568025 , -0.78852525, -0.81827711, -0.8459837 , -0.87157577,
-0.89498936, -0.91616594, -0.93505258, -0.95160207, -0.96577306,
-0.97753012, -0.98684386, -0.993691 , -0.99805444, -0.99992326,
-0.99929279, -0.99616461, -0.99054654, -0.98245261, -0.97190307,
-0.95892427, -0.94354867, -0.92581468, -0.90576664, -0.88345466,
-0.85893449, -0.83226744, -0.80352016, -0.77276449, -0.74007731,
-0.70554033, -0.66923986, -0.63126664, -0.59171558, -0.55068554,
-0.50827908, -0.46460218, -0.41976402, -0.37387666, -0.32705481,
-0.2794155 , -0.23107779, -0.1821625 , -0.13279191, -0.0830894 ,
-0.03317922])
plot方法可以绘制多个点组成的线条,包括直线、曲线、折线等。下面使用plot方法来绘制正弦曲线。
plt.plot(x, y)
plt.xlabel("角度")
plt.ylabel("正弦")
plt.title("正弦曲线")
plt.show()
3. 使用figure
使用matplotlib.figure模块可以创建图形对象,图形对象借鉴的是面向对象编程的思想,通过图形对象来调用其它的方法和属性。
-
figure(): 创建图形对象(figure object),并通过图形对象来调用其它的方法和属性,这样能处理多个画布。
参数 说明 figsize 指定画布的大小,(宽度,高度),单位为英寸。 dpi 指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。 facecolor 背景颜色。 edgecolor 边框颜色。 frameon 是否显示边框。 -
add_axes(): 添加坐标轴(绘图区域)对象到画布中,一个figure可以添加多个axes,一个axes就是一个绘图区域。
对象的位置由参数rect决定, 形如 [left, bottom, width, height] ,它表示添加到画布中的矩形区域的左下角坐标(x, y),以及宽度和高度。
比如 [ 0.1, 0.1, 0.8, 0.8],它代表着从画布 10% 的位置开始绘制, 宽高是画布的 80%。
fig = plt.figure()
x = np.arange(0, np.pi * 2, 0.05)
main_ax = fig.add_axes([0, 0, 1, 1])
sub_ax = fig.add_axes([0.55, 0.65, 0.3, 0.3])
main_ax.plot(x, np.sin(x), "b-")
sub_ax.plot(x, np.cos(x), "r--")
main_ax.set_title("sin")
sub_ax.set_title("cos")
fig.show()
axes对象有如下属性/函数可以使用:
函数名称 | 描述 |
---|---|
Text | 向轴添加文本 |
Title | 设置当前轴的标题 |
Xlabel | 设置x轴标签 |
Xlim | 获取或者设置x轴区间大小 |
Xscale | 设置x轴缩放比例 |
Xticks | 获取或设置x轴刻标和相应标签 |
Ylabel | 设置y轴的标签 |
Ylim | 获取或设置y轴的区间大小 |
Yscale | 设置y轴的缩放比例 |
Yticks | 获取或设置y轴的刻标和相应标签 |
grid | 开启网格 |
xticklabels | 获取或设置坐标刻度标签 |
ax.plot(x, y, kwargs): 将x和y两个数组组成的坐标点绘制成线,一个plot是一个线条,可以多个线条叠加。kwargs常用参数有:
- linewidth: 线宽,单位为像素
- linestyle: 线形,如实线、虚线等,线型代码见下表
字符 描述 ‘-’ 实线 ‘–’ 虚线 ‘-.’ 点划线 ‘:’ 虚线(注意:Markdown中’:'通常不表示虚线) ‘H’ 六角标记(注意:Markdown中’H’通常不表示图形标记) - marker: 坐标点形状,如圆点、方形等,标记符号代码见下表
标记符号 描述 ‘.’ 点标记 ‘o’ 圆圈标记 ‘x’ 'X’标记 ‘D’ 钻石标记 ‘H’ 六角标记 ‘s’ 正方形标记 ‘+’ 加号标记 - markersize: 点的像素大小,例如:10
- color: 颜色,如red、blue等,颜色代码见下表
字符 颜色 ‘b’ 蓝色 ‘g’ 绿色 ‘r’ 红色 ‘c’ 青色 ‘m’ 品红色 ‘y’ 黄色 ‘k’ 黑色 ‘w’ 白色
4. legend绘制标签
ax.legend(labels, loc)
- labels 是一个字符串序列,用来指定标签的名称,一般每个plot都应该有一个标签名称。
- loc 是指定图例位置的参数,其参数值可以用字符串或整数来表示;
loc 参数的表示方法,分为字符串和整数两种,如下所示:
位置 | 字符串表示 | 整数数字表示 |
---|---|---|
自适应 | Best | 0 |
右上方 | upper right | 1 |
左上方 | upper left | 2 |
左下 | lower left | 3 |
右下 | lower right | 4 |
右侧 | right | 5 |
居中靠左 | center left | 6 |
居中靠右 |