matplotlib教程
第一章 初识matplotlib
1.1 matplotlib概述
matplotlib是由约翰
⋅
\cdot
⋅亨特等人仿照MATLAB写的一种用于绘制2D、3D图表的工具。该工具不仅提供丰富的图表绘制函数,而且可以对图表样式和元素进行定制。目前,matplotlib支持numpy和pandas数据结构。为了方便操作,matplotlib官方提供3种API::pyplotAPI, object-oriented API、pylab API。
1. pyplot API
pyplot API使用pyplot模块开发接口,该接口底层封装了一系列与MATLAB命令同名的函数,使得MATLAB用户可以快速绘制图表。当使用pyplotAPI绘图时,需要先使用“import matplotlib.pyplot as plt”语句导入pyplot模块,并使用该模块调用绘制函数可在当前的画布和绘图区域中绘制图表。
2. object-oriented API
object-oriented API是面向对象的接口,该接口包含了一系列对应图表元素的类,只有创建这些类的对象并按照隶属关系组合到一起才能完成绘制。当使用object-oriented API绘图时,首先创建画布(Figure类对象),再在该画布上添加拥有坐标系统的绘图区域(Axes类对象),最后在该绘图区域中调用绘图方法绘制图表。
3. pylab API
pylab API是使用pylab模块开发的接口,最初是为了模仿MATLAB工作方式而设计的,包括pyplot、numpy模块及一些其他附加功能。matplot官方不建议使用pylab API进行开发,并在最新版中弃用了pylab API。
1.2 matplotlib绘制图形的层次结构
matplotlib绘制图表和画素描类似,假设我们想画一幅素描,首先需要在画架上放置一个画板,然后在画板上固定一张素描纸,最后在素描纸上进行创作。同理,matlablib绘制的图形并非只有一一层结构,它也是由多层结构组成,以便对每层结构进行单独设置。
matplotlib绘制的图形主要由三层结构组成:容器层、图像层和辅助显示层。
1. 容器层
容器层主要由Canvas对象、Figure对象和Axes对象组成,其中Canvas对象充当画板的角色,位于底层;Figure对象充当素描纸的角色,即画布,它可以包含多个图表,位于Canvas对象上方,也就是用户操作的第一层;Axes对象充当画布中绘图区域的角色,它拥有独立的坐标系,可以将其看作一个图表,位于Figure对象的上方,也就是用户操作应用层的第二层。它们之间的关系如下图所示。
图1-1 Canvas对象、Figure对象和Axes对象之间的关系
2. 图像层
图像层是指在绘图区域内绘制的图形。
3. 辅助显示层
辅助显示层是指在绘图区域内除绘制图形以外的元素,包括坐标轴、标题、注释文本等。
实例 1-1:
步骤一:创建画布
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.linspace(0, 10, 100)
y = x ** 2
fig = plt.figure() # 创建画布
步骤二:创建带坐标系的绘图区域
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.linspace(0, 10, 100)
y = x ** 2
fig = plt.figure() # 创建画布
ax = fig.add_subplot(111) # 创建坐标系绘图区域
plt.show()

步骤三:绘制曲线
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.linspace(0, 10, 100)
y = x ** 2
fig = plt.figure() # 创建画布
ax = fig.add_subplot(111) # 创建坐标系绘图区域
ax.plot(x, y) # 绘制曲线
plt.show()

