非规则采样数据下Matplotlib流线(streamplot)绘制方法问询
非规则网格速度场叠加流线图的实现方案
针对非规则散点格式的x、y、u、v数据,无法直接用matplotlib.streamplot的问题,以下是几种可行的实现方法,可直接叠加到你已有的速度大小等值线图上:
方案1:插值为规则网格后使用Matplotlib Streamplot
这是最通用的方案,先将散点数据插值到均匀规则网格,再用原生streamplot绘制流线:
实现步骤&代码:
import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import griddata # 假设你的原始数据为一维数组:x, y, u, v # 先绘制已有的速度大小等值线图(用tricontourf适配非规则网格) speed = np.sqrt(u**2 + v**2) fig, ax = plt.subplots() contour = ax.tricontourf(x, y, speed) plt.colorbar(contour) # 生成覆盖数据范围的规则网格 xi = np.linspace(x.min(), x.max(), 100) # 可调整网格密度 yi = np.linspace(y.min(), y.max(), 100) X, Y = np.meshgrid(xi, yi) # 将u、v插值到规则网格(可选linear/nearest/cubic插值方法) U = griddata((x, y), u, (X, Y), method='linear') V = griddata((x, y), v, (X, Y), method='linear') # 叠加流线图 ax.streamplot(X, Y, U, V, color='k', linewidth=0.8, density=1.2) plt.show()
- 若数据存在空白区域,插值会生成NaN,
streamplot会自动跳过这些区域 - 噪声较大的数据建议用
method='nearest',追求平滑效果选cubic
方案2:直接用Matplotlib Quiver绘制速度箭头场
无需插值,直接基于原始散点绘制速度箭头,作为流线的替代方案:
# 在已有等值线图基础上添加 ax.quiver(x, y, u, v, color='white', scale=50) # scale参数调整箭头长度 # 数据点过多时可采样减少密度 sample_interval = 5 ax.quiver(x[::sample_interval], y[::sample_interval], u[::sample_interval], v[::sample_interval], color='white', scale=50)
方案3:基于三角剖分的Matplotlib Streamplot
如果你的数据可生成三角网格(比如有限元输出),可直接用三角剖分参数跳过插值:
import matplotlib.tri as tri # 生成三角剖分对象 triang = tri.Triangulation(x, y) # 叠加流线图 ax.streamplot(x, y, u, v, triangulation=triang, color='k')
此方法更贴合原始数据分布,无需插值损失精度。
方案4:用Plotly绘制交互式流线图
Plotly支持交互式操作(缩放、hover查看数据),适合需要探索数据的场景:
import plotly.graph_objects as go # 同方案1生成规则网格和插值后的U、V、speed_grid speed_grid = griddata((x, y), speed, (X, Y), method='linear') fig = go.Figure() # 添加等值线图 fig.add_trace(go.Contour(x=xi, y=yi, z=speed_grid, colorscale='Viridis')) # 添加流线图 fig.add_trace(go.Streamline(x=xi, y=yi, u=U, v=V, line=dict(color='black', width=1))) fig.show()
内容的提问来源于stack exchange,提问作者Atmos
相关产品推荐
相关产品推荐

