如何在不丢失轮廓线的情况下平滑Matplotlib中的图?

时间:2013-07-05 17:24:51

标签: python matplotlib plot contour

我有一些需要平滑的锯齿状等高线图。我需要在不丢失任何轮廓线的情况下平滑它们。我提到了these SO个问题,但它们并没有为我的问题提供解决方案。没有任何过滤器,我的情节看起来像这样:

enter image description here

您可以看到外部轮廓非常锯齿,因此不是演示质量。如果我通过0阶和2阶高斯滤波器(即scipy.ndimage.gaussian_filter(z, 2))运行数据,它会使曲线平滑,但我会丢失内部轮廓

Gaussian interpolation -- note the missing inner contours

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

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

  1. 通过contour_object.collections[col_index].get_paths()[path_index].vertices获取每个等高线坐标并平滑/重新绘制每个等高线坐标。这似乎有可能,但不够优雅,我不知道从哪里开始。
  2. 仅对大于某个值的数据应用高斯滤波器:例如,5 * 10 -6 。这很容易做到(循环遍历数据数组,如果值大于截止值,则从原始集合中获取,如果不是,则从过滤集合中获取),但似乎非常随意且难以证明。
  3. 我想做第一个选项,但它似乎有点像黑客。平滑这些等高线图的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

平滑数据 - >丢失数据。

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

如果情节需要看起来与某些非数据相关的原因相当,那就完全没问题了,但如果你想要了解一些有关轮廓性质的任务,那么你是否想让它更令人赏心悦目,你最好只提供原始数据。

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

或者你可以修改平滑的参数,这样你的平滑内核足够窄,不会完全杀死数据集中的微小内圈。

原则上,在某种意义上,没有“平滑”数据而没有“丢失”数据,并且任何不均匀地应用于整个数据集的方法都是可疑的。

<强>加了:

为什么不将这个数字作为一系列两个图?您已经拥有的大平滑绘图(由于平滑显示而丢失了一些数据),然后是仅包含放弃的小轮廓的放大版本的边的绘图。这(以及正确的标题和标题)将引起对平滑的注意,这样就不会有任何人误解平滑的情节是改变数据的事实,并且让你用另一个面板显示更漂亮的大轮廓,丑陋的小轮廓。它还添加了平滑与原始数据的良好视觉混合,这对于这样的情节通常是一个很好的效果。