【问题标题】:Make contour of scatter制作散点轮廓
【发布时间】:2020-05-08 21:23:21
【问题描述】:

在python中,如果我有一组数据

x, y, z

我可以做一个分散的

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

我怎样才能得到一个 plt.contourf(x,y,z) 的 scatter ?

【问题讨论】:

    标签: python matplotlib contour scatter-plot


    【解决方案1】:

    您可以按照this other answerb.的建议使用tricontourf

    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)
    

    旧回复:

    使用以下函数转换为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
    

    现在你可以这样做了:

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

    【讨论】:

    • 您从 ? ... from scipy.interpolate import griddatafrom matplotlib.mlab import griddata
    • @JuanPablo,ups,你是对的,固定的(from matplotlib.mlab import griddata 是正确的)。
    • from matplotlib.mlab import griddata 自 matplotlib 2.2 起已弃用
    • Deprecated since version 2.2: The griddata function was deprecated in Matplotlib 2.2 and will be removed in 3.1. Use scipy.interpolate.griddata instead.
    • 这里plt.tricontourf(x, y, z, 15)15是什么意思?
    【解决方案2】:

    解决方案将取决于数据的组织方式。

    常规网格上的数据

    如果xy 数据已经定义了一个网格,则可以轻松地将它们重新调整为四边形网格。例如

    #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 
    

    可以使用

    绘制为contour
    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))
    

    任意数据

    一个。插值

    如果数据不在四边形网格上,可以在网格上插入数据。一种方法是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.非网格轮廓

    最后,无需使用四边形网格即可完全绘制轮廓。这可以使用tricontour 来完成。

    plt.tricontour(x,y,z)
    

    matplotlib page 上可以找到比较后两种方法的示例。

    【讨论】:

      【解决方案3】:

      contour 需要定期网格化数据。因此,您需要先插入数据:

      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()
      

      请注意,我无耻地从优秀的 matplotlib cookbook 那里窃取了这段代码

      【讨论】:

      • 当我使用scipy.interpolate的gridata时,程序运行了很长时间,这个永远不会停止。
      • 这当然取决于您的数据,您在最初的帖子中没有指定这些数据。您绝对应该尝试使用griddatamethod 参数。试试method="nearest",它应该给出最快的插值。
      猜你喜欢
      • 2021-07-03
      • 2013-10-23
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      相关资源
      最近更新 更多