3

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

在此处输入图像描述

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

高斯插值——注意缺失的内轮廓

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

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

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

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

4

1 回答 1

4

平滑数据 -> 丢失数据。

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

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

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

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

但原则上,在某种意义上没有“丢失”数据的情况下无法“平滑”数据,并且任何不统一应用于整个数据集的方法都是可疑的。

添加:

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

于 2013-07-05T17:28:41.017 回答