2016-10-18 23 views
3

問題カラーバー/プロットの問題?

だから、約0.65にほぼ0の値の範囲のデータの束を含む6層(array.size = (192,288,6))と緯度・経度のアレイを有する「POSXとPOSYは有限の値でなければなりません」。 6層([:,:,0][:,:,1]など)のすべてのデータをプロットすると、問題はなく、素敵なマップが得られます([:,:,4]を除く)。何らかの理由で、この2D配列をプロットしようとすると、わからないエラーメッセージが表示され、カラーバーをインクルードしようとすると表示されます。私はカラーバーをnixの場合はそこにはエラーはませんが、私はそのカラーバーを必要とする...

コード

ここで私は結果のプロットと一緒に、アレイの異なる部分に使用するコードです。 [:,:,5]に行きましょう。

#Set labels 
lonlabels = ['0','45E','90E','135E','180','135W','90W','45W','0'] 
latlabels = ['90S','60S','30S','Eq.','30N','60N','90N'] 

#Set cmap properties 
bounds = np.array([0,0.001,0.01,0.05,0.1,0.2,0.3,0.4,0.5,0.6]) 
boundlabels = ['0','0.001','0.01','0.05','0.1','0.2','0.3','0.4','0.5','0.6'] 
cmap = plt.get_cmap('jet') 
norm = colors.PowerNorm(0.35,vmax=0.65) #creates logarithmic scale 

#Create basemap 
fig,ax = plt.subplots(figsize=(15.,10.)) 
m = Basemap(projection='cyl',llcrnrlat=-90,urcrnrlat=90,llcrnrlon=0,urcrnrlon=360.,lon_0=180.,resolution='c') 
m.drawcoastlines(linewidth=2,color='w') 
m.drawcountries(linewidth=2,color='w') 
m.drawparallels(np.arange(-90,90,30.),linewidth=0.3) 
m.drawmeridians(np.arange(-180.,180.,45.),linewidth=0.3) 
meshlon,meshlat = np.meshgrid(lon,lat) 
x,y = m(meshlon,meshlat) 

#Plot variables 
trend = m.pcolormesh(x,y,array[:,:,5],cmap='jet',norm=norm,shading='gouraud') 

#Set plot properties 
#Colorbar 
cbar=m.colorbar(trend, size='5%',ticks=bounds,location='bottom',pad=0.8) 
cbar.set_label(label='Here is a label',size=25) 
cbar.set_ticklabels(boundlabels) 
for t in cbar.ax.get_xticklabels(): 
    t.set_fontsize(25) 
#Titles & labels 
ax.set_title('Here is a title for [:,:,5]',fontsize=35) 
ax.set_xlabel('Longitude',fontsize=25) 
ax.set_xticks(np.arange(0,405,45)) 
ax.set_xticklabels(lonlabels,fontsize=20) 
ax.set_yticks(np.arange(-90,120,30)) 
ax.set_yticklabels(latlabels,fontsize=20) 

enter image description here

私はarray[:,:,4]代わりのarray[:,:,5]ためEXACT同じコードが、プロットを使用するときに今、私はこのエラーを取得します。

ValueError        Traceback (most recent call last) 
/linuxapps/anaconda/lib/python2.7/site-packages/IPython/core/formatters.pyc in __call__(self, obj) 
    305     pass 
    306    else: 
--> 307     return printer(obj) 
    308    # Finally look for special method names 
    309    method = get_real_method(obj, self.print_method) 

[lots of further traceback] 

/linuxapps/anaconda/lib/python2.7/site-packages/matplotlib/text.pyc in draw(self, renderer) 
    755    posy = float(textobj.convert_yunits(textobj._y)) 
    756    if not np.isfinite(posx) or not np.isfinite(posy): 
--> 757     raise ValueError("posx and posy should be finite values") 
    758    posx, posy = trans.transform_point((posx, posy)) 
    759    canvasw, canvash = renderer.get_canvas_width_height() 

ValueError: posx and posy should be finite values 

私は配列のプロットのすべての部分のコードがうまくいっていて、すべてが同じmeshgridを使用しているので、なぜこのようにしているのかわかりません。配列にはNaNがありません。問題が消え、私はカラーバーコードを含むが1.0norm = colors.PowerNorm(1.0,vmax=0.65))にPowerNormを変更する場合:私はすべてのコードをコメントアウトした場合UPDATE enter image description here

#Colorbar間と #Titles & labelsまた、ここでの結果です。 1.0以外のものは、カラーバーが含まれているときにエラーを生成します。

質問

posx & posyエラーメッセージを引き起こしている可能性があり、そしてどのように私は私が含まカラーバーで、このプロットを行うことができますそれを取り除くことができますどのような

UPDATE

私は(私は0.65にバインド0.6を変更したことを除いて)同じコードで再び、ゼロからカーネルを実行すると、私はarray[:,:,4]ブロックで次の警告を取得します。彼らが関係しているかどうかは分かりませんが、場合によってはそれらを含めることにします。

/linuxapps/anaconda/lib/python2.7/site-packages/matplotlib/colors.py:1202: RuntimeWarning: invalid value encountered in power 
    np.power(resdat, gamma, resdat) 

[<matplotlib.text.Text at 0x2af62c8e6710>, 
<matplotlib.text.Text at 0x2af62c8ffed0>, 
<matplotlib.text.Text at 0x2af62cad8e90>, 
<matplotlib.text.Text at 0x2af62cadd3d0>, 
<matplotlib.text.Text at 0x2af62caddad0>, 
<matplotlib.text.Text at 0x2af62cae7250>, 
<matplotlib.text.Text at 0x2af62cacd050>] 

/linuxapps/anaconda/lib/python2.7/site-packages/matplotlib/axis.py:1015:  UserWarning: Unable to find pixel distance along axis for interval padding of ticks; assuming no interval padding needed. 
    warnings.warn("Unable to find pixel distance along axis " 
/linuxapps/anaconda/lib/python2.7/site-packages/matplotlib/axis.py:1025:  UserWarning: Unable to find pixel distance along axis for interval padding of ticks; assuming no interval padding needed. 
    warnings.warn("Unable to find pixel distance along axis " 
+0

。 'np.isfinite(array [:、:、、4])'はあなたに何を表示しますか? array [:、:、4]の最小値と最大値を調べることができますか?すなわち、あなたの 'boundlabels'は実際にそのスライスのデータ内にありますか?等。 – Ajean

+0

"np.where(np.isfinite(lintrends [=、:、4])== False)を出力すると配列の位置は返されないので、すべてのデータが有限です。 np.max = 0.613478607374およびnp.min = 4.4408920985e-15であり、したがって、すべてのデータは0と0.65の間にある。 (境界線の0.6を0.65に変更しても、同じエラーが表示されます) – ChristineB

答えて

2

だから私はvmax & vminを指定しても問題が解決していることが分かりました。なぜ私は考えていないのですが、私がしたら、私のプロットはカラーバーで正確に判明しました。私たちは本当にデバッグすることはできません配列自体なし残念ながら

trend = m.pcolormesh(x,y,array[:,:,5],cmap='jet',norm=norm,shading='gouraud',vmin=0.,vmax=0.6) 

enter image description here

+0

これも注目されています。あなたの更新は面白かったです。残念ながら、[レベルを指定すると、所望の動作のために絶対に必要である状況(https://stackoverflow.com/questions/42723538/setting-matplotlib-colorbar-range-larger-range-than-the-values-plotted)があります。回避策を見つけようとしていますが、今のところは乾いています。信じられないほどイライラする。 –

関連する問題