当x坐标,y坐标,x速度和y速度的一维数据可用时,如何使用streamplot函数?

时间:2015-11-10 19:10:51

标签: python numpy matplotlib scipy

以前曾经问过类似的问题,但我无法理解那里提供的答案。因此,我再次重新提出这个问题。我是这个论坛的新手。如果我违反任何规则,我会道歉。

我从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数组。

我真的被卡住了。有人可以帮我这个吗?

谢谢你, 普拉莫德

1 个答案:

答案 0 :(得分:1)

From the documentation

  

x,y :1d阵列
  均匀间隔的网格。

     

u,v :2d数组
  x和y-速度。行数应与y的长度匹配,列数应与x匹配。

查看您的数据我可以立即看到您的xy值未在均匀间隔的网格上采样,因为存在奇数行数。以下是您的数据实际上看起来像quiver的情节(即plt.quiver(x, y, u, v)):

enter image description here

所有向量都或多或少地向上指向,因为您的所有u值都比相应的v值小至少3个数量级。

您发布的值可能只是整个数据集的一小部分,实际上可能会在常规网格上进行采样。在这种情况下,您需要为网格中的每个列/行设置xy唯一的x,y坐标,然后重新塑造uv以便它们每个都有尺寸(ny, nx)。目前,为了将这些数据绘制为流图,您需要在uv坐标的常规2D网格上重新采样xy。 / 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)

结果并不漂亮,但它与箭袋图表显示的一致:

enter image description here