# Python 数据分析三剑客之 Matplotlib（八）：等高线/等值线图的绘制

TRHX

2020-04-30

Python 数据分析 / Matplotlib

字数统计:

3,671字

阅读时长≈

15分

Matplotlib 系列文章：

- Python 数据分析三剑客之 Matplotlib（一）：初识 Matplotlib 与其 matplotibrc 配置文件
- Python 数据分析三剑客之 Matplotlib（二）：文本描述 / 中文支持 / 画布 / 网格等基本图像属性
- Python 数据分析三剑客之 Matplotlib（三）：图例 / LaTeX / 刻度 / 子图 / 补丁等基本图像属性
- Python 数据分析三剑客之 Matplotlib（四）：线性图的绘制
- Python 数据分析三剑客之 Matplotlib（五）：散点图的绘制
- Python 数据分析三剑客之 Matplotlib（六）：直方图 / 柱状图 / 条形图的绘制
- Python 数据分析三剑客之 Matplotlib（七）：饼状图的绘制
- Python 数据分析三剑客之 Matplotlib（八）：等高线 / 等值线图的绘制
- Python 数据分析三剑客之 Matplotlib（九）：极区图 / 极坐标图 / 雷达图的绘制
- Python 数据分析三剑客之 Matplotlib（十）：3D 图的绘制
- Python 数据分析三剑客之 Matplotlib（十一）：最热门最常用的 50 个图表【译文】

专栏：

【NumPy 专栏】【Pandas 专栏】【Matplotlib 专栏】

推荐学习资料与网站：

【NumPy 中文网】【Pandas 中文网】【Matplotlib 中文网】【NumPy、Matplotlib、Pandas 速查表】

    1
    2
    3
    4
    5

    这里是一段防爬虫文本，请读者忽略。
    本文原创首发于 CSDN，作者 TRHX。
    博客首页：https://itrhx.blog.csdn.net/
    本文链接：https://itrhx.blog.csdn.net/article/details/106066852
    未经授权，禁止转载！恶意转载，后果自负！尊重原创，远离剽窃！

## 【1x00】等高线概念

参考百度百科，等高线概念总结如下：等高线指的是地形图上高程相等的相邻各点所连成的闭合曲线。把地面上海拔高度相同的点连成的闭合曲线，并垂直投影到一个水平面上，并按比例缩绘在图纸上，就得到等高线。等高线也可以看作是不同海拔高度的水平面与实际地面的交线，所以等高线是闭合曲线。在等高线上标注的数字为该等高线的海拔。

- 位于同一等高线上的地面点，海拔高度相同。但海拔高度相同的点不一定位于同一条等高线上；
- 在同一幅图内，除了陡崖以外，不同高程的等高线不能相交；
- 在图廓内相邻等高线的高差一般是相同的，因此地面坡度与等高线之间的等高线平距成反比，等高线平距愈小，等高线排列越密，说明地面坡度越大；等高线平距愈大，等高线排列越稀，则说明地面坡度愈小；
- 等高线是一条闭合的曲线，如果不能在同一幅内闭合，则必在相邻或者其他图幅内闭合。
- 等高线经过山脊或山谷时改变方向，因此，山脊线或者山谷线应垂直于等高线转折点处的切线，即等高线与山脊线或者山谷线正交。

在 Matplotlib 等高线的绘制中，需要传递三个基本参数：某个点的 x、y 轴坐标以及其高度。 <fancybox>
</fancybox> <fancybox>
</fancybox>

## 【2x00】理解 numpy.meshgrid()

`numpy.meshgrid()` 方法用于生成网格点坐标矩阵。

    1
    2
    3
    4
    5
    6

    import numpy as np

    a = np.array([1, 2, 3])
    b = np.array([7, 8, 9])
    res = np.meshgrid(a, b)
    print(res)

输出结果：

    1
    2
    3
    4
    5
    6

    [array([[1, 2, 3],
           [1, 2, 3],
           [1, 2, 3]]),
     array([[7, 7, 7],
           [8, 8, 8],
           [9, 9, 9]])]

