如何在Matplotlib中平滑绘图而不丢失等高线?

3
我有一些不平滑的等高线图需要进行平滑处理。我需要在不丢失任何等高线的情况下将它们平滑处理。我已经参考了这些 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)的数据应用高斯滤波器。这很容易做到(循环遍历数据数组,并从原始集合中取出值大于截止值的值,从过滤集合中取出值小于等于截止值的值),但似乎相当任意且难以证明。
我想做类似第一种选择的事情,但它似乎有点像一个hack。什么是平滑这些轮廓图的最佳方法?

1
这篇帖子可能会有所帮助:https://gis.stackexchange.com/questions/24827/how-to-smooth-the-polygons-in-a-contour-map - mankoff
@mankoff 这正是我本来想问的问题(但没有问好)。谢谢你提供链接!如果它们在同一个网站上,我甚至会说我的问题可以被关闭为那个问题的重复。 - Cody Piersall
1个回答

4
平滑数据->丢失数据。
我的第一反应是:为什么要显示平滑的数据?我很少见到数据呈现中使用数据平滑对理解数据含义有实际帮助的情况。实际上,这是 Tufte 经常批评的事情(当然,这不是避免这样做的理由,但也许要比正常情况下提出更多的理由)。
如果绘图需要看起来漂亮,但与数据无关,那完全可以接受,但如果您想使其在任务是了解轮廓的性质时更加令人愉悦,请直接按原始数据呈现。
如果将不同的轮廓存储为不同的数据集(例如,只需窃取轮廓绘制器使用的不同线绘图数据集),则可以仅对从平滑中丢失数据可接受的那些轮廓应用平滑,并保留较小的内部轮廓不平滑和参差不齐。
或者,您可以调整平滑的参数,使您的平滑核足够窄,以便它不会完全削减掉数据集中的小内环。
但原则上,没有任何方法可以“平滑”数据而不在某种意义上“丢失”数据,而对整个数据集不均匀应用的任何方法都将引起怀疑。 添加: 为什么不将图作为两个图的系列呈现?您已经有了大型平滑绘图(由于平滑显示而丢失了一些数据),然后是侧面的图,它只包含被删除的小轮廓。这样(加上适当的标题和说明)会吸引人们关注平滑,从而没有任何人误解平滑绘图是修改后的数据,并让您使用另一个面板来显示更漂亮的大轮廓和较丑陋的参差不齐的小轮廓。对于此类绘图,这还添加了平滑与原始数据的不错视觉效果。

好的观点:“平滑数据->丢失数据”。我已经编辑了我的问题标题,使其更清晰。我们在为加工厂进行建筑选址研究时向客户展示这些图表,以显示风险水平所在的位置,因此我们必须以与以往相似的方式呈现数据。 - Cody Piersall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接