2012-05-13 13 views
1

輪郭マップで「ズーム」を描画する際に問題があります。輪郭が部分的に可視領域外になったときに、重複したmatplotlib輪郭ラベルを削除する

私は以下のような等高線図を持っている:

Full plot

Howevere、データのみの一部を(プロットすることにより、中I「ズーム」、問題は、最高の以下の画像で示されていますオリジナルの入力配列のスライスを)取る、結果は以下の通りである。ラベルは行がVIS外に行くためか、各ラインのために二度追加されるように

partial plot

に思えますスペースを空けてから再び戻ってください。手動ですべてのラベルを置く必要なく、2番目のラベルセットが表示されないようにするにはどうすればよいですか?中央の矩形の近くでは、すべての線がとにかく重なっているので、そこでラベルを配置する必要はありません。

+0

第2セットのラベルはどこですか?彼らがどこにいるのかわかりません。 – fraxel

+0

@fraxel彼らはすべて中央の四角形の左側に沿ってお互いの上に置かれています。 – pafcu

答えて

3

ラベルを一時的に必要としないパスをcsオブジェクトから削除するには、clabel()を呼び出して、削除された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

関連する問題