给定两个数组，`a[1, 2, 3]` 和 `b[7, 8, 9]`，a 作为 x 轴数据，b 作为 y 轴数据，那么一共可以绘制出 9 个点： (1,7)、(1,8)、(1,9)、(2,7)、(2,8)、(2,9)、(3,7)、(3,8)、(3,9)，而 `numpy.meshgrid()` 方法就是起这样的作用，返回的两个二维数组，横坐标矩阵 a 中的每个元素，与纵坐标矩阵 b 中对应位置元素，共同构成一个点的完整坐标。

因为在 `matplotlib.pyplot.contour()` 等高线绘制函数中接收的是二维坐标信息，所以在绘制等高线图之前要将原数据经过 `numpy.meshgrid()` 方法处理，也可以自己构建类似于上述的二维数组。

## 【3x00】绘制方法 matplotlib.pyplot.contour()

`matplotlib.pyplot.contour()` 方法可用于绘制等高线图。

基本语法：`matplotlib.pyplot.contour(\*args, data=None, \*\*kwargs)`

通用格式：`matplotlib.pyplot.contour([X, Y,] Z, [levels], **kwargs)`

基本参数：

参数 | 描述
--- | ---
X, Y | 数组形式的点的 x 和 y 轴坐标，两者都必须是二维的，形状与 Z 相同
Z | 绘制轮廓的高度值，二维数组，每个元素是其对应点的高度
levels | 确定等高线的数目和位置，如果是整数 N，则使用 N 个数据间隔，即绘制 N+1 条等高线 如果是数组形式，则绘制指定的等高线。值必须按递增顺序排列

其他参数：

参数 | 描述
--- | ---
colors | 等高线的颜色，颜色字符串或颜色序列
cmap | 等高线的颜色，字符串或者 Colormap 通常包含一系列的渐变色或其他颜色组合，取值参见【6x00】Colormap 取值
alpha | 透明度，介于0（透明）和1（不透明）之间
origin | 通过指定 Z[0，0] 的位置来确定 Z 的方向和确切位置，仅当未指定 X, Y 时才有意义 `None`：Z[0，0] 位于左下角的 X=0, Y=0 处 `'lower'`：Z [0, 0] 位于左下角的 X = 0.5, Y = 0.5 处 `'upper'`：Z[0，0] 位于左上角的 X=N+0.5, Y=0.5 处 `'image'`：使用 `rcParams[“image.origin”] = 'upper'`的值
antialiased | 是否启用抗锯齿渲染，默认 True
linewidths | 等高线的线宽，如果是数字，则所有等高线都将使用此线宽 如果是序列，则将按指定的顺序以升序打印线宽 默认为 `rcParams[“lines.linewidth”] = 1.5`
linestyles | 等高线的样式，如果线条颜色为单色，则负等高线默认为虚线 `'-'` or `'solid'`, `'--'` or `'dashed'`, `'-.'` or `'dashdot'` `':'` or `'dotted'`, `'none'` or `' '` or `''`

## 【4x00】填充方法 matplotlib.pyplot.contourf()

`matplotlib.pyplot.contourf()` 方法与 `matplotlib.pyplot.contour()` 的区别在于：`contourf()` 会对等高线间的区域进行颜色填充（filled contours）。除此之外两者的函数签名和返回值都相同。

基本语法：`matplotlib.pyplot.contourf(\*args, data=None, \*\*kwargs)`

通用格式：`matplotlib.pyplot.contour([X, Y,] Z, [levels], **kwargs)`

基本参数：

参数 | 描述
--- | ---
X, Y | 数组形式的点的 x 和 y 轴坐标，两者都必须是二维的，形状与 Z 相同
Z | 绘制轮廓的高度值，二维数组，每个元素是其对应点的高度
levels | 确定等高线的数目和位置，如果是整数 N，则使用 N 个数据间隔，即绘制 N+1 条等高线 如果是数组形式，则绘制指定的等高线。值必须按递增顺序排列

