【问题标题】:How to Smooth a Plot in Matplotlib Without Losing Contour Lines?如何在 Matplotlib 中平滑绘图而不丢失等高线?
【发布时间】:2013-07-03 20:40:48
【问题描述】:

我有一些锯齿状的等高线图需要平滑。我需要在不丢失任何轮廓线的情况下平滑它们。我提到了theseSO 问题,但它们并不能完全解决我的问题。没有任何过滤器,我的图如下所示:

您可以看到外轮廓非常参差不齐,因此呈现质量不佳。如果我通过 0 阶和 sigma 2 的高斯滤波器(即scipy.ndimage.gaussian_filter(z, 2))运行数据,它会平滑绘图,但我失去内部轮廓

在不丢失内部轮廓的情况下平滑绘图的最佳方法是什么? 我使用的数据的性质是它始终在中心附近具有最高值。过滤散布信息并使内部轮廓消失。这些是最重要的等值线:等值线代表生命损失的风险,因此通常值越高越重要。

我考虑了两种平滑轮廓线的方法。

  1. 通过contour_object.collections[col_index].get_paths()[path_index].vertices 获取每个等高线坐标并平滑/重新绘制每一个。这似乎可行,但不优雅,我不知道从哪里开始。
  2. 仅对大于特定值的数据应用高斯滤波器:例如 5*10-6。这很容易做到(循环遍历数据数组,如果值大于截止值,则从原始集合中获取,如果不是,则从过滤集合中获取),但似乎非常随意且难以证明。

我想做类似于第一个选项的事情,但它看起来有点像 hack。平滑这些等高线图的最佳方法是什么?

【问题讨论】:

  • 这篇文章可能会有所帮助:gis.stackexchange.com/questions/24827/…
  • @mankoff 这正是我打算问的问题(但问得不好)。谢谢你的链接!我什至会说如果我的问题在同一个站点上,我的问题可能会作为另一个问题的副本而被关闭。

标签: python matplotlib plot contour


【解决方案1】:

平滑数据 -> 丢失数据。

我的第一反应是:为什么要显示平滑数据?我很少看到数据演示中的数据平滑实际上有助于理解数据的含义。事实上,这是 Tufte 经常批评的事情(这当然不是避免这样做的理由,但也许是因为要求自己提出比平常更多的理由)。

如果由于某些与数据无关的原因需要使情节看起来很漂亮,那完全可以,但是如果您在任务是了解有关轮廓的性质时试图使其更令人赏心悦目,您最好直接呈现原始数据。

如果您将不同的等高线存储为单独的数据集(例如,如果您只是窃取等高线绘图仪正在使用的不同线图数据集),那么您可以仅对那些因平滑而丢失数据的等高线应用平滑可以接受,并保留较小的内部轮廓不平滑和锯齿状。

或者您可以修改平滑参数,使您的平滑内核足够窄,不会完全消除数据集中的微小内环。

但原则上,在某种意义上,如果不“丢失”数据,就无法“平滑”数据,任何不统一应用于整个数据集的方法都是可疑的。

添加:

为什么不把这个图做成两个图的系列呢?您已经拥有的大型平滑图(由于平滑显示而丢失了一些数据),然后是一侧的图,它只是放大版本,仅包含被丢弃的小轮廓。这(连同适当的标题和说明)将引起人们对平滑的注意,这样就不会有任何人误解平滑图是更改数据这一事实的风险,并允许您使用另一个面板显示更漂亮的大轮廓,以显示更丑陋、锯齿状的小轮廓。它还为平滑数据与原始数据添加了很好的视觉组合,这对于这样的绘图通常是一个很好的效果。

【讨论】:

  • 好点“平滑数据 -> 丢失数据。”我已经编辑了我的问题标题以更清楚。当我们为加工厂进行选址研究时,我们会向客户展示这些图,以向他们展示风险水平在哪里,因此这是我们必须以与我们一直呈现数据的方式类似的方式呈现数据的事情之一。
猜你喜欢
  • 1970-01-01
  • 2011-12-24
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 2018-03-31
  • 2017-12-02
  • 2021-09-06
相关资源
最近更新 更多