量化百科

Matplotlib教程及主要功能用法大全

由ypyu创建,最终由small_q 被浏览 51 用户

matplotlib 是一个 Python 编程语言和其数值数学扩展包 NumPy 的绘图库。它提供了各种绘图工具,使得开发者可以绘制各种静态、动态、交互式的可视化图表。

为什么要用matplotlib?

  1. 灵活性:matplotlib 提供了广泛的图表类型和样式选项,使得用户可以根据需要定制图表的每一个细节。无论是简单的线图、柱状图,还是复杂的等高线图、3D图,matplotlib 都能轻松应对。
  2. 易用性:尽管 matplotlib 功能强大,但它的 API 设计相对直观,容易上手。而且,它与 Python 和 NumPy 完美集成,使得数据处理和图表绘制可以无缝衔接。
  3. 交互性:matplotlib 支持多种交互式图表,使得用户可以更直观地探索和解释数据。虽然它的默认模式是静态图表,但也可以与各种 GUI 工具包(如 Tkinter、wxPython、Qt 等)结合使用,创建交互式应用程序。
  4. 兼容性:matplotlib 可以在各种操作系统上运行,包括 Windows、macOS 和 Linux。此外,它生成的图表可以保存为多种格式,如 PNG、PDF、SVG 等,方便用户在不同场合使用。
  5. 社区支持:matplotlib 是一个开源项目,拥有庞大的用户群体和活跃的开发者社区。这意味着用户可以轻松获取帮助,同时也可以参与到项目的开发和改进中。
  6. 与其他库的集成:matplotlib 可以与许多其他 Python 数据科学库无缝集成,如 Pandas、SciPy、Seaborn 等。这使得用户可以在一个统一的环境中完成数据处理、分析和可视化的全部工作。

matplotlib安装教程

MacOS

打开 Terminal 窗口, 输入以下内容

# python 3+ 请复制以下在 terminal 中执行
$ pip3 install matplotlib

# python 2+ 请复制以下在 terminal 中执行
$ pip install matplotlib

Windows

 matplotlib-1.5.3-cp35-cp35m-win32.whl (md5)
    1.5.3 : plt版本
    cp35  : python 版本
    win32 : Windows 32位系统
    whl   : wheel 文件 
  • 用 CMD 找到这个 .whl 文件目录, 然后 pip 安装. 以 matplotlib-1.4.3-cp35-none-win32.whl文件为例:

    $ cd python_work # 用 cd 去到你下载的文件目录

    如果是 python 3+ 版本, 像下面一样

    python_work$ python -m pip3 install matplotlib-1.4.3-cp35-none-win32.whl

如何使用matplotlib包

以下教程将会详细演示matplotlib常用功能用法示例

导入包

import matplotlib.pyplot as plt
import numpy as np

画一个正弦

x = np.linspace(0, 2 * np.pi, 50)
plt.plot(x, np.sin(x)) 
plt.show() 
#范围0-2*np.pi,50个元素

画二个数据集

x = np.linspace(0, 2 * np.pi, 50)
plt.plot(x, np.sin(x),
        x, np.sin(2 * x))
plt.show()

画自定义图形

当在同一个图形上展示多个数据集时,通过改变线条的外观来区分不同的数据集变得非常必要。

x = np.linspace(0, 2 * np.pi, 50)
plt.plot(x, np.sin(x), 'r-o',
 x, np.cos(x), 'g--')
plt.show()

上述教程代码展示了两种不同的曲线样式:'r-o''g--'。字母 'r' 和 'g' 代表线条的颜色,后面的符号代表线和点标记的类型。

查询更多颜色请点击官方教程:

markers - Matplotlib 2.2.2 documentation​matplotlib.org

子图

在调用plot()函数之前需要先调用subplot()函数。该函数的第一个参数代表子图的总行数,第二个参数代表子图的总列数,第三个参数代表活跃区域。

x = np.linspace(0, 2 * np.pi, 50)
plt.subplot(2, 1, 1)
plt.plot(x, np.sin(x), 'r')
plt.subplot(2, 1, 2)
plt.plot(x, np.cos(x), 'g')
plt.show()

散点图

调用scatter()函数并传入两个分别代表 x 坐标和 y 坐标的数组。

x = np.linspace(0, 2 * np.pi, 50)
y = np.sin(x)
plt.scatter(x,y)
plt.show()

彩色散点图

同前面一样我们用到了scatter()函数,但是这次我们传入了另外的两个参数,分别为所绘点的大小和颜色。通过这种方式使得图上点的大小和颜色根据数据的大小产生变化。

x = np.random.rand(1000)
y = np.random.rand(1000)
size = np.random.rand(1000) * 50
colour = np.random.rand(1000)
plt.scatter(x, y, size, colour)
plt.colorbar()
plt.show()

直方图