其他参数：

参数 | 描述
--- | ---
colors | 等高线的填充颜色，颜色字符串或颜色序列
cmap | 等高线的填充颜色，字符串或者 Colormap 通常包含一系列的渐变色或其他颜色组合，取值参见【6x00】Colormap 取值
alpha | 透明度，介于0（透明）和1（不透明）之间
origin | 通过指定 Z[0，0] 的位置来确定 Z 的方向和确切位置，仅当未指定 X, Y 时才有意义 `None`：Z[0，0] 位于左下角的 X=0, Y=0 处 `'lower'`：Z [0, 0] 位于左下角的 X = 0.5, Y = 0.5 处 `'upper'`：Z[0，0] 位于左上角的 X=N+0.5, Y=0.5 处 `'image'`：使用 `rcParams[“image.origin”] = 'upper'`的值
antialiased | 是否启用抗锯齿渲染，默认 True
linewidths | 等高线的线宽，如果是数字，则所有等高线都将使用此线宽 如果是序列，则将按指定的顺序以升序打印线宽 默认为 `rcParams[“lines.linewidth”] = 1.5`
linestyles | 等高线的样式，如果线条颜色为单色，则负等高线默认为虚线 `'-'` or `'solid'`, `'--'` or `'dashed'`, `'-.'` or `'dashdot'` `':'` or `'dotted'`, `'none'` or `' '` or `''`

## 【5x00】标记方法 matplotlib.pyplot.clabel()

`matplotlib.pyplot.clabel(CS, \*args, \*\*kwargs)` 方法可用于标记等高线图。

参数 | 描述
--- | ---
CS | ContourSet（等高线集）对象，即 `pyplot.contour()` 返回的对象
levels | 需要标记的等高线集，数组类型，如果未指定则默认标记所有等高线
fontsize | 标记的字体大小，可选项： `'xx-small'`, `'x-small'`, `'small'`, `'medium'`, `'large'`, `'x-large'`, `'xx-large'`
colors | 标记的颜色，颜色字符串或颜色序列
inline | 是否在标签位置移除轮廓显示，bool 类型，默认 True
inline_spacing | 标签位置移除轮廓的宽度，float 类型，默认为 5
fmt | 标签的格式字符串。str 或 dict 类型，默认值为 `%1.3f`
rightside_up | 是否将标签旋转始终与水平面成正负90度，bool 类型，默认 True
use_clabeltext | 默认为 False，如果为 True，则使用 ClabelText 类（而不是 Text）创建标签 ClabelText 在绘图期间重新计算文本的旋转角度，如果轴的角度发生变化，则可以使用此功能

    1
    2
    3
    4
    5

    这里是一段防爬虫文本，请读者忽略。
    本文原创首发于 CSDN，作者 TRHX。
    博客首页：https://itrhx.blog.csdn.net/
    本文链接：https://itrhx.blog.csdn.net/article/details/106066852
    未经授权，禁止转载！恶意转载，后果自负！尊重原创，远离剽窃！

## 【6x00】Colormap 取值

`matplotlib.pyplot.contour()` 和 `matplotlib.pyplot.contourf()` 中 `cmap` 参数用于设置等高线的颜色，取值通常为 Colormap 中的值，通常包含一系列的渐变色或其他颜色组合。具体参加下图。

官方文档：https://matplotlib.org/tutorials/colors/colormaps.html

<fancybox>
</fancybox>

## 【7x00】简单示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x = np.arange(-2.0, 2.0, 0.01)
    y = np.arange(-2.0, 2.0, 0.01)
    m, n = np.meshgrid(x, y)        # 生成网格点坐标矩阵

    # 指定一个函数用于计算每个点的高度，也可以直接使用二维数组储存每个点的高度
    def f(a, b):
        return (1 - b ** 5 + a ** 5) * np.exp(-a ** 2 - b ** 2)

    # 绘制等高线图，8 个数据间隔，颜色为黑色
    plt.contour(m, n, f(m, n), 8, colors='k')
    plt.title('等高线图简单示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')

    plt.show()

