Matplotlib绘制等高线和填充等高线图:全面指南与实例

Matplotlib绘制等高线和填充等高线图:全面指南与实例

参考:matplotlib contour filled

Matplotlib是Python中最流行的数据可视化库之一,它提供了强大的绘图功能,包括绘制等高线和填充等高线图。本文将深入探讨如何使用Matplotlib的contour和contourf函数来创建这些图形,并通过多个实例来展示其应用。

1. 等高线图简介

等高线图是一种二维图形,用于表示三维数据。它通过在二维平面上绘制连接相等值点的线来展示三维表面。这种图形在地形图、天气图和科学数据分析中广泛应用。

1.1 基本概念

  • 等高线:连接具有相同高度或值的点的线。
  • 填充等高线:在等高线之间填充颜色,以更直观地显示数值变化。

1.2 Matplotlib中的等高线函数

Matplotlib提供了两个主要函数来绘制等高线图:

  1. contour(): 绘制等高线
  2. contourf(): 绘制填充等高线

这两个函数都属于pyplot模块,通常我们会这样导入:

import matplotlib.pyplot as plt

2. 基本等高线图

让我们从一个简单的等高线图开始,逐步深入了解如何使用Matplotlib绘制等高线。

2.1 创建基本等高线图

以下是一个基本等高线图的示例:

import numpy as np
import matplotlib.pyplot as plt