hist()函数传入一个包含数据的数组。第二个参数代表数据容器的个数。数据容器代表不同的值的间隔,并用来包含我们的数据。数据容器越多,图形上的数据条就越多。

x = np.random.randn(1000)
plt.hist(x, 50)
plt.show()

柱状图

n = 12
X = np.arange(n)
Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 2.0, n)
Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 2.0, n)

plt.bar(X, +Y1)
plt.bar(X, -Y2)

plt.xlim(-.5, n)
plt.xticks(())
plt.ylim(-2, 2)
plt.yticks(())

plt.show()

等高线图

数据集即三维点 (x,y) 和对应的高度值,共有256个点。高度值使用一个 height functionf(x,y)生成。 x, y 分别是在区间 [-3,3] 中均匀分布的256个值,并用meshgrid在二维平面中将每一个x和每一个y分别对应起来,编织成栅格:

使用函数plt.contourf把颜色加进去,位置参数分别为:X, Y, f(X,Y)。透明度0.9,并将 f(X,Y) 的值对应到color map的暖色组中寻找对应颜色。

使用plt.contour函数划线。位置参数为:X, Y, f(X,Y)。颜色选黑色,线条宽度选0.7。现在的结果如下图所示,只有颜色和线条,还没有数值Label:

def f(x,y):
    return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 -y**2)

n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X,Y = np.meshgrid(x, y)

plt.contourf(X, Y, f(X, Y), 8, alpha=0.9, cmap=plt.cm.hot)

C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=0.7)
# 显示图形
plt.show()

3D数据

要先导入一个专用的包,然后要定义一个图像窗口,在窗口上添加3D坐标轴。

接下来给进 X 和 Y 值,并将 X 和 Y 编织成栅格。每一个(X, Y)点对应的高度值我们用下面这个函数来计算。

做出一个三维曲面,然后用colormap rainbow填充颜色。

from mpl_toolkits.mplot3d import Axes3D  # 导入3D坐标轴支持

# 创建一个图像窗口
fig = plt.figure()
# 在窗口上添加3D坐标轴
ax = fig.add_subplot(111, projection='3d')

# 生成X和Y的数据
X = np.arange(-4, 4, 0.1)
Y = np.arange(-4, 4, 0.1)
# 将X和Y编织成栅格
X, Y = np.meshgrid(X, Y)
# 计算每个点的半径
R = np.sqrt(X**2 + Y**2)
# 用函数计算Z值
Z = np.sin(R)

# 绘制三维曲面,并使用彩虹色填充
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')

# 显示图形
plt.show()

标题,标签和图例

plot()函数中添加命名参数'label'并赋予该参数相应的标签,然后调用legend()函数。

x = np.linspace(0, 2 * np.pi, 50)
plt.plot(x, np.sin(x), 'r-x', label='Sin(x)')
plt.plot(x, np.cos(x), 'g-^', label='Cos(x)')
plt.legend()
plt.xlabel('Rads') 
plt.ylabel('Amplitude') 
plt.title('Sin and Cos Waves') 
plt.show()

图中图

使用plt.figure创建一个图像窗口.

和之前matplotlib教程一样,使用plt.subplot来创建小图.plt.subplot(2,2,1)表示将整个图像窗口分为2行2列, 当前位置为1. 使用plt.plot([0,1],[0,1])在第1个位置创建一个小图.

plt.subplot(2,2,2)表示将整个图像窗口分为2行2列, 当前位置为2. 使用plt.plot([0,1],[0,2])在第2个位置创建一个小图.

plt.subplot(2,2,3)表示将整个图像窗口分为2行2列,当前位置为3.plt.subplot(2,2,3)可以简写成plt.subplot(223), matplotlib同样可以识别. 使用plt.plot([0,1],[0,3])在第3个位置创建一个小图.

plt.subplot(224)表示将整个图像窗口分为2行2列, 当前位置为4. 使用plt.plot([0,1],[0,4])在第4个位置创建一个小图.

plt.figure()

plt.subplot(2,2,1)
plt.plot([0,1],[0,1])

plt.subplot(2,2,2)
plt.plot([0,1],[0,2])

plt.subplot(223)
plt.plot([0,1],[0,3])

plt.subplot(224)
plt.plot([0,1],[0,4])

plt.show()  

多图混合

plt.figure(figsize=(8,8))
x=[1,2,3,4]
y=[2,3,4,5]
y1=[6,7,8,9]
plt.subplot(2,2,1)
plt.plot(x,y)
plt.subplot(2,2,2)
plt.bar(x,y1)
plt.subplot(2,1,2)
plt.pie(y1)

在此感谢莫烦老师的matplotlib教程视频带给我的知识!

总的来说,matplotlib 是一个功能强大、灵活易用、兼容性好的 Python 绘图库,适用于各种数据可视化需求。无论是在科学研究、工程分析还是商业报告中,matplotlib 都是一个值得信赖的工具。

标签

数据可视化Matplotlib