第二章 常见的绘图函数
2.1 折线图
折线图是将数据标注成点,并通过直线将这些点按顺序连接而成的图表,主要用于反映事物延某个维度的变化趋势,例如数据增减趋势、速率和峰值等特征。plot()函数的语法格式如下:
plot(x, y, fmt, scalex=True, scaley=True, data=None, label=None, *args, *kwargs)
# x表示x轴的数据。
# y表示y轴的数据。
# fmt表示快速设置线条样式的格式字符串。
# label表示应用于图例的标签文本。
实例 2-1 见实例1-1。
2.2 散点图
散点图又称X-Y图,是由若干个数据点组成的图表,主要用于判断两变量之间的相关性。若所有数据点在一条直线附近波动,说明变量之间是线性相关的;若所有数据点在曲线附近波动,说明变量之间是非线性相关的;若所有数据点没有显示任何关系,说明变量之间是不相关的。scatter()函数的语法格式如下:
scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None)
# x表示x轴的数据。
# y表示y轴的数据。
# s表示数据点大小。
# c表示数据点颜色。
# marker表示数据点的样式,默认为圆点。
# cmap表示数据点的颜色映射表,仅当参数c为浮点数组时才能够使用。
# norm表示数据点的亮度,可以取值为0~1。
# vmin表示亮度的最小值。
# vmax表示亮度的最大值。
# alpha表示透明度。
# linewidths表示数据点边缘的宽度。
# edgecolors表示数据点边缘的颜色。
实例 2-2
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.linspace(0, 10, 30)
y = x ** 2
area = np.linspace(0, 10, 30) * 5
fig = plt.figure() # 创建画布
ax = fig.add_subplot(111) # 创建坐标系绘图区域
ax.scatter(x, y, s=area, c='tomato') # 绘制散点图
plt.show()

2.3 箱形图
箱形图又称盒须图、箱线图,是一种利用数据中的5个统计量(最大值、上四分位数、中位数、下四分位数和最小值)来描述的图表,主要用于识别异常值、判断偏态与尾重、比较数据形状,箱形图的结构及异常值如下图所示。
图1-5 箱形图结构与异常值
boxplot()函数的语法格式如下:
boxplot(x, notch=None, sym=None, vert=None, whis=None, position=None, widths=None, patch_artist=None, usermedians=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, capprops=None, whiskerprops=None, manage_ticks=True, autorange=False, zorder=None, *, data=None)
# x表示绘制箱形图的数据。
# sym表示异常值对应的符号,默认值为空心圆圈。
# vert表示是否将箱形图垂直摆放,默认为垂直摆放。
# whis表示箱形图上下与四分位的距离,默认为1.5倍四分位差。
# positions表示箱体的位置。
# widths表示箱体的宽度,默认为0.5。
# patch_artist表示是否填充箱体的颜色,默认不填充。
# meanline表示是否横跨箱体的线条标出中位数,默认不使用。
# showbox表示是否显示箱形图的箱体,默认显示。
# showcaps表示是否显示箱体顶部和底部的横线,默认显示。
# showfliers表示是否显示异常值,默认显示。
# labels表示箱形图的标签。
实例 2-3
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randn(100)
fig = plt.figure() # 创建画布
ax = fig.add_subplot(111) # 创建坐标系绘图区域
ax.boxplot(x) # 绘制箱线图
plt.show()

2.4 三维图表
mplot3d是matplotlib中专门绘制3D图表的工具包,它主要包含一个继承自Axes的子类Axes3D,使用Axes3D类可以构建一个三维坐标系的绘图区域。
在调用add_subplot()方法添加绘图区域时,为该方法传入projection=“3d”,即指定坐标系的类型为三维坐标系,返回一个Axes3D类对象。add_subplot()函数的语法格式如下:
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
2.4.1 常见的三维图表
常见的三维图表包括三维线框图、三维柱形图、三维散点图等。关于这些方法的说明如下表所示。
方法 | 说明 |
plot() | 绘制3D线图 |
plot_wireframe() | 绘制3D线框图 |
plot_surface() | 绘制3D曲面图 |
bar3d() | 绘制3D柱形图 |
scatter3D() | 绘制3D散点图 |
plot_trisurf() | 绘制三面图 |
contour3D() | 绘制3D等高线图 |
contourf3D() | 绘制3D填充等高线图 |
1. 三维线框图
plot_wireframe(X, Y, Z, *args, **kwargs)
# X, Y, Z表示x, y, z轴的数据
# rcount, ccount表示每个坐标轴方向使用的最大样本量,默认50
# rstride, cstride表示采样密度,仅使用参数rstride或cstride中任意一个,则另外一个默认为0
实例 2-5
import numpy as np
import matplotlib.pyplot as plt
# 构造数据
x1 = np.arange(-5, 5, 0.25)
y1 = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(x1, y1)
Z = np.sin(np.sqrt(X**2 + Y**2))
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
ax.plot_wireframe(X, Y, Z, rstride=3, cstride=2) # 绘制三维线框图
plt.show()