<fancybox>
</fancybox>

## 【8x00】添加标记

`matplotlib.pyplot.clabel()` 方法用于给等高线添加标记。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x = np.arange(-2.0, 2.0, 0.01)
    y = np.arange(-2.0, 2.0, 0.01)
    m, n = np.meshgrid(x, y)        # 生成网格点坐标矩阵

    # 指定一个函数用于计算每个点的高度，也可以直接使用二维数组储存每个点的高度
    def f(a, b):
        return (1 - b ** 5 + a ** 5) * np.exp(-a ** 2 - b ** 2)

    # 绘制等高线图，8 个数据间隔，颜色为黑色
    C = plt.contour(m, n, f(m, n), 8, colors='k')
    # 添加标记，标记处不显示轮廓线，颜色为黑红绿蓝四种，保留两位小数
    plt.clabel(C, inline=True, colors=['k', 'r', 'g', 'b'], fmt='%1.2f')
    plt.title('等高线图添加标记示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')

    plt.show()

<fancybox>
</fancybox>

## 【9x00】轮廓线颜色和样式

`matplotlib.pyplot.contour()` 方法中，`colors` 参数即可为等高线轮廓设置颜色，可以是单色，也可以是一个颜色列表，`linestyles` 参数可以设置轮廓线样式，注意，如果线条颜色为单色，则负等高线（高度值为负）默认为虚线。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x = np.arange(-2.0, 2.0, 0.01)
    y = np.arange(-2.0, 2.0, 0.01)
    m, n = np.meshgrid(x, y)        # 生成网格点坐标矩阵

    # 指定一个函数用于计算每个点的高度，也可以直接使用二维数组储存每个点的高度
    def f(a, b):
        return (1 - b ** 5 + a ** 5) * np.exp(-a ** 2 - b ** 2)

    colors = ['k', 'r', 'g', 'b']
    # 绘制等高线图，8 个数据间隔，颜色为黑色，线条样式为 --
    C = plt.contour(m, n, f(m, n), 8, colors=colors, linestyles='--')
    # 添加标记，标记处不显示轮廓线，颜色为黑红绿蓝四种，保留两位小数
    plt.clabel(C, inline=True, colors=colors, fmt='%1.2f')
    plt.title('等高线图设置颜色/样式示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')

    plt.show()

<fancybox>
</fancybox>

如果想启用渐变色，则可以设置 `cmap`，取值参见【6x00】Colormap 取值，`colorbar()` 方法可以显示颜色对照条。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x = np.arange(-2.0, 2.0, 0.01)
    y = np.arange(-2.0, 2.0, 0.01)
    m, n = np.meshgrid(x, y)        # 生成网格点坐标矩阵

    # 指定一个函数用于计算每个点的高度，也可以直接使用二维数组储存每个点的高度
    def f(a, b):
        return (1 - b ** 5 + a ** 5) * np.exp(-a ** 2 - b ** 2)

    # 绘制等高线图，8 个数据间隔，颜色为 plasma
    C = plt.contour(m, n, f(m, n), 8, cmap='plasma')
    # 添加标记，标记处不显示轮廓线，颜色为黑色，保留两位小数
    plt.clabel(C, inline=True, colors='k', fmt='%1.2f')
    # 显示颜色条
    plt.colorbar()
    plt.title('等高线图设置渐变色示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')

    plt.show()

<fancybox>
</fancybox>

## 【10x00】颜色填充

