2017-08-23 20 views
2

pyplotの輪郭ラベルに問題があります。私がプロットの領域を制限するとき、輪郭ラベルはもはや存在しないプロットの部分に書き込まれます。実際のデータを使用している数字の中には、実際にはほとんどの行にラベルが付いていることがあります。拡大したプロットにすべてのラベルが表示されることを確認する簡単な方法はありますか?プロットサイズを制限した後輪郭ラベルを移動する

これに対応する実際のデータは規則的に配置されていないため、これをいくつかの異なる変数に使用します。私はマニュアルオプションを使用できることを知っていますが、それは私が選択したドメインにどの輪郭があるかを知ることを意味します。

たとえば、次の例では、2番目のプロットに8000個の等高線ラベルがありません。

import numpy as np 
from matplotlib import pyplot as plt 

#Make some Fake Data 
x = np.arange(-100,101,1) 
x,y = np.meshgrid(x,x) 
z = x**2+y**2+6*x 

#Plot said fake data 
ax = plt.subplot(111) 
clevs = np.arange(0,z.max(),2000) 
cs = ax.contour(x,y,z,clevs,colors='k') 
plt.clabel(cs,inline=True,fmt='%3.0d') 
plt.show() 

#Plot zoomed in fake data 
ax = plt.subplot(111) 
clevs = np.arange(0,z.max(),2000) 
cs = ax.contour(x,y,z,clevs,colors='k') 
ax.set_xlim(-50,50) #Limit the x-axis 
plt.clabel(cs,inline=True,fmt='%3.0d') 
plt.show() 

enter image description here

enter image description here

+0

を次のようにこれは私がかなりの数のプロットを持っていると私は手動で、ラベルに収縮したドメイン内にあるすべてのコンターレベルを識別しないことを好むマスクされたnumpyのアレイで行うことができます。 – BenT

答えて

2

あなたはclabel sはデータ範囲内であること、従って、プロットに表示することを余儀なくされるような限られたデータとの等高線図を作成することができます。

import numpy as np 
from matplotlib import pyplot as plt 

x = np.arange(-100,101,1) 
x,y = np.meshgrid(x,x) 
z = x**2+y**2+6*x 

ax = plt.subplot(121) 
clevs = np.arange(0,z.max(),2000) 
cs = ax.contour(x,y,z,clevs,colors='k') 
plt.clabel(cs,inline=True,fmt='%3.0d') 

#Plot zoomed in fake data 
ax2 = plt.subplot(122) 
clevs = np.arange(0,z.max(),2000) 

def limitcontour(ax, x,y,z,clevs, xlim=None, ylim=None, **kwargs): 
    mask = np.ones(x.shape).astype(bool) 
    if xlim: 
     mask = mask & (x>=xlim[0]) & (x<=xlim[1]) 
    if ylim: 
     mask = mask & (y>=ylim[0]) & (y<=ylim[1]) 
    xm = np.ma.masked_where(~mask , x) 
    ym = np.ma.masked_where(~mask , y) 
    zm = np.ma.masked_where(~mask , z) 

    cs = ax.contour(xm,ym,zm, clevs,**kwargs) 
    if xlim: ax.set_xlim(xlim) #Limit the x-axis 
    if ylim: ax.set_ylim(ylim) 
    ax.clabel(cs,inline=True,fmt='%3.0d') 

limitcontour(ax2, x,y,z, clevs, xlim=[-50,50], ylim=[-90,90], colors="k") 

ax.set_title("all data") 
ax2.set_title("masked data") 
plt.show() 

enter image description here

関連する問題