第三章 图表辅助元素定制
3.1 图表常用的辅助元素
常用的辅助元素包括坐标轴、标题、图例、网格、参考线、参考区域、注释文本和表格。为了便于理解,下面以折线图介绍图表常用辅助元素,如图3-1所示。
图3-1 图表常用辅助元素
由图3-1显示,常用的辅助元素说明如下:
- 坐标轴分为单坐标轴和双坐标轴,单坐标轴按不同的方向可分为水平坐标轴( x x x 轴)和垂直坐标轴( y y y 轴);
- 标题用于说明图表主题;
- 图例用于指出图表中图形的标识形式;
- 网格是贯穿整个绘图区域的若干线条,用于作为估算图形所示值;
- 参考线是坐标轴上特殊值的一条直线;
- 参考区域是坐标轴上一块特殊范围的区域;
- 注释文本是对图形中一些特殊点的注释和说明;
- 表格是用于强调比较难理解数据的表格。
3.2 坐标轴
3.2.1 初识坐标轴
坐标轴由轴脊、刻度标签、刻度线(主刻度线和次刻度线)和坐标轴标签组成,具体描述如图3-2所示。
图3-2 图表常用辅助元素
3.2.2 坐标轴设置
1. 设置x、y轴标签
set_xlabel()和set_ylabel()函数的语法格式如下:
set_xlabel(xlabel, fontdict=None, labelpad=None, **kwargs) # x轴标签
set_ylabel(ylabel, fontdict=None, labelpad=None, **kwargs) # y轴标签
# xlabel表示x轴标签文本;
# ylabel表示y轴标签文本;
# fontdict表示控制标签文本样式的字典;
# labelpad表示标签与坐标轴边框(包括刻度和刻度标签)的距离。
2. 设置刻度范围
set_xlim()和set_ylim()函数的语法格式如下:
set_xlim(left=None, right=None, emit=True, auto=False, *, xmin=None, xmax=None) # x轴刻度范围
set_ylim(bottom=None, top=None, emit=True, auto=False, *, ymin=None, ymax=None) # y轴刻度范围
# left表示x轴刻度取值区间的左位数;
# right表示一周刻度取值区间的右位数;
# emit表示是否通知限制变化的观察者,默认True;
# auto表示是否允许自动缩放x轴,默认为True;
# xmin表示x轴刻度的最小值;
# xmax表示x轴刻度的最大值。
3. 设置刻度线位置和标签
set_xticks()和set_yticks()函数的语法格式如下:
set_xticks(ticks=None, labels=None, **kwargs) # x轴刻度线位置和刻度线标签
set_yticks(ticks=None, labels=None, **kwargs) # y轴刻度线位置和刻度线标签
# tick表示刻度显示的位置列表;
# labels表示指定位置刻度标签列表。
3.3 标题与图例
3.3.1 标题
图表的标题代表图表的名称,一般位于图表的顶部并居中,主要给读者展示图表要说明的内容。set_title()函数的语法格式如下:
set_title(label, fontdict=None, loc="center", pad=None, **kwargs)
# label表示标题文本;
# fontdict表示控制标题文本样式的字典;
# loc表示标题对齐的方式,例如,"left", "right", "center"三种取值,默认"center";
# pad表示标题与图表顶部的距离,默认None。
3.3.2 图例
图例是列举各组图形数据标识的方框图,它由图例标识和图例项组成,其中图例标识表示各组图形的图案,图例项表示图例标识对应的名称。legend()函数的语法格式如下:
legend(handles, labels, loc, bbox_to_anchor, ncol, title, shadow, fancybox, *args, **kwargs)
# handles表示由图例标识列表;
# labels表示由图例项列表;
# loc用于控制图例在表中的位置,具体见表3-1;
# bbox_to_anchor用于控制图例的布局,该参数接收一个包含两个数值的元组,其中第一个数值用于控制图例显示水平位置,数值越大图例显示位置越偏右,另一个用于控制图例垂直位置,数值越大显示位置越偏上;
# ncol表示图例的列数,默认1;
# title表示图例的标题,默认None;
# shadow表示图例后面是否显示阴影,默认None;
# fancybox表示图例是否设置倒角,默认None。
位置编码 | 位置字符串 | 说明 |
0 | "best" | 自适应 |
1 | "upper right" | 右上方 |
2 | "upper left" | 左上方 |
3 | "lower left" | 左下方 |
4 | "lower right" | 右下方 |
5 | "right" | 右方 |
6 | "center left" | 中心偏左 |
7 | "center right" | 中心偏右 |
8 | "lower center" | 中心偏下 |
9 | "upper center" | 中心偏上 |
10 | "center" | 中心 |
3.4 网格线
网格是从刻度线开始延申,贯穿整个绘图区域的辅助线条,它能够帮助用户轻松查看图形数值。网格可划分为水平网格和垂直网格,这两种网格既可以单独使用,也可以同时使用。grid()函数的语法格式如下:
grid(b=None, which="major", axis="both", color="#b0b0b0", alpha=None, linestyle="-", linewidth=0.5, **kwargs)
# b表示是否显示网格,默认True;
# which表示显示网格类型,支持major(主要刻度网格线)、minor(次要刻度网格线)和both(同时显示主要、次要刻度网格线)这3种类型,默认major;
# axis表示显示那个方向的网格,该参数支持both、x和y这3种类型,默认both;
# color表示网格线的颜色,默认#b0b0b0;
# alpha表示网格线的透明度, 默认None;
# linestyle表示网格线类型,例如, "-", "--", ":";
# linewidth表示网格线宽度, 默认0.5;
注意:坐标轴没有刻度,就无法显示网格。
3.5 参考线与参考区域
3.5.1 参考线
参考线是一条贯穿整个绘图区域的线条,为图形数据的比较提供参考。根据参考线的方向可分为水平参考线和垂直参考线。axhline()、axvline()函数的语法格式如下:
axhline(y=0, xmin=0, xmax=1, color="k", linewidth="1.0", linestyle='solid', alpha="1.0", label=None, **kwargs)
axvline(x=0, ymin=0, ymax=1, color="k", linewidth="1.0", linestyle='solid', alpha="1.0", label=None, **kwargs)
# y表示水平参考线的纵坐标;
# x表示垂直参考线的横坐标;
# xmin表示图形的左边界,默认0;
# xmax表示图形的右边界,默认1;
# ymin表示图形的下边界,默认0;
# ymax表示图形的上边界,默认1;
# color表示参考线的颜色,默认k;
# linewidth表示参考线的宽度,默认1.0;
# linestyle表示参考线的线型,例如,"solid"(实线)、"dashed"(虚线)、"dashdot"(点划线)、"dotted"(点线);
# alpha表示参考线透明度,范围0(完全透明)~1(完全不透明);
# label表示参考线标签,用于图例显示,默认None。
3.5.2 参考区域
axhspan()、axvspan()函数的语法格式如下:
axhspan(ymin, ymax, xmin=0, xmax=1, color="blue", alpha=0.5, linewidth=None, linestyle=None, label=None, **kwargs)
# ymin表示水平参考区域起始y坐标;
# ymax表示水平参考区域终止y坐标;
# xmin表示水平参考区域的左边界;
# xmax表示水平参考区域的右边界;
axvspan(xmin, xmax, ymin=0, ymax=1, color="blue", alpha=0.5, linewidth=None, linestyle=None, label=None, **kwargs)
# xmin表示垂直参考区域起始x坐标;
# xmax表示垂直参考区域终止x坐标;
# ymin表示垂直参考区域的下边界;
# ymax表示垂直参考区域的上边界;
# color表示参考区域的颜色,默认"blue";
# alpha表示参考区域的透明度,范围0(完全透明)~1(完全不透明),默认0.5;
# linewidth表示参考区域边界线宽度,默认None;
# linestyle表示参考区域边界线线型,默认None;
# label表示参考区域标签,用于图例显示。
3.6 注释文本
注释文本可划分为指向型注释文本和无指向型注释文本,其中指向型注释文本一般对图表某一部分进行说明;无指向型注释文本一般是对图表整体进行特定说明。
3.6.1 指向型注释文本
指向型注释文本是指通过箭头的方式对图形的某一部分进行文本说明。annotate()函数的语法格式如下:
annotate(s, xy, xytext, arrowprops=None, *args, **kwargs)
# s表示注释文本内容;
# xy表示被注释点的坐标位置, (x, y);
# xytext表示文本注释的起始位置,默认与xy相同;
# textcoords表示文本注释的坐标系:
'offset points':相对于 xy 或 xytext 的偏移量(以点为单位);
'offset pixels':相对于 xy 或 xytext 的偏移量(以像素为单位);
'figure points':相对于图形的左下角(以点为单位);
'figure pixels':相对于图形的左下角(以像素为单位);
'axes points':相对于坐标轴的左下角(以点为单位);
'axes pixels':相对于坐标轴的左下角(以像素为单位)。
# arrowprops表示箭头的属性,包括箭头的类型、颜色和宽度等,默认None;
# ha表示文本的水平对齐方式,center(居中对齐)、left(左对齐)和right(右对齐);
# va表示文本的垂直对齐方式,center(居中对齐)、left(左对齐)和right(右对齐);
# fontsize表示文本字体大小,默认None;
# fontweight表示文本字体粗细,normal(正常)、bold(加粗)。
1. arrowprops参数
arrowprops用于指定注释箭头属性,一下是arrowprops常用的属性:
(1) arrowstyle指定箭头的样式,常用样式包括:
图3-3 键arrowstyle对应的键值以及类型
(2) connectionstyle指定箭头的连接方式。常用的连接方式包括:
箭头样式字符串 | 说明 |
arc | 弧形连接 |
angle | 角度连接 |
angle3 | 三角角度连接 |
arc3 | 三角弧形连接 |
bar | 条形连接 |
barangle | 条形角度连接 |
(3) arrowpad表示箭头与文本之间的距离,默认0.4;
(4) shrink表示箭头两端与注释框边界的距离,默认0.05;
(5) mutation_scale表示箭头大小的比例因子,默认1.0。
3.6.2 无指向型注释文本
无指向型注释文本是指使用文字的注释方式对绘图区域的图形进行说明。text()函数的语法格式如下:
text(x, y, s, fontdict=None, withdash=<deprecated parameter>, **kwargs)
# x表示x的坐标位置;
# y表示y的坐标位置;
# s表示显示的文本内容;
# fontdict表示控制字体的字典。
注意:matplotlib中自带mathtext引擎,通过该引擎可以自动识别annotate()或text()函数传入的数学字符串,并解析成对应的数学表达式。基本格式如下:
r"$数学表达式$"
第四章 图表样式美化
4.1 颜色搭配
在数据可视化中,颜色通常被用于数据分类。图表使用颜色时应遵循一定的基本规则,既要避免使用过多的颜色,又要避免随意使用颜色,否则会严重影响可视化效果。matplotlib内置了基础颜色和颜色映射表。下面将对颜色使用方式进行说明。
4.1.1 基础颜色
matplotlib的基础颜色主要有3种表示方式:单词和单词缩写模式,十六进制或HTM模式、RGB模式,具体介绍如下。
1. 单词或单词缩写模式
matplotlib支持使用单词或单词缩写表示8种颜色:青色、洋红色、黄色、黑色、红色、绿色、蓝色和白色。每种颜色单词、单词缩写以及说明如表4-1所示。
单词 | 单词缩写 | 说明 |
c | cyan | 青色 |
m | magenta | 洋红色 |
y | yellow | 黄色 |
k | black | 黑色 |
r | red | 红色 |
g | green | 绿色 |
b | blue | 蓝色 |
w | white | 白色 |
2. 其他模式
由于不经常使用十六进制或HTML模式,RGB模式搭配颜色,因此这小节省略。
4.1.2 颜色映射表
在matplotlib中内置了许多预定义的颜色映射表,可使用colormaps()函数查看所有可用的颜色映射表,代码如下:
print(plt.colormaps())
# 打印结果
['magma', 'inferno', 'plasma', 'viridis', 'cividis', 'twilight', 'twilight_shifted', 'turbo', 'Blues', 'BrBG', 'BuGn', 'BuPu', 'CMRmap', 'GnBu', 'Greens', 'Greys', 'OrRd', 'Oranges', 'PRGn', 'PiYG', 'PuBu', 'PuBuGn', 'PuOr', 'PuRd', 'Purples', 'RdBu', 'RdGy', 'RdPu', 'RdYlBu', 'RdYlGn', 'Reds', 'Spectral', 'Wistia', 'YlGn', 'YlGnBu', 'YlOrBr', 'YlOrRd', 'afmhot', 'autumn', 'binary', 'bone', 'brg', 'bwr', 'cool', 'coolwarm', 'copper', 'cubehelix', 'flag', 'gist_earth', 'gist_gray', 'gist_heat', 'gist_ncar', 'gist_rainbow', 'gist_stern', 'gist_yarg', 'gnuplot', 'gnuplot2', 'gray', 'hot', 'hsv', 'jet', 'nipy_spectral', 'ocean', 'pink', 'prism', 'rainbow', 'seismic', 'spring', 'summer', 'terrain', 'winter', 'Accent', 'Dark2', 'Paired', 'Pastel1', 'Pastel2', 'Set1', 'Set2', 'Set3', 'tab10', 'tab20', 'tab20b', 'tab20c', 'magma_r', 'inferno_r', 'plasma_r', 'viridis_r', 'cividis_r', 'twilight_r', 'twilight_shifted_r', 'turbo_r', 'Blues_r', 'BrBG_r', 'BuGn_r', 'BuPu_r', 'CMRmap_r', 'GnBu_r', 'Greens_r', 'Greys_r', 'OrRd_r', 'Oranges_r', 'PRGn_r', 'PiYG_r', 'PuBu_r', 'PuBuGn_r', 'PuOr_r', 'PuRd_r', 'Purples_r', 'RdBu_r', 'RdGy_r', 'RdPu_r', 'RdYlBu_r', 'RdYlGn_r', 'Reds_r', 'Spectral_r', 'Wistia_r', 'YlGn_r', 'YlGnBu_r', 'YlOrBr_r', 'YlOrRd_r', 'afmhot_r', 'autumn_r', 'binary_r', 'bone_r', 'brg_r', 'bwr_r', 'cool_r', 'coolwarm_r', 'copper_r', 'cubehelix_r', 'flag_r', 'gist_earth_r', 'gist_gray_r', 'gist_heat_r', 'gist_ncar_r', 'gist_rainbow_r', 'gist_stern_r', 'gist_yarg_r', 'gnuplot_r', 'gnuplot2_r', 'gray_r', 'hot_r', 'hsv_r', 'jet_r', 'nipy_spectral_r', 'ocean_r', 'pink_r', 'prism_r', 'rainbow_r', 'seismic_r', 'spring_r', 'summer_r', 'terrain_r', 'winter_r', 'Accent_r', 'Dark2_r', 'Paired_r', 'Pastel1_r', 'Pastel2_r', 'Set1_r', 'Set2_r', 'Set3_r', 'tab10_r', 'tab20_r', 'tab20b_r', 'tab20c_r']
常用的颜色映射表有autumn、bone、cool、copper、flag、gray、hot、hsv、jet、pink、prism、sprint、summer和winter。
matplotlib主要有两种使用颜色映射表的方式:第一种方式是调用函数或方法绘制图表或者添加辅助元素时,使用matplotlib.cm.jet颜色,获取颜色;第二种方式是直接调用set_cmap()函数进行设置。这两种方式的具体用法如下。
(1)第一种示例代码如下:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
# 准备数据
x = np.linspace(0, 10, 30)
y = x ** 2
y1 = x ** 3
# 为每条曲线生成不同的颜色生成值
cmap = matplotlib.cm.jet
fig = plt.figure() # 创建画布
ax = fig.add_subplot(111) # 创建坐标系绘图区域
ax.plot(x, y, color=cmap(0.2), label=r"y=$x^2$") # 绘制曲线
ax.plot(x, y1, color=cmap(0.3), label=r"y=$x^3$")
ax.legend() # 图例
ax.set_xlim(0, 11)
ax.set_ylim(0, 1100)
plt.show()
(2) 由于第二种示例代码不常用,因此省略介绍。
4.2 数据标记
在matplotlib中,折线图的线条是由数据标记及其之间的连线组成,并且默认隐藏数据标记。数据标记一般指单个数据的圆点或其他符号等,用于强调数据点的位置,常见于折线图与散点图中。
4.2.1 折线图与散点图的数据标记
matplotlib中内置了许多数据标记,使用这些数据标记可以便捷为折线图与散点图标注数据点。数据标记分为填充型标记和非填充型标记,这两种标记取值、样式和说明分别如图4-1和图4-2所示。
图4-1 填充型标记
图4-2 非填充型标记
使用plot()、scatter()函数绘制图形时,可以将标记的取值传递给marker参数,从而为折线图或散点图添加数据标记。代码如下:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
# 准备数据
x = np.linspace(0, 10, 30)
y = x ** 2
y1 = x ** 3
# 为每条曲线生成不同的颜色生成值
cmap = matplotlib.cm.jet
fig = plt.figure() # 创建画布
ax = fig.add_subplot(111) # 创建坐标系绘图区域
ax.plot(x, y, color=cmap(0.2), marker="d", label=r"y=$x^2$") # 绘制曲线
ax.plot(x, y1, color=cmap(0.3), marker=">", label=r"y=$x^3$")
ax.legend() # 生成图例
ax.set_xlim(0, 11)
ax.set_ylim(0, 1100)
plt.show()
除此之外,还可以通过以下参数控制标记属性:
- markeredgecolor或mec表示标记的边框颜色;
- markeredgewidth或mew表示标记的边框宽度;
- markerfacecolor或mfc表示标记的填充颜色;
- markersize或ms表示标记的大小。
4.3 自定义区域子图
4.3.1 单子图
subplot2grid()函数可以将整个画布规划成非等分布局区域,并可在选中的某个区域绘制单个子图,subplot2grid()函数语法格式如下:
subplot2grid(shape, loc, rowspan=1, colspan=1, fig=None, **kwargs)
# shape表示规划区域结构,它是包含两个整型数据的元组,其中第一个元素表示规划区域的行数,第二个元素表示规划区域的列数
# loc表示选择区域的位置,它是包含两个整型数据的元组,其中第一个元素表示子图所在的行,第二个元素表示子图所在的列数,均从0开始计算
# rowspan表示向下跨行数,默认1
# colspan表示向右跨列数,默认1
# fig表示放置子图的画布,默认当前画布
实例 4-1
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
# 准备数据
x = np.linspace(0, 10, 30)
y = x ** 2
y1 = x ** 3
# 为每条曲线生成不同的颜色生成值
cmap = matplotlib.cm.jet
fig = plt.figure() # 创建画布
ax1 = plt.subplot2grid((2, 3), (0, 2))
ax1.plot(x, y, color=cmap(0.2), marker="d", label=r"y=$x^2$") # 绘制曲线
ax2 = plt.subplot2grid((2, 3), (1, 0), colspan=3)
ax2.plot(x, y1, color=cmap(0.3), marker=">", label=r"y=$x^3$")
ax2.set_xlim(0, 11)
ax2.set_ylim(0, 1100)
plt.show()
结果展示:
图4-3 实例 5结果