# 一、一些常用图形
matplotlib
可支持的绘图类型可以参考官方文档:https://matplotlib.org/stable/plot_types/index.html
# 1.1 plot - 绘制折线图(曲线图)
使用 plt.plot()
函数可以绘制折线图, plot()
函数的原型为 plt.plot(x, y, format_string, **kwargs)
,其中,仓用参数的解释如下:
- x:x 轴数据,列表或数组,可选
- y:y 轴数据,列表或数组
- format_string:控制曲线的格式字符串,可选,由颜色字符、风格字符和标记字符组成(等同于 color、marker 和 linestyle 的结合)。
使用案例如下:
import matplotlib.pyplot as plt | |
import numpy as np | |
# evenly sampled time at 200ms intervals | |
t = np.arange(0., 5., 0.2) | |
# red dashes, blue squares and green triangles | |
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^') | |
plt.show() |
绘制的图形如下图所示:
# 1.2 scatter - 绘制散点图
使用 plt.scatter()
函数可以绘制散点图, 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, hold=None, data=None, **kwargs)
,其中,一些常用参数的解释如下:
- x, y # 散点的坐标,float or array-like, shape (n,)
- s # 散点的面积,float or array-like, shape (n,), optional
- c # 散点的颜色(默认值为蓝色,‘b’,其余颜色可参考 2.1)
- marker # 散点样式(默认值为实心圆,‘o’,其余样式可参考 2.1)
- alpha # 散点透明度([0, 1] 之间的数,0 表示完全透明,1 则表示完全不透明)
- linewidths # 散点的边缘线宽
- edgecolors # 散点的边缘颜色
使用案例如下:
import matplotlib.pyplot as plt | |
import numpy as np | |
n = 20 # 生成 20 个点 | |
x = np.random.rand(n) | |
y = np.random.rand(n) | |
plt.scatter(x, y, s=100, c='r', marker='*', alpha=0.3) | |
plt.show() |
绘制的图形如下所示:
# 二、一些常用操作
# 2.1 更改曲线样式
在绘制曲线图以及散点图时,可以通过设置线条形状 linestyle
、线条宽度 linewidth
以及线条颜色 color
来改变图形的样式。
# 线条颜色 color
在 matplotlib
中有如下五种颜色的设置方式(还有其他如 cmap
等进阶方法暂时没有用到,故没有整理):
(1) RGB、RGBA
在 matplotlib
中可以使用三元组 RGB
,即红、蓝、绿的分量,其中每个分量在 [0, 1]
区间内,因此 (1, 0, 0)
表示纯红色。四元组 RGBA
的前三个元素和三元组的定义相同,第四个元素定义透明度,也在 [0, 1]
区间内。使用案例如下:
import matplotlib.pyplot as plt | |
# 颜色用 [0,1] 之间的浮点数表示,四个分量按顺序分别为 (red, green, blue, alpha),其中 alpha 透明度可省略 | |
plt.plot([1, 2, 3], [4, 5, 6], color=(0.1, 0.2, 0.5)) | |
plt.plot([4, 5, 6], [1, 2, 3], color=(0.1, 0.2, 0.5, 0.5)) | |
plt.show() |
(2) HEX RGB
或 HEX RGBA
matplotlib
可以将 HTML
颜色字符串解释为实际颜色。这些字符串被定义为 #RRGGBB
,其中 RR
、 GG
和 BB
分别是使用十六进制编码的红色、绿色和蓝色分量。使用案例如下:
import matplotlib.pyplot as plt | |
# 用十六进制颜色码表示,同样最后两位表示透明度,可省略 | |
plt.plot([1, 2, 3], [4, 5, 6], color='#0f0f0f') | |
plt.plot([4, 5, 6], [1, 2, 3], color='#0f0f0f80') | |
plt.show() |
(3)灰度字符串
matplotlib
将浮点值的字符串表示形式解释为灰度,例如 0.75
表示中浅灰色。使用案例如下:
import matplotlib.pyplot as plt | |
# 当只有一个位于 [0,1] 的值时,表示灰度色阶 | |
plt.plot([1, 2, 3], [4, 5, 6], color='0.1') | |
plt.show() |
(4)单字符基本颜色
matplotlib
有八个基本颜色,可以用单字符串来表示,分别是 ‘b’, ‘g’, ‘r’, ‘c’, ‘m’, ‘y’, ‘k’, ‘w’
,对应的是 blue, green, red, cyan, magenta, yellow, black, and white
的英文缩写,如下图所示:
(5)颜色名称
matplotlib
提供了颜色对照表,可供查询颜色对应的名称,如下图所示:
# 线条样式
(1)折线形状
- ‘-’ :实线
- ‘-.’:实虚线
- ‘–’ :虚线
- ‘:’ :点虚线
(2)节点形状 - ‘s’ : 方块状
- ‘o’ : 实心圆
- ‘^’ : 正三角形
- ‘v’ : 反正三角形
- ‘+’ : 加号
- ‘*’ : 星号
- ‘,’ :点
- ‘x’ : x 号
- ‘p’ : 五角星
- ‘1’ : 三脚架标记
- ‘2’ : 三脚架标记
# 2.2 图形显示的一些设置
设置图像的横纵坐标轴名称、图像标题、设置图例以及横纵坐标范围的示例程序(支持 latex
)如下所示:
import matplotlib.pyplot as plt | |
import numpy as np | |
X = np.linspace(0, 1, 100) | |
Y1 = np.sqrt(X) | |
Y2 = X | |
Y3 = X * X | |
Y4 = X * X * X | |
plt.plot(X, Y1, color="lightcoral", linewidth=3.0, linestyle="-", label=r"$y_1=\sqrt{x}$") | |
plt.plot(X, Y2, color="burlywood", linewidth=3.0, linestyle="--", label=r"$y_2=x$") | |
plt.plot(X, Y3, color="mediumturquoise", linewidth=3.0, linestyle="-.", label=r"$y_3=x^2$") | |
plt.plot(X, Y4, color="mediumpurple", linewidth=3.0, linestyle=":", label=r"$y_4=x^3$") | |
# 常见的 legend 的 loc 位置还有 best, upper right, upper left, lower left, lower right, | |
# right, center left, center right, lower center, upper center, center, | |
# 其中 best 表示将标签加载到 python 认为最佳的位置。 | |
plt.legend(loc="best") | |
# x、y 坐标以及标题 | |
plt.xlabel('x', fontsize=18) | |
plt.ylabel('y', fontsize=18) | |
plt.title(r'$f(x)=\sqrt{x},x,x^2,x^3$', fontsize=18) | |
# 设置坐标范围 | |
plt.ylim(-1, 3) | |
plt.xlim(-1, 3) | |
plt.show() |
# 2.3 子图
Matplotlib
的可以把很多张图画到一个显示界面,在作对比分析的时候非常有用。对应的有 plt
的 subplot
、 subplots
和 figure
的 add_subplol
的方法,参数可以是一个三位数字(例如 111
),也可以是一个数组(例如 [1,1,1]
), 3
个数字分别代表:子图总行数、子图总列数、子图位置。
# 通过 plt 的 subplot
import numpy as np | |
import matplotlib.pyplot as plt | |
# 画第 1 个图:折线图 | |
plt.subplot(221) | |
x = np.arange(1, 100) | |
plt.plot(x, x * x) | |
# 画第 2 个图:散点图 | |
plt.subplot(222) | |
plt.scatter(np.arange(0, 10), np.random.rand(10)) | |
# 画第 3 个图:饼图 | |
plt.subplot(223) | |
plt.pie(x=[15, 30, 45, 10], labels=list('ABCD'), autopct='%.0f', explode=[0, 0.05, 0, 0]) | |
# 画第 4 个图:条形图 | |
plt.subplot(224) | |
plt.bar([20, 10, 30, 25, 15], [25, 15, 35, 30, 20], color='b') | |
plt.show() |
# 通过 plt 的 subplots
subplots
返回的值的类型为元组,其中包含两个元素:第一个为一个画布,第二个是子图
import numpy as np | |
import matplotlib.pyplot as plt | |
fig,subs=plt.subplots(2,2) | |
# 画第 1 个图:折线图 | |
x=np.arange(1,100) | |
subs[0][0].plot(x,x*x) | |
# 画第 2 个图:散点图 | |
subs[0][1].scatter(np.arange(0,10), np.random.rand(10)) | |
# 画第 3 个图:饼图 | |
subs[1][0].pie(x=[15,30,45,10],labels=list('ABCD'),autopct='%.0f',explode=[0,0.05,0,0]) | |
# 画第 4 个图:条形图 | |
subs[1][1].bar([20,10,30,25,15],[25,15,35,30,20],color='b') | |
plt.show() |
# 通过 figure 的 add_subplot
import numpy as np | |
import matplotlib.pyplot as plt | |
fig = plt.figure() | |
# 画第 1 个图:折线图 | |
ax1 = fig.add_subplot(221) | |
x = np.arange(1, 100) | |
ax1.plot(x, x * x) | |
# 画第 2 个图:散点图 | |
ax2 = fig.add_subplot(222) | |
ax2.scatter(np.arange(0, 10), np.random.rand(10)) | |
# 画第 3 个图:饼图 | |
ax3 = fig.add_subplot(223) | |
ax3.pie(x=[15, 30, 45, 10], labels=list('ABCD'), autopct='%.0f', explode=[0, 0.05, 0, 0]) | |
# 画第 4 个图:条形图 | |
ax4 = fig.add_subplot(224) | |
ax4.bar([20, 10, 30, 25, 15], [25, 15, 35, 30, 20], color='b') | |
plt.show() |
以上三种方式生成的图形均如下所示:
# 如何不规则划分
import numpy as np | |
import matplotlib.pyplot as plt | |
# 画第 1 个图:折线图 | |
plt.subplot(221) | |
x = np.arange(1, 100) | |
plt.plot(x, x * x) | |
# 画第 2 个图:散点图 | |
plt.subplot(222) | |
plt.scatter(np.arange(0, 10), np.random.rand(10)) | |
# 画第 3 个图:条形图 | |
# 前面的两个图占了 221 和 222 的位置,如果想在下面只放一个图,得把前两个当成一列,即 2 行 1 列第 2 个位置 | |
plt.subplot(212) | |
plt.bar([20, 10, 30, 25, 15], [25, 15, 35, 30, 20], color='b') | |
plt.show() |
运行效果如下所示:
# 三、其他操作
# 3.1 绘图风格
Matplotlib
库提供的 style.use()
函数可以为创建的图形设置合适的美学风格。官方文档中给出的可使用样式戳此,如下的示例中使用了 classic
风格的样式:
import numpy as np | |
import matplotlib.pyplot as plt | |
plt.style.use('classic') | |
# 画第 1 个图:折线图 | |
plt.subplot(221) | |
x = np.arange(1, 100) | |
plt.plot(x, x * x) | |
# 画第 2 个图:散点图 | |
plt.subplot(222) | |
plt.scatter(np.arange(0, 10), np.random.rand(10)) | |
# 画第 3 个图:条形图 | |
# 前面的两个图占了 221 和 222 的位置,如果想在下面只放一个图,得把前两个当成一列,即 2 行 1 列第 2 个位置 | |
plt.subplot(212) | |
plt.bar([20, 10, 30, 25, 15], [25, 15, 35, 30, 20], color='b') | |
plt.show() |
运行效果如下图所示: