我在等高线图中绘制“放大”时遇到问题。下图最好地说明了这个问题:
我有一个如下图所示的等高线图:
但是,当我“放大”时,仅绘制部分数据(取原始输入数组的一部分),结果如下:
似乎每行添加了两次标签,可能是因为这些行超出了可见空间然后再次返回。如何防止出现第二组标签,而无需手动放置所有标签?无论如何,在中心的矩形附近,所有线条都重叠,因此不需要放置在那里的标签。
我在等高线图中绘制“放大”时遇到问题。下图最好地说明了这个问题:
我有一个如下图所示的等高线图:
但是,当我“放大”时,仅绘制部分数据(取原始输入数组的一部分),结果如下:
似乎每行添加了两次标签,可能是因为这些行超出了可见空间然后再次返回。如何防止出现第二组标签,而无需手动放置所有标签?无论如何,在中心的矩形附近,所有线条都重叠,因此不需要放置在那里的标签。
您可以从cs对象中临时删除不需要标签的路径,调用clabel()后,将那些已删除的路径恢复到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()
这是结果,如您所见,绿色和棕色线只有一个标签。
从你的情节来看,我认为你可以使用路径长度作为判断。如果矩形的长度大于外部曲线,则需要寻找其他方法来确定要删除的路径。