# 创建数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 绘制等高线图
plt.figure(figsize=(8, 6))
CS = plt.contour(X, Y, Z)
plt.clabel(CS, inline=True, fontsize=10)
plt.title('Basic Contour Plot - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

在这个例子中:
– 我们首先创建了一个网格数据(X, Y, Z)。
– 使用plt.contour()函数绘制等高线。
plt.clabel()函数用于在等高线上添加标签。
– 最后,我们添加了标题和坐标轴标签。

2.2 自定义等高线级别

我们可以通过指定等高线的级别来控制显示的等高线数量:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

plt.figure(figsize=(8, 6))
levels = [-0.5, 0, 0.5]
CS = plt.contour(X, Y, Z, levels=levels)
plt.clabel(CS, inline=True, fontsize=10)
plt.title('Contour Plot with Custom Levels - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

在这个例子中,我们通过levels参数指定了等高线的具体值。这允许我们只显示感兴趣的等高线。

3. 填充等高线图

填充等高线图可以更直观地展示数据的变化。

3.1 基本填充等高线图

以下是一个基本的填充等高线图示例:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

plt.figure(figsize=(8, 6))
CS = plt.contourf(X, Y, Z, cmap='viridis')
plt.colorbar(CS)
plt.title('Basic Filled Contour Plot - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

在这个例子中:
– 我们使用plt.contourf()函数来创建填充等高线图。
cmap参数用于指定颜色映射。
plt.colorbar()添加了一个颜色条,显示值与颜色的对应关系。

3.2 自定义颜色映射

我们可以自定义颜色映射来改变填充等高线图的外观:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

plt.figure(figsize=(8, 6))
CS = plt.contourf(X, Y, Z, cmap='coolwarm')
plt.colorbar(CS)
plt.title('Filled Contour Plot with Custom Colormap - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

这里我们使用了’coolwarm’颜色映射,它在蓝色和红色之间过渡,适合表示正负值的变化。

4. 结合等高线和填充等高线

我们可以将等高线和填充等高线结合起来,以获得更丰富的视觉效果。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

plt.figure(figsize=(8, 6))
CS = plt.contourf(X, Y, Z, cmap='viridis', alpha=0.7)
C = plt.contour(X, Y, Z, colors='black', linewidths=0.5)
plt.clabel(C, inline=True, fontsize=8)
plt.colorbar(CS)
plt.title('Combined Contour and Filled Contour Plot - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

在这个例子中:
– 我们首先使用plt.contourf()绘制填充等高线。
– 然后使用plt.contour()在填充等高线上叠加黑色的等高线。
alpha参数用于调整填充区域的透明度。

5. 3D等高线图

Matplotlib还支持在3D空间中绘制等高线图。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
CS = ax.contour(X, Y, Z, cmap='viridis')
ax.set_title('3D Contour Plot - how2matplotlib.com')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

这个例子展示了如何在3D空间中绘制等高线。我们使用Axes3D来创建3D图形,并使用ax.contour()在3D空间中绘制等高线。

6. 等高线图的高级技巧

6.1 添加标签

我们可以为等高线添加标签,以显示具体的数值:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

plt.figure(figsize=(8, 6))
CS = plt.contour(X, Y, Z)
plt.clabel(CS, inline=True, fontsize=10, fmt='%1.2f')
plt.title('Contour Plot with Labels - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

在这个例子中,fmt='%1.2f'参数指定了标签的格式,显示两位小数。

6.2 自定义等高线样式

我们可以自定义等高线的颜色、线型和宽度:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

plt.figure(figsize=(8, 6))
CS = plt.contour(X, Y, Z, colors='red', linestyles='dashed', linewidths=2)
plt.clabel(CS, inline=True, fontsize=10)
plt.title('Contour Plot with Custom Style - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

这个例子展示了如何使用红色虚线绘制等高线。

6.3 使用对数刻度

对于跨越多个数量级的数据,使用对数刻度可能更合适:

import numpy as np
import matplotlib.pyplot as plt

x = np.logspace(0, 2, 100)
y = np.logspace(0, 2, 100)
X, Y = np.meshgrid(x, y)
Z = np.log(X * Y)

plt.figure(figsize=(8, 6))
CS = plt.contourf(X, Y, Z, locator=plt.LogLocator())
plt.colorbar(CS)
plt.xscale('log')
plt.yscale('log')
plt.title('Contour Plot with Logarithmic Scale - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

这个例子使用对数刻度绘制等高线图,适合展示跨越多个数量级的数据。

7. 等高线图的实际应用

等高线图在多个领域都有广泛应用,下面我们来看几个实际应用的例子。

7.1 地形图

等高线图最常见的应用之一是绘制地形图:

import numpy as np
import matplotlib.pyplot as plt

def generate_terrain(size=100):
    x = np.linspace(0, 1, size)
    y = np.linspace(0, 1, size)
    X, Y = np.meshgrid(x, y)
    Z = (X - 0.5)**2 + (Y - 0.5)**2 + np.random.rand(size, size) * 0.1
    return X, Y, Z

X, Y, Z = generate_terrain()

plt.figure(figsize=(10, 8))
CS = plt.contourf(X, Y, Z, cmap='terrain', levels=20)
C = plt.contour(X, Y, Z, colors='black', linewidths=0.5)
plt.clabel(C, inline=True, fontsize=8, fmt='%1.2f')
plt.colorbar(CS)
plt.title('Terrain Contour Map - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

这个例子模拟了一个简单的地形,使用’terrain’颜色映射来模拟地形的高度变化。

7.2 温度分布图

等高线图也常用于展示温度分布:

import numpy as np
import matplotlib.pyplot as plt

def generate_temperature(size=100):
    x = np.linspace(-5, 5, size)
    y = np.linspace(-5, 5, size)
    X, Y = np.meshgrid(x, y)
    Z = 20 + 5 * np.sin(X) + 5 * np.cos(Y)
    return X, Y, Z

X, Y, Z = generate_temperature()

plt.figure(figsize=(10, 8))
CS = plt.contourf(X, Y, Z, cmap='coolwarm', levels=20)
C = plt.contour(X, Y, Z, colors='black', linewidths=0.5)
plt.clabel(C, inline=True, fontsize=8, fmt='%1.1f°C')
plt.colorbar(CS, label='Temperature (°C)')
plt.title('Temperature Distribution - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

这个例子模拟了一个温度分布图,使用’coolwarm’颜色映射来表示温度的冷热变化。

7.3 压力场可视化

在流体力学中,等高线图常用于可视化压力场:

import numpy as np
import matplotlib.pyplot as plt

def generate_pressure_field(size=100):
    x = np.linspace(-5, 5, size)
    y = np.linspace(-5, 5, size)
    X, Y = np.meshgrid(x, y)
    Z = np.exp(-(X**2 + Y**2) / 10)
    return X, Y, Z

X, Y, Z = generate_pressure_field()

plt.figure(figsize=(10, 8))
CS = plt.contourf(X, Y, Z, cmap='viridis', levels=20)
C = plt.contour(X, Y, Z, colors='black', linewidths=0.5)
plt.clabel(C, inline=True, fontsize=8, fmt='%1.2f')
plt.colorbar(CS, label='Pressure')
plt.title('Pressure Field Visualization - how2matplotlib.com')
plt.xlabel('X继续输出剩余内容:

plt.xlabel('X')
plt.ylabel('Y')
plt.show()

这个例子模拟了一个简单的压力场,使用’viridis’颜色映射来表示压力的变化。

8. 等高线图的高级定制

8.1 使用不规则网格

有时我们需要在不规则的网格上绘制等高线图:

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata

# 生成不规则点
np.random.seed(0)
x = np.random.rand(1000) * 4 - 2
y = np.random.rand(1000) * 4 - 2
z = x * np.exp(-x**2 - y**2)

# 创建规则网格
xi = np.linspace(-2, 2, 100)
yi = np.linspace(-2, 2, 100)
Xi, Yi = np.meshgrid(xi, yi)

# 插值
Zi = griddata((x, y), z, (Xi, Yi), method='cubic')

plt.figure(figsize=(10, 8))
CS = plt.contourf(Xi, Yi, Zi, cmap='viridis', levels=15)
C = plt.contour(Xi, Yi, Zi, colors='black', linewidths=0.5)
plt.clabel(C, inline=True, fontsize=8, fmt='%1.2f')
plt.colorbar(CS)
plt.title('Contour Plot with Irregular Grid - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

这个例子展示了如何在不规则的数据点上创建等高线图。我们使用scipy.interpolate.griddata函数来将不规则数据插值到规则网格上。

8.2 添加箭头标注

我们可以在等高线图上添加箭头来指示特定的特征:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

plt.figure(figsize=(10, 8))
CS = plt.contourf(X, Y, Z, cmap='viridis', levels=20)
C = plt.contour(X, Y, Z, colors='black', linewidths=0.5)
plt.clabel(C, inline=True, fontsize=8, fmt='%1.2f')
plt.colorbar(CS)

# 添加箭头
plt.annotate('Peak', xy=(0, 0), xytext=(2, 2),
             arrowprops=dict(facecolor='red', shrink=0.05))

plt.title('Contour Plot with Arrow Annotation - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

这个例子在等高线图上添加了一个指向峰值的红色箭头。

8.3 使用掩码数据

有时我们可能想要排除某些区域的数据:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 创建掩码
mask = X**2 + Y**2 > 16

# 应用掩码
Z_masked = np.ma.array(Z, mask=mask)

plt.figure(figsize=(10, 8))
CS = plt.contourf(X, Y, Z_masked, cmap='viridis', levels=20)
C = plt.contour(X, Y, Z_masked, colors='black', linewidths=0.5)
plt.clabel(C, inline=True, fontsize=8, fmt='%1.2f')
plt.colorbar(CS)
plt.title('Contour Plot with Masked Data - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

这个例子展示了如何使用掩码来排除距离原点较远的数据点。

9. 等高线图的性能优化

当处理大量数据时,等高线图的绘制可能会变得很慢。以下是一些优化性能的技巧:

9.1 减少数据点

import numpy as np
import matplotlib.pyplot as plt

# 生成大量数据点
x = np.linspace(-5, 5, 1000)
y = np.linspace(-5, 5, 1000)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 减少数据点
step = 5
X_reduced = X[::step, ::step]
Y_reduced = Y[::step, ::step]
Z_reduced = Z[::step, ::step]

plt.figure(figsize=(10, 8))
CS = plt.contourf(X_reduced, Y_reduced, Z_reduced, cmap='viridis', levels=20)
plt.colorbar(CS)
plt.title('Optimized Contour Plot - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

这个例子通过每隔几个点取一个数据点来减少总的数据量,从而提高绘图速度。

9.2 使用简化的等高线级别

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 500)
y = np.linspace(-5, 5, 500)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

plt.figure(figsize=(10, 8))
levels = np.linspace(-1, 1, 11)  # 只使用11个等高线级别
CS = plt.contourf(X, Y, Z, cmap='viridis', levels=levels)
plt.colorbar(CS)
plt.title('Contour Plot with Simplified Levels - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

这个例子通过减少等高线的数量来提高绘图速度。

10. 结合其他可视化技术

等高线图可以与其他可视化技术结合,创造出更丰富的图表。

10.1 等高线图与散点图结合

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 生成一些随机点
np.random.seed(0)
points_x = np.random.uniform(-5, 5, 50)
points_y = np.random.uniform(-5, 5, 50)

plt.figure(figsize=(10, 8))
CS = plt.contourf(X, Y, Z, cmap='viridis', levels=20, alpha=0.7)
plt.scatter(points_x, points_y, c='red', s=50)
plt.colorbar(CS)
plt.title('Contour Plot with Scatter Points - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

这个例子展示了如何在等高线图上叠加散点图。

10.2 等高线图与向量场结合

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 20)
y = np.linspace(-5, 5, 20)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 计算梯度
dx, dy = np.gradient(Z)

plt.figure(figsize=(10, 8))
CS = plt.contourf(X, Y, Z, cmap='viridis', levels=20, alpha=0.7)
plt.quiver(X, Y, dx, dy)
plt.colorbar(CS)
plt.title('Contour Plot with Vector Field - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib绘制等高线和填充等高线图:全面指南与实例

这个例子展示了如何在等高线图上叠加向量场,可以用来表示梯度或流场。

11. 总结

本文详细介绍了如何使用Matplotlib绘制等高线图和填充等高线图。我们从基本概念开始,逐步深入到高级技巧和实际应用。通过多个示例,我们展示了等高线图的多样性和灵活性,以及如何根据具体需求进行定制。

等高线图是一种强大的数据可视化工具,特别适合展示三维数据在二维平面上的分布。无论是在地理学、气象学、物理学还是数据科学中,等高线图都有广泛的应用。

通过掌握本文介绍的技巧,你将能够创建出既美观又信息丰富的等高线图,为你的数据分析和展示增添新的维度。记住,实践是掌握这些技能的关键,所以不要犹豫,立即开始尝试这些例子,并将它们应用到你自己的数据可视化项目中。

最后,Matplotlib的功能远不止于此。随着你对等高线图掌握得越来越熟练,你可以探索更多高级功能,如3D等高线图、动态等高线图等。继续学习和实践,你将能够创造出更加令人印象深刻的数据可视化作品。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程