How to use streamplot function when 1D data of x-coordinate, y-coordinate, x-velocity and y-velocity are available?

后端 未结 1 971
挽巷
挽巷 2021-01-28 17:39

A similar type of question has been asked in SO before, but I couldn\'t understand the answers provided there. Hence I am reposting the question again.I am new to this forum. So

相关标签:
1条回答
  • 2021-01-28 17:54

    From the documentation:

    x, y : 1d arrays
    an evenly spaced grid.

    u, v : 2d arrays
    x and y-velocities. Number of rows should match length of y, and the number of columns should match x.

    Looking at your data I can see straight away that your x and y values aren't sampled on an evenly spaced grid, since there is an odd number of rows. Here's what your data actually look like as a quiver plot (i.e. plt.quiver(x, y, u, v)):

    All the vectors point more or less straight upwards because all of your u values are at least 3 orders of magnitude smaller than their corresponding v values.

    Perhaps the values you posted are only a small fraction of the whole dataset, which might in fact be sampled on a regular grid. In that case you would need to make x and y the unique x,y coordinates for each column/row in the grid, then reshape u and v so that they each have dimensions (ny, nx). As it stands, in order to plot these data as a stream plot you would need to resample u and v on a regular 2D grid of x and y coordinates.

    One option would be to try interpolating them at a new set of grid locations, for example using 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)
    

    The result isn't pretty, but it's consistent with what the quiver plot shows:

    0 讨论(0)
提交回复
热议问题