本文概述
Matplotlib是Python中的2D图形库。它支持各种平台, 并且功能强大, 可以轻松绘制各种专业图形。本文是有关它的入门教程。
1.运行环境
由于它是Python软件包, 因此你需要首先在计算机上安装Python环境。你可以自己在网络上搜索此内容。
有关如何安装Matplotlib的信息, 请参见此处:Matplotlib安装。
我建议通过pip安装, 方法如下:
sudo pip3 install matplotlib
可以在这里找到本文中的源代码和测试数据:matplotlib_tutorial
本文的代码示例中使用了另一个Python库:NumPy。我还编写了有关NumPy的基本教程, 请参见此处:NumPy教程:Python机器学习库。
该代码在以下环境中经过测试:
- 苹果OS X 10.13
- Python 3.6.3
- matplotlib 2.1.1
- numpy的1.13.3
2.简介
Matplotlib适用于各种环境, 包括:
- Python脚本
- IPython外壳
- Jupyter笔记本
- Web应用服务器
- 用户图形界面工具包
你可以借助Matplotlib轻松生成各种类型的图形, 例如直方图, 频谱图, 条形图, 散点图等。你还可以非常轻松地自定义图形。
3.入门代码示例
让我们看一下最简单的代码示例之一:
# test.py
import matplotlib.pyplot as plt
import numpy as np
data = np.arange(100, 201)
plt.plot(data)
plt.show()
该代码的主要逻辑只有三行, 但是它绘制出一个非常直观的线性图, 如下所示:
现在, 让我们解释示例代码的逻辑:
- 通过np.arange(100, 201)生成[100, 200]之间的整数数组, 其值是:[100, 101, 102, …, 200]
- 通过matplotlib.pyplot将其绘制出来。显然, 绘制的值与图中的纵坐标(y轴)相对应。 matplotlib本身会为我们设置图表的横坐标(x轴):[0, 100], 因为我们正好有100个值。
- 通过plt.show()显示图形。
代码很简单。如果已经安装了运行环境, 请将以上代码保存到文本文件(或通过Github获取源代码), 然后可以使用以下命令在自己的计算机上查看以上图形:
python3 test.py
注意1:在以下教程中, 我们将说明如何在图中自定义图像。例如:轴, 图形, 底纹, 线型等。
注2:如有必要, 将在下面的屏幕截图中删除图形外部的边框, 仅保留图形主体。
4.一次绘制多个图形
有时候, 我们可能想一次绘制多个图形, 例如, 当你需要比较两组数据或以另一种方式显示一组数据时。
你可以通过以下方式创建多个图形:
4.1多个数字
图形可以简单地理解为图形窗口。 matplotlib.pyplot将具有默认值, 我们还可以通过plt.figure()创建更多图形, 如以下代码所示:
# figure.py
import matplotlib.pyplot as plt
import numpy as np
data = np.arange(100, 201)
plt.plot(data)
data2 = np.arange(200, 301)
plt.figure()
plt.plot(data2)
plt.show()
它绘制了两个窗口, 每个窗口都是具有不同间隔的折线图, 如下所示:
注意:这两个窗口在初始状态下完全重合。
4.2多个子图
在某些情况下, 我们希望在同一窗口中显示多个图形。此时, 你可以使用多个子图。这是一个代码示例:
# subplot.py
import matplotlib.pyplot as plt
import numpy as np
data = np.arange(100, 201)
plt.subplot(2, 1, 1)
plt.plot(data)
data2 = np.arange(200, 301)
plt.subplot(2, 1, 2)
plt.plot(data2)
plt.show()
在上面的代码中, 子图函数的前两个参数指定了子图的数量。因此, 当前图形将以矩阵形式划分, 并且两个参数(它们是整数)分别指定矩阵的行数和列数。第三个参数引用矩阵中的索引。
因此, 以下代码引用2列和1列子图中的第一个子图。
plt.subplot(2, 1, 1)
以下代码引用了2行和1列子图中的第二个子图。
plt.subplot(2, 1, 2)
因此, 代码的结果如下所示:
子图函数的参数不仅支持上述形式, 而且还可以将三个整数(不超过10个)组合为一个整数。例如:2、1、1可以写为211, 2、1、2可以写为212。
因此, 以下代码的结果与上面的相同:
import matplotlib.pyplot as plt
import numpy as np
data = np.arange(100, 201)
plt.subplot(211)
plt.plot(data)
data2 = np.arange(200, 301)
plt.subplot(212)
plt.plot(data2)
plt.show()
有关子图功能的更多详细信息, 请参见此处:matplotlib.pyplot.subplot
5.常见的图形示例
Matplotlib可用于生成许多图形样式。来这里看看:Matplotlib Gallery。
作为入门教程, 让我们首先看一些最常用的图形。
5.1线性图
在前面的示例中, 线性图的水平轴上的点是自动生成的, 但是有机会需要设置它们。此外, 我们可能还想自定义线条。看下面的例子:
# plot.py
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [3, 6, 9], '-r')
plt.plot([1, 2, 3], [2, 4, 9], ':g')
plt.show()
我们将获得这样的图形:
从代码中, 我们可以知道:
- plot函数的第一个数组是水平轴的值, 第二个数组是垂直轴的值, 所以其中一个是直线, 另一个是折线;
- 最后一个参数由两个字符组成:线条的样式和颜色。前者是一条红线, 后者是一条绿色虚线。有关样式和颜色的描述, 请参见plot函数的API:matplotlib.pyplot.plot
5.2散点图
散点图函数用于绘制散点图。同样, 该函数还需要两组成对的数据来指定x和y轴的坐标。这是一个代码示例:
# scatter.py
import matplotlib.pyplot as plt
import numpy as np
N = 20
plt.scatter(np.random.rand(N) * 100, np.random.rand(N) * 100, c='r', s=100, alpha=0.5)
plt.scatter(np.random.rand(N) * 100, np.random.rand(N) * 100, c='g', s=200, alpha=0.5)
plt.scatter(np.random.rand(N) * 100, np.random.rand(N) * 100, c='b', s=300, alpha=0.5)
plt.show()
从代码中, 我们可以知道:
- 图形包含三组数据, 每组数据包含20个随机坐标。
- 参数c代表点的颜色, s代表点的大小, 而alpha代表透明度。
图形将绘制如下:
有关散点函数的更多详细信息, 请参见此处:matplotlib.pyplot.scatter
5.3饼图
饼图功能用于绘制饼图。饼图通常用于表示集合各部分的百分比。
# pie.py
import matplotlib.pyplot as plt
import numpy as np
labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
data = np.random.rand(7) * 100
plt.pie(data, labels=labels, autopct='%1.1f%%')
plt.axis('equal')
plt.legend()
plt.show()
从代码中, 我们可以知道:
- 数据是一组包含7个数据的随机值
- 图形中的标签由标签指定
- 值的精度格式由autopct指定
- plt.axis(’equal’)用于将轴尺寸设置为一致
- plt.legend()指示要绘制图例(请参见下图的右上角)
图形将如下所示:
有关Pie函数的更多详细信息, 请参见此处:matplotlib.pyplot.pie
5.4条形图
条形图功能用于绘制条形图。条形图通常用于比较一组数据, 例如一周七天, 每天的城市流量。
这是一个例子:
# bar.py
import matplotlib.pyplot as plt
import numpy as np
N = 7
x = np.arange(N)
data = np.random.randint(low=0, high=100, size=N)
colors = np.random.rand(N * 3).reshape(N, -1)
labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
plt.title("Weekday Data")
plt.bar(x, data, alpha=0.8, color=colors, tick_label=labels)
plt.show()
从代码中, 我们可以知道:
- 该图显示了一组具有7个随机值的结果, 每个值都是[0, 100]中的随机数
- 它们的颜色也是由随机数生成的。 np.random.rand(N * 3).reshape(N, -1)意味着它将首先生成21(N x 3)个随机数, 然后将它们组合成7行, 因此每行有3个数字, 分别对应颜色的三个组成部分。如果你不懂这行代码, 请查看Python机器学习库NumPy教程。
- 标题指定图形的标题, 标签指定标签, 而alpha指定透明度。
图形将如下所示:
有关bar功能的更多详细信息, 请参见此处:matplotlib.pyplot.bar
5.5直方图
hist功能用于绘制直方图。直方图看起来有点像条形图。但是它们的含义是不同的。直方图描述了数据在特定范围内出现的频率。也许它有点抽象, 所以让我们通过一个代码示例来理解它:
# hist.py
import matplotlib.pyplot as plt
import numpy as np
data = [np.random.randint(0, n, n) for n in [3000, 4000, 5000]]
labels = ['3K', '4K', '5K']
bins = [0, 100, 500, 1000, 2000, 3000, 4000, 5000]
plt.hist(data, bins=bins, label=labels)
plt.legend()
plt.show()
在上面的代码中, [[3000, 4000, 5000]中n的[np.random.randint(0, n, n)]生成一个包含三个数组的数组, 其中:
- 第一个数组包含3000个随机数, 这些随机数的范围是[0, 3000)
- 第二个数组包含4000个随机数, 这些随机数的范围是[0, 4000)
- 第三个数组包含5000个随机数, 这些随机数的范围是[0, 5000)
bins数组用于指定直方图的边界, 这意味着[0, 100)中将有一个数据点, [100, 500)中将有一个数据点, 依此类推。因此, 最终结果将显示总共7个数据点。并且在代码中还指定了标签和图例。
代码的输出如下所示:
从图中可以看到, 三组数据的数据均低于3000, 并且频率相似。但是, 蓝色条的数据均低于3000, 橙色条的数据均低于4000。这与我们的随机数组数据完全相同。
有关hist函数的更多详细信息, 请参见此处:matplotlib.pyplot.hist
六, 结论
现在我们知道了Matplotlib的用法以及如何绘制一些最基本的图形。
应该注意的是, 由于这是一个入门教程, 因此在本文中我们仅提供这些功能和图形的最基本用法。但实际上, 这些功能远不止于此。因此, 你可以转到本文中提供的这些函数的API URL, 以进行进一步的研究。
评论前必须登录!
注册