`matplotlib.pyplot.contourf()` 方法用于对等高线之间的地方进行颜色填充。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x = np.arange(-2.0, 2.0, 0.01)
    y = np.arange(-2.0, 2.0, 0.01)
    m, n = np.meshgrid(x, y)        # 生成网格点坐标矩阵

    # 指定一个函数用于计算每个点的高度，也可以直接使用二维数组储存每个点的高度
    def f(a, b):
        return (1 - b ** 5 + a ** 5) * np.exp(-a ** 2 - b ** 2)

    # 绘制等高线图，8 个数据间隔，颜色为 plasma
    plt.contourf(m, n, f(m, n), 8, cmap='plasma')
    C = plt.contour(m, n, f(m, n), 8, cmap='plasma')
    # 添加标记，标记处不显示轮廓线，颜色为黑色，保留两位小数
    plt.clabel(C, inline=True, colors='k', fmt='%1.2f')
    # 显示颜色条
    plt.colorbar()
    plt.title('等高线图颜色填充示例')
    plt.xlabel('x axis label')
    plt.ylabel('y axis label')

    plt.show()

<fancybox>
</fancybox>

    1
    2
    3
    4
    5

    这里是一段防爬虫文本，请读者忽略。
    本文原创首发于 CSDN，作者 TRHX。
    博客首页：https://itrhx.blog.csdn.net/
    本文链接：https://itrhx.blog.csdn.net/article/details/106066852
    未经授权，禁止转载！恶意转载，后果自负！尊重原创，远离剽窃！

您的喜欢是作者写作最大的动力！❤️

- PayPal
- AliPay
- WeChatPay
- QQPay

Donate

最后更新于 2020年8月6日

Matplotlib

等高线图

等值线图

###### 上一页

#### Python 数据分析三剑客之 Matplotlib（九）：极区图/极坐标图/雷达图的绘制

###### Matplotlib 极区图 极坐标图 雷达图

###### 下一页

#### Python 数据分析三剑客之 Matplotlib（七）：饼状图的绘制

###### Matplotlib 饼状图

#### 评论

## ๑۩ﺴ TRHX ﺴ۩๑

本文目录
欢迎光临

Hexo QQ 交流群 Telegram 交流群

CSDN 内容合伙人

文章分类

- BLOG
  (4)
- CDN
  (1)
- Hexo
  (9)
- Java
  (1)
- Linux
  (2)
- Markdown
  (2)
- Python 数据分析
  (27)
- Matplotlib
  (11)
- NumPy
  (6)
- Pandas
  (10)
- Python3 学习笔记
  (41)
- 基础学习
  (9)
- 学习经验
  (4)
- 爬虫学习
  (18)
- 爬虫实战
  (10)
- VPS
  (1)
- WEB前端
  (2)
- 图床
  (1)

热门标签
12306 3D图 58同城 Ajax BLOG Beautiful Soup CDN Coding Pages DataFrame Deepin Elicpse GitHub Pages Github Github Pages GroupBy HTTPS Hexo ICP备案 IO操作 Index JDBC JS 预加载 LaTeX Markdown Material X Matplotlib MongoDB MySQL NumPy PEP8 Pandas PicGo Pygame Python Redis SEO SQL Server 2012 SSR Selenium Series Ubuntu User-Agent VMware VPS XPath if语句 input()函数 instant.page jsDelivr lxml matplotibrc pyspider requests spfk urllib while循环 主题个性化 代理 位运算 公安备案 函数 函数应用 分割 切片 列表 判断函数 前程无忧 变量 合并数据集 哔哩哔哩 图例 图床 图形验证码 垃圾 备份 子图 字典 字符串函数 安居客 层级索引 年终总结 广播 异常 技巧 拼接 排序 排序函数 操作列表 散点图 数学函数 数据分裂 数据可视化 数据合并 数据替换 数据类型 数据读写 数据重塑 数组 文件 文件储存 无界面浏览器 时间序列 映射 条件函数 条形图 极区图 极坐标图 柱状图 模块 正则表达式 滑动验证码 点触验证码 爬虫 猫眼电影 瓜子二手车 画布 直方图 矩阵 等值线图 等高线图 算术函数 算术运算 类 索引 线性代数 线性图 统计函数 统计描述 统计计算 继承 编辑器 缺失值 网格 肺炎疫情 虎扑论坛 补丁 豆瓣电影 迭代 雷达图 饼状图
最近在听