Python 画 等高线图
flyfish
通过三维图形与投影等高线相结合的方式,能够直观地看到三维函数的形状以及在平面上等值线的分布。
等高线是一种用来表示三维表面在二维平面上的方法。它们是通过在固定高度(或深度)处切割三维表面来创建的平面曲线。每条等高线代表一个常数值,通常被称为"标高"或"高度"。等高线图广泛用于地形图、气象图、工程制图等领域,以表示高度、压力、温度等数据的变化。
特点:
- 高度相等 :同一条等高线上的所有点具有相同的标高。
- 等高线间距 :相邻等高线之间的垂直距离(即"间距")表示高度变化的大小。等高线密集的区域表示斜度较陡,而等高线稀疏的区域表示斜度较缓。
- 闭合或开口 :等高线可能是闭合的环形,表示孤立的高峰或低谷;也可能是开口的,延伸到图的边缘。
等高线可以应用于表示山丘、山谷、平原等地形特征。显示气压、温度等气象数据的分布。表示压力、速度、浓度等物理量的分布。
cpp
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 定义函数 f(x, y) = x^2 + y^2
def f(x, y):
return x**2 + y**2
# 定义 x 和 y 的范围
x = np.linspace(-5, 5, 400)
y = np.linspace(-5, 5, 400)
# 创建网格数据
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
# 创建图形
fig = plt.figure(figsize=(14, 6))
# 添加三维子图
ax1 = fig.add_subplot(121, projection='3d')
ax1.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8)
ax1.contour(X, Y, Z, zdir='z', offset=0, levels=20, cmap='viridis')
# 设置三维图的标签
ax1.set_title('三维曲面图')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_zlabel('z')
# 添加等高线图子图
ax2 = fig.add_subplot(122)
contour = ax2.contour(X, Y, Z, levels=20, cmap='viridis')
ax2.clabel(contour, inline=True, fontsize=8)
# 设置等高线图的标签
ax2.set_title('等高线图')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.axhline(0, color='black', linewidth=0.5)
ax2.axvline(0, color='black', linewidth=0.5)
ax2.grid(color='gray', linestyle='--', linewidth=0.5)
# 显示图形
plt.tight_layout()
plt.show()
np.meshgrid
X, Y = np.meshgrid(x, y)
功能: 创建二维网格坐标矩阵。
np.meshgrid(x, y):
x 和 y 是一维数组,代表两个方向上的坐标范围。
np.meshgrid 函数生成两个二维数组 X 和 Y,用于表示坐标平面上所有点的 x 和 y 坐标。
X 中的每一行都是 x 的复制。
Y 中的每一列都是 y 的复制。
这样生成的 X 和 Y 可以用于计算每个点上的函数值,形成一个 z 值的网格
plt.figure
fig = plt.figure(figsize=(14, 6)) 是 Matplotlib 中用于创建图形对象的一行代码。
plt.figure() 是 Matplotlib 的 pyplot 模块中的一个函数,用于创建一个新的图形窗口或绘图区域。
figsize=(14, 6) 参数指定了图形窗口的大小,以英寸为单位。
参数说明
figsize: 一个包含两个元素的元组 (width, height),指定图形的宽度和高度。
width: 图形的宽度,这里是 14 英寸。
height: 图形的高度,这里是 6 英寸。
这个图形被分成两个子图(ax1 和 ax2),每个子图占据窗口的一半。
fig.add_subplot
ax1 = fig.add_subplot(121, projection='3d')
功能: 在现有的图形 fig 中添加一个新的子图,并将其设置为三维投影。
add_subplot(121, projection='3d'):
121: 表示子图的布局方式。
第一个数字 1 表示总共有 1 行子图。
第二个数字 2 表示总共有 2 列子图。
第三个数字 1 表示这个子图是第一个位置。
projection='3d': 指定这个子图为三维图形。这是通过 mpl_toolkits.mplot3d 模块实现的。
ax1.plot_surface
ax1.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8)
功能: 在三维子图上绘制一个表面图。
plot_surface(X, Y, Z, ...):
X, Y, Z: 代表三维空间中的点,这些点构成了表面。
X 和 Y 是通过 np.meshgrid() 函数创建的网格坐标,用于定义二维平面上的坐标点。
Z 是函数值 f(X, Y),代表每个 (X, Y) 点的高度。
cmap='viridis': 使用 viridis 颜色映射来渲染表面。viridis 是一种从黄色到蓝绿色的渐变色彩映射。
alpha=0.8: 设置表面的透明度,0 表示完全透明,1 表示完全不透明。这里设置为 0.8 表示略微透明。
ax1.contour
ax1.contour(X, Y, Z, zdir='z', offset=0, levels=20, cmap='viridis')
功能: 在三维图上绘制等高线并将它们投影到 xy 平面上。
contour(X, Y, Z, ...):
X, Y, Z: 与上面相同,定义了等高线图的坐标和高度。
zdir='z': 指定将等高线沿 z 方向投影到 xy 平面上。
offset=0: 将等高线投影到 z=0 平面上,这意味着等高线被绘制在 xy 平面上。
levels=20: 设置等高线的数量,这里是 20 个等高线级别。
cmap='viridis': 与表面图相同,使用 viridis 颜色映射来渲染等高线。
在等高线图中,每条等高线对应一个特定的函数值(或高度),也就是等高线图中的一个"水平面"切片。等高线的值由我们指定的等高线级别(levels)来决定。levels=20
是指定在图中绘制 20 条等高线,Matplotlib 会自动选择这些等高线的具体值。 当使用 levels=20
时,Matplotlib 将自动计算从函数最小值到最大值之间的 20 个均匀间隔的等高线值。
也就是我们看到等高线图中的2.5、5.0、7.5等
ax2.clabel
ax2.clabel(contour, inline=True, fontsize=8)
功能: 给等高线图添加标签。
ax2.clabel(contour, ...):
contour 是等高线图的返回对象,它包含了等高线的所有信息。
inline=True:表示标签将被放置在等高线上,并与线条对齐,使得标签看起来像嵌在等高线中。
fontsize=8: 设置标签文字的大小为 8 点。
ax2.axhline
ax2.axhline(0, color='black', linewidth=0.5)
功能: 在二维平面上绘制一条水平线。
ax2.axhline(0, ...):
在 y=0 的位置绘制一条水平线。
color='black': 设置水平线的颜色为黑色。
linewidth=0.5: 设置线条宽度为 0.5,线条较细。
ax2.grid
ax2.grid(color='gray', linestyle='--', linewidth=0.5)
功能: 设置二维图上的网格线样式。
ax2.grid(...):
color='gray': 设置网格线的颜色为灰色。
linestyle='--': 设置网格线的样式为虚线。
linewidth=0.5: 设置网格线的宽度为 0.5。