当轮廓部分位于可见区域之外时,删除重复的matplotlib轮廓标签

时间:2012-05-13 13:15:59

标签: python plot matplotlib

我在轮廓图中绘制“缩放”时遇到问题。使用以下图像可以很好地说明问题:

我有一个如下图所示的轮廓图:

Full plot

当我“缩放”时,只绘制部分数据(取一块原始输入数组),结果如下:

partial plot

似乎每行添加两次标签,可能是因为这些行超出了可见空间然后再次返回。如何防止出现第二组标签,而无需手动放置所有标签?在中心的矩形附近,所有的线都是重叠的,因此不需要放置标签。

1 个答案:

答案 0 :(得分:3)

您可以在调用clabel()之后从cs对象中删除不需要标签的路径,将这些已删除的pathes恢复到cs对象。

这是一个例子。对于每个级别的集合,保持最长路径,并删除所有其他集合。 path_length()计算路径的长度。

import pylab as pl
import numpy as np

x, y = np.mgrid[-2:1:100j, -1:1:100j]
z = np.sqrt(x*x+y*y)

cs = pl.contour(x, y, z, linewidths=2)

def path_length(path):
    v = path.vertices
    dv = np.diff(v, axis=0)
    return np.sum(np.sqrt(np.sum(dv**2, axis=-1)))

# remain the longest path and remove all others
deleted_path = []
for c in cs.collections:
    paths = c.get_paths()
    if len(paths) > 1:
        paths.sort(key=path_length, reverse=True)
        for p in paths[1:]:
            deleted_path.append((c, p))
        del paths[1:]

# create labels
r = pl.clabel(cs, cs.levels, inline=True, fontsize=10)

# restore all removed paths
for c, p in deleted_path:
    c.get_paths().append(p)

pl.show()

结果如下所示,绿色和绿色只有一个标签。棕色线。

从你的情节来看,我认为你可以使用路径长度作为判断。如果矩形的长度大于外部曲线,则需要找到其他方法来确定要删除的路径。

enter image description here