Make contour of scatter

前端 未结 3 2093
北恋
北恋 2020-11-22 13:40

In python, If I have a set of data

x, y, z

I can make a scatter with

import matplotlib.pyplot as plt
plt.scatter(x,y,c=z)
         


        
相关标签:
3条回答
  • 2020-11-22 13:55

    The solution will depend on how the data is organized.

    Data on regular grid

    If the x and y data already define a grid, they can be easily reshaped to a quadrilateral grid. E.g.

    #x  y  z
     4  1  3
     6  1  8
     8  1 -9
     4  2 10
     6  2 -1
     8  2 -8
     4  3  8
     6  3 -9
     8  3  0
     4  4 -1
     6  4 -8
     8  4  8 
    

    can plotted as a contour using

    import matplotlib.pyplot as plt
    import numpy as np
    x,y,z = np.loadtxt("data.txt", unpack=True)
    plt.contour(x.reshape(4,3), y.reshape(4,3), z.reshape(4,3))
    

    Arbitrary data

    a. Interpolation

    In case the data is not living on a quadrilateral grid, one can interpolate the data on a grid. One way to do so is scipy.interpolate.griddata

    import numpy as np
    from scipy.interpolate import griddata
    
    xi = np.linspace(4, 8, 10)
    yi = np.linspace(1, 4, 10)
    zi = griddata((x, y), z, (xi[None,:], yi[:,None]), method='linear')
    plt.contour(xi, yi, zi)
    

    b. Non-gridded contour

    Finally, one can plot a contour completely without the use of a quadrilateral grid. This can be done using tricontour.

    plt.tricontour(x,y,z)
    

    An example comparing the latter two methods is found on the matplotlib page.

    0 讨论(0)
  • 2020-11-22 14:02

    You can use tricontourf as suggested in case b. of this other answer:

    import matplotlib.tri as tri
    import matplotlib.pyplot as plt
    
    plt.tricontour(x, y, z, 15, linewidths=0.5, colors='k')
    plt.tricontourf(x, y, z, 15)
    

    Old reply:

    Use the following function to convert to the format required by contourf:

    from numpy import linspace, meshgrid
    from matplotlib.mlab import griddata
    
    def grid(x, y, z, resX=100, resY=100):
        "Convert 3 column data to matplotlib grid"
        xi = linspace(min(x), max(x), resX)
        yi = linspace(min(y), max(y), resY)
        Z = griddata(x, y, z, xi, yi)
        X, Y = meshgrid(xi, yi)
        return X, Y, Z
    

    Now you can do:

    X, Y, Z = grid(x, y, z)
    plt.contourf(X, Y, Z)
    

    enter image description here

    0 讨论(0)
  • 2020-11-22 14:03

    contour expects regularly gridded data. You thus need to interpolate your data first:

    import numpy as np
    from scipy.interpolate import griddata
    import matplotlib.pyplot as plt
    import numpy.ma as ma
    from numpy.random import uniform, seed
    # make up some randomly distributed data
    seed(1234)
    npts = 200
    x = uniform(-2,2,npts)
    y = uniform(-2,2,npts)
    z = x*np.exp(-x**2-y**2)
    # define grid.
    xi = np.linspace(-2.1,2.1,100)
    yi = np.linspace(-2.1,2.1,100)
    # grid the data.
    zi = griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic')
    # contour the gridded data, plotting dots at the randomly spaced data points.
    CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k')
    CS = plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet)
    plt.colorbar() # draw colorbar
    # plot data points.
    plt.scatter(x,y,marker='o',c='b',s=5)
    plt.xlim(-2,2)
    plt.ylim(-2,2)
    plt.title('griddata test (%d points)' % npts)
    plt.show()
    

    Note that I shamelessly stole this code from the excellent matplotlib cookbook

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