Streamplot 错误:无法将浮点 NaN 转换为整数

2 投票
1 回答
2699 浏览
提问于 2025-04-17 16:00

我正在尝试使用streamplot函数来绘制速度场,但不知道为什么它失败了。这里有一个关于这个函数的原始StackOverflow帖子,里面有个例子:如何在知道速度的u和v分量(numpy 2D数组)的情况下,用Python的绘图程序绘制流线?。这个例子对我来说运行得很好;然而,我尝试修改一些数值,以简化函数并模拟初始条件,但现在它不再工作了。

这是我“简化”后的代码:

import matplotlib.pyplot as plt
import numpy as np
from streamplot import streamplot

x = np.linspace(0, 1, 10)
y = np.linspace(0, 2, 10)
u = np.zeros((len(x), len(y)))
v = np.zeros((len(x), len(y)))
u[:,len(y)-1]=1
speed = np.sqrt(u*u + v*v)

plt.figure()
plt.subplot(121)
streamplot(x, y, u, v,density=1, INTEGRATOR='RK4', color='b')
plt.subplot(122)
streamplot(x, y, u, v, density=(1,1), INTEGRATOR='RK4', color=u,
           linewidth=5*speed/speed.max())
plt.show()

任何建议或帮助都非常感谢。

1 个回答

0

我觉得问题在于你的 (x,y) 网格的密度(顺便说一下,你在初始化 uv 的时候把 xy 搞混了)比 streamplot 网格的密度要低。当你设置 density=1 或者 (1,1)(这两个应该是一样的)时,“这个区域被划分成了一个 25x25 的网格”。我觉得这意味着如果你的数据在某个很窄的区域内不为零,而这个区域的密度又比 streamplot 或者你的 x-y 网格要小,就会出现一些平滑处理的情况。我尝试通过增加这些密度(densitylinspace 的间距)来解决这个问题,但没有成功。不过如果你在边缘上让 两个 列不为零,似乎就能正常工作了。

看起来 streamplot 函数在这些情况下不是很稳定,也许你应该提交一个bug报告。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 1, 10)
y = np.linspace(0, 2, 10)
u = np.zeros((y.size, x.size))
v = np.zeros((y.size, x.size))
u[:,-2:] = 1
speed = np.sqrt(u*u + v*v)

plt.figure()
plt.subplot(121)
plt.streamplot(x, y, u, v,density=1, color='b')
plt.subplot(122)
plt.streamplot(x, y, u, v, density=(1,1), color=u, linewidth=5*speed/speed.max())
plt.show()

撰写回答