简介
本教程将指导你使用 Python 中的 Matplotlib 创建流线图的过程。流线图是一种二维向量场,用于显示一组流线。它用于可视化流体流动和其他向量场。在本教程中,我们将向你展示如何创建一个具有变化密度、颜色和线宽的流线图,同时控制流线的起点。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
导入库
在开始之前,我们需要导入所需的库。在本教程中,我们将使用 Numpy 和 Matplotlib 库。Numpy 用于数值运算,Matplotlib 用于数据可视化。
import matplotlib.pyplot as plt
import numpy as np
创建数据
我们将使用 Numpy 库为我们的流线图创建数据。在这个例子中,我们将在两个方向上创建一个包含 100 个点的网格,并计算向量场的 U 和 V 分量。
w = 3
Y, X = np.mgrid[-w:w:100j, -w:w:100j]
U = -1 - X**2 + Y
V = 1 + X - Y**2
speed = np.sqrt(U**2 + V**2)
变化的密度
在这一步中,我们将创建一个具有变化密度的流线图。density 参数控制要绘制的流线数量。较高的值将导致更多的流线。
plt.streamplot(X, Y, U, V, density=[0.5, 1])
plt.title('Varying Density')
plt.show()
变化的颜色
在这一步中,我们将创建一个具有变化颜色的流线图。color 参数接受一个二维数组,该数组表示向量场的大小。在这里,我们使用向量场的 U 分量作为颜色。
strm = plt.streamplot(X, Y, U, V, color=U, linewidth=2, cmap='autumn')
plt.colorbar(strm.lines)
plt.title('Varying Color')
plt.show()
变化的线宽
在这一步中,我们将创建一个具有变化线宽的流线图。linewidth 参数控制流线的宽度。在这里,我们使用之前计算的 speed 数组来改变线宽。
lw = 5*speed / speed.max()
plt.streamplot(X, Y, U, V, density=0.6, color='k', linewidth=lw)
plt.title('Varying Line Width')
plt.show()
控制起始点
在这一步中,我们将创建一个具有可控起始点的流线图。start_points 参数接受一个二维数组,该数组表示流线的起始点。
seed_points = np.array([[-2, -1, 0, 1, 2, -1], [-2, -1, 0, 1, 2, 2]])
strm = plt.streamplot(X, Y, U, V, color=U, linewidth=2,
cmap='autumn', start_points=seed_points.T)
plt.colorbar(strm.lines)
plt.title('Controlling Starting Points')
plt.plot(seed_points[0], seed_points[1], 'bo')
plt.xlim(-w, w)
plt.ylim(-w, w)
plt.show()
带掩码的流线图
在这一步中,我们将创建一个带掩码的流线图。我们将创建一个掩码并将其应用于向量场的 U 分量。流线将跳过被掩码的区域。
mask = np.zeros(U.shape, dtype=bool)
mask[40:60, 40:60] = True
U[:20, :20] = np.nan
U = np.ma.array(U, mask=mask)
plt.streamplot(X, Y, U, V, color='r')
plt.title('Streamplot with Masking')
plt.imshow(~mask, extent=(-w, w, -w, w), alpha=0.5, cmap='gray', aspect='auto')
plt.gca().set_aspect('equal')
plt.show()
不间断的流线
在这一步中,我们将创建一个具有不间断流线的流线图。broken_streamlines 参数控制当流线超出单个网格单元内的线条限制时是否应断开。
plt.streamplot(X, Y, U, V, broken_streamlines=False)
plt.title('Streamplot with Unbroken Streamlines')
plt.show()
总结
在本教程中,我们学习了如何使用 Python 中的 Matplotlib 创建流线图。我们介绍了 streamplot 函数的各种参数,包括变化的密度、颜色和线宽。我们还学习了如何控制流线的起始点、应用掩码以及绘制不间断的流线。