Python 数据分析三剑客之 Matplotlib(八):等高线/等值线图的绘制


文章目录


Matplotlib 系列文章:


专栏:


推荐学习资料与网站:


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

【1x00】等高线概念

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

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

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

01

02

【2x00】理解 numpy.meshgrid()

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

import numpy as np

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

输出结果:

[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 在绘图期间重新计算文本的旋转角度,如果轴的角度发生变化,则可以使用此功能

分割线


这里是一段物理防爬虫文本,请读者忽略。
本文原创首发于 CSDN,作者 ITBOB。
博客首页: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

03

分割线

【7x00】简单示例

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()

04

分割线

【8x00】添加标记

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

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()

05

分割线

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

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

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()

06

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

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()

07

分割线

【10x00】颜色填充

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

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()

08


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