【问题标题】:How to smooth matplotlib contour plot?如何平滑 matplotlib 等高线图?
【发布时间】:2012-09-05 04:32:35
【问题描述】:

我有这个形状的 numpy 数组:(33,10)。当我绘制轮廓时,我会得到这样的丑陋图像:

虽然contour() 似乎没有任何关于平滑或某种插值功能的争论。

我以某种方式期望提供等高线图的工具也应该提供平滑。
在 MPL 中有直接的方法吗?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    正如其他人已经指出的那样,您需要对数据进行插值。

    有许多不同的方法可以做到这一点,但对于初学者来说,请考虑scipy.ndimage.zoom

    作为一个简单的例子:

    import numpy as np
    import scipy.ndimage
    import matplotlib.pyplot as plt
    
    data = np.loadtxt('data.txt')
    
    # Resample your data grid by a factor of 3 using cubic spline interpolation.
    data = scipy.ndimage.zoom(data, 3)
    
    plt.contour(data)
    plt.show()
    

    【讨论】:

    • 哇!你总是想出一些我以前没听过的东西。
    • 我只是花了太多时间试图让我的数字尽可能漂亮......这可能解释了为什么我从来没有按时完成任务! :)
    • @nicoguaro - 使用griddata 的问题在于它适用于不规则采样的输入(即分散的数据)。对于重新插值规则网格化的数据,有不同的、更有效的算法。 scipy.ndimage.zoom 利用输入的规则网格特性。对于小的输入网格可能并不明显,但对于较大的网格,zoom 可以快几个数量级。但是,如果您没有常规的网格开始,那么是的,griddata 或类似的东西(例如scipy.interpolate.Rbf)就是您想要的。
    • 感谢@Joe Kington 的解释,我会检查scipy.ndimage.zoom 学习一点。
    【解决方案2】:

    如果您的数据稀疏,Joe Kingtons 的回答非常棒。

    如果您的数据嘈杂,您应该考虑对其进行过滤:

    from numpy import loadtxt
    from scipy.ndimage.filters import gaussian_filter
    from matplotlib.pyplot import contour, show
    
    sigma = 0.7 # this depends on how noisy your data is, play with it!
    data = loadtxt('data.txt')
    data = gaussian_filter(data, sigma)
    contour(data)
    show()
    

    【讨论】:

      【解决方案3】:

      没有简单的方法来获得平滑的轮廓。另一种方法是尝试imshow。您可以查看here 以了解其他可能性。

      import pylab as plt
      import numpy as np
      
      Z=np.loadtxt('data.txt')
      plt.subplot(131)
      plt.imshow(Z,interpolation='nearest')
      
      plt.subplot(132)
      plt.imshow(Z)
      
      plt.subplot(133)
      plt.imshow(Z,interpolation='gaussian')
      
      plt.show()
      

      【讨论】:

        【解决方案4】:

        尝试使用gaussian_filter 平滑您的数据集。请参阅example 了解更多信息。

        【讨论】:

        • 第一个例子是线图,第二个是图像,所以没有一个适用于等高线图。或者我错了,对事情变得多么复杂感到不知所措?
        • 您可以在公共托管上上传原始数据集和您的脚本吗?
        • 当然,这里是data.txt。以防万一,请使用plt.contour(numpy.loadtxt('data.txt')) 绘制它
        • 尝试使用contourf()而不是contour()
        • 我认为 ymn 是正确的,但您可能还需要重新采样数据以获取数据点之间的一些插值点。如果您的采样太粗略,那么绘图实用程序可以做很多事情。
        猜你喜欢
        • 2011-12-24
        • 2013-07-03
        • 2019-03-22
        • 2017-12-02
        • 1970-01-01
        • 1970-01-01
        • 2021-09-06
        • 1970-01-01
        • 2014-09-09
        相关资源
        最近更新 更多