以前曾经问过类似的问题,但我无法理解那里提供的答案。因此,我再次重新提出这个问题。我是这个论坛的新手。如果我违反任何规则,我会道歉。
我从CFD模拟中获得了文本格式的原始数据。我想从这些数据中绘制流函数。 streamplot函数的matplotlib文档提到" u,v:2d数组x和y-velocityocities。行数应与y的长度匹配,列数应与x"匹配。这是文本文件中的示例数据
x y x-velocity y-velocity
1.48E+01 0.00E+00 0.00E+00 2.36E-01
1.49E+01 0.00E+00 0.00E+00 2.36E-01
1.51E+01 0.00E+00 0.00E+00 2.36E-01
1.52E+01 0.00E+00 0.00E+00 2.36E-01
1.54E+01 0.00E+00 0.00E+00 2.36E-01
1.55E+01 0.00E+00 0.00E+00 2.36E-01
1.57E+01 0.00E+00 0.00E+00 2.36E-01
1.46E+01 1.52E-01 0.00E+00 0.00E+00
1.48E+01 1.52E-01 1.13E-04 2.36E-01
1.49E+01 1.52E-01 9.01E-05 2.36E-01
1.51E+01 1.52E-01 3.81E-05 2.36E-01
1.52E+01 1.52E-01 1.85E-13 2.36E-01
1.54E+01 1.52E-01 3.81E-05 2.36E-01
1.55E+01 1.52E-01 9.01E-05 2.36E-01
1.57E+01 1.52E-01 1.13E-04 2.36E-01
1.58E+01 1.52E-01 0.00E+00 0.00E+00
1.46E+01 3.05E-01 0.00E+00 0.00E+00
1.48E+01 3.05E-01 1.54E-04 2.36E-01
1.49E+01 3.05E-01 1.18E-04 2.36E-01
1.51E+01 3.05E-01 5.21E-05 2.36E-01
1.52E+01 3.05E-01 3.92E-12 2.36E-01
1.54E+01 3.05E-01 5.21E-05 2.36E-01
1.55E+01 3.05E-01 1.18E-04 2.36E-01
1.57E+01 3.05E-01 1.54E-04 2.36E-01
1.58E+01 3.05E-01 0.00E+00 0.00E+00
1.46E+01 4.57E-01 0.00E+00 0.00E+00
1.48E+01 4.57E-01 1.85E-04 2.36E-01
1.49E+01 4.57E-01 1.37E-04 2.36E-01
1.51E+01 4.57E-01 6.28E-05 2.36E-01
这是整个文本文件可用的链接。该数据是从等间隔的网格获得的。 Text File。 如果我只使用streamplot函数和我当前的数据,它会显示异常' ValueError:' u'和' v'必须是形状'网格(x,y)。我不知道如何进一步。我是否必须使用scipy中的一种插值方法来获得U和V速度的2D数组。
我真的被卡住了。有人可以帮我这个吗?
谢谢你, 普拉莫德
答案 0 :(得分:1)
x,y :1d阵列
均匀间隔的网格。u,v :2d数组
x和y-速度。行数应与y的长度匹配,列数应与x匹配。
查看您的数据我可以立即看到您的x
和y
值未在均匀间隔的网格上采样,因为存在奇数行数。以下是您的数据实际上看起来像quiver
的情节(即plt.quiver(x, y, u, v)
):
所有向量都或多或少地向上指向,因为您的所有u
值都比相应的v
值小至少3个数量级。
您发布的值可能只是整个数据集的一小部分,实际上可能会在常规网格上进行采样。在这种情况下,您需要为网格中的每个列/行设置x
和y
唯一的x,y坐标,然后重新塑造u
和v
以便它们每个都有尺寸(ny, nx)
。目前,为了将这些数据绘制为流图,您需要在u
和v
坐标的常规2D网格上重新采样x
和y
。 / p>
一种选择是尝试在一组新的网格位置插入它们,例如使用scipy.interpolate.griddata
:
import numpy as np
from scipy.interpolate import griddata
# resample onto a 50x50 grid
nx, ny = 50, 50
# (N, 2) arrays of input x,y coords and u,v values
pts = np.vstack((x, y)).T
vals = np.vstack((u, v)).T
# the new x and y coordinates for the grid, which will correspond to the
# columns and rows of u and v respectively
xi = np.linspace(x.min(), x.max(), nx)
yi = np.linspace(y.min(), y.max(), ny)
# an (nx * ny, 2) array of x,y coordinates to interpolate at
ipts = np.vstack(a.ravel() for a in np.meshgrid(yi, xi)[::-1]).T
# an (nx * ny, 2) array of interpolated u, v values
ivals = griddata(pts, vals, ipts, method='cubic')
# reshape interpolated u,v values into (ny, nx) arrays
ui, vi = ivals.T
ui.shape = vi.shape = (ny, nx)
# plot
fig, ax = plt.subplots(1, 1)
ax.hold(True)
ax.streamplot(xi, yi, ui, vi)
ax.quiver(x, y, u, v)
结果并不漂亮,但它与箭袋图表显示的一致: