Python 画 等高线图

Python 画 等高线图

flyfish

通过三维图形与投影等高线相结合的方式,能够直观地看到三维函数的形状以及在平面上等值线的分布。

等高线是一种用来表示三维表面在二维平面上的方法。它们是通过在固定高度(或深度)处切割三维表面来创建的平面曲线。每条等高线代表一个常数值,通常被称为"标高"或"高度"。等高线图广泛用于地形图、气象图、工程制图等领域,以表示高度、压力、温度等数据的变化。

特点:
  1. 高度相等 :同一条等高线上的所有点具有相同的标高。
  2. 等高线间距 :相邻等高线之间的垂直距离(即"间距")表示高度变化的大小。等高线密集的区域表示斜度较陡,而等高线稀疏的区域表示斜度较缓。
  3. 闭合或开口 :等高线可能是闭合的环形,表示孤立的高峰或低谷;也可能是开口的,延伸到图的边缘。

等高线可以应用于表示山丘、山谷、平原等地形特征。显示气压、温度等气象数据的分布。表示压力、速度、浓度等物理量的分布。

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。

相关推荐
湫ccc4 分钟前
《Python基础》之基本数据类型
开发语言·python
drebander1 小时前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list
威威猫的栗子1 小时前
Python Turtle召唤童年:喜羊羊与灰太狼之懒羊羊绘画
开发语言·python
墨染风华不染尘2 小时前
python之开发笔记
开发语言·笔记·python
Dxy12393102162 小时前
python bmp图片转jpg
python
麦麦大数据2 小时前
Python棉花病虫害图谱系统CNN识别+AI问答知识neo4j vue+flask深度学习神经网络可视化
人工智能·python·深度学习
LKID体2 小时前
Python操作neo4j库py2neo使用之创建和查询(二)
数据库·python·neo4j
LKID体2 小时前
Python操作neo4j库py2neo使用之py2neo 删除及事务相关操作(三)
开发语言·python·neo4j
小屁孩大帅-杨一凡2 小时前
Python-flet实现个人视频播放器
开发语言·python·音视频
算家云2 小时前
快速识别模型:simple_ocr,部署教程
开发语言·人工智能·python·ocr·数字识别·检测模型·英文符号识别