Search code examples
imagematplotlibplotdataformat

matplotlib imshow() with irregular spaced data points


I am trying to put some data into an imshow() plot. My problem is that the data does not come as a MxN array but as a 3xN array (x- and y coordinate and value). The points are NOT arranged as a regular grid but lie within [xmin,xmax,ymin and ymax]=[-pi/2,pi/2,0,3.5].

In [117]: shape(data)
Out[117]: (3L, 102906L)

How can I get a nice image plot from that data? Thank you very much for any help.

btw the data represents temperature values on the surface of a rod as a function of axial and azimuthal position, think of a cfd-mesh.


Solution

  • I recommend using the griddata-method for interpolation. A sample would be:

    import numpy as np
    from matplotlib.mlab import griddata
    import matplotlib.pyplot as plt
    
    xs0 = np.random.random((1000)) * np.pi - np.pi/2
    ys0 = np.random.random((1000)) * 3.5
    zs0 = np.random.random((1000))
    
    N = 30j
    extent = (-np.pi/2,np.pi/2,0,3.5)
    
    xs,ys = np.mgrid[extent[0]:extent[1]:N, extent[2]:extent[3]:N]
    
    resampled = griddata(xs0, ys0, zs0, xs, ys)
    
    plt.imshow(resampled.T, extent=extent)
    plt.plot(xs0, ys0, "r.")
    plt.plot(xs, ys, "b.")
    plt.title("imshow for irregularly spaced data using griddata")
    plt.show()
    

    I guess transition from your 3*X-array to three X-arrays is obvious.

    The result is:

    Sample

    Red points show the "original" positions of the data, blue points for the now regularly spaced data.

    griddata returns a masked array. All points for which the interpolation cannot be evaluated are masked and then plotted as white areas.

    HTH, Thorsten