2017-07-04 5 views
2

誰もが次のことが起こる理由を知っていますか?私は1または0のいずれかを含むデータの配列を持っています。以下のコード。data = np.ma.masked_equal(data, 1)は、データが1の任意のポイントをマスクし、0にのみハッチングを残します。これは期待どおりに動作しません(どこにでもハッチ)。何か案は?Pythonプロットの問題/マスクされた配列/ハッチング

import numpy as np 
from matplotlib import pyplot as plt 
from mpl_toolkits.basemap import Basemap 

data = np.zeros((324,432)) 
data[:,0:100] = 1 

data = data.astype(np.int) 

Lons_I,Lats_I = np.meshgrid(np.linspace(0,360,432),np.linspace(-90,90,324)) 


m = Basemap(projection='npstere',boundinglat=60,lon_0=0,resolution='c') 
m.drawcoastlines(linewidth=0.3) 
X, Y = m(Lons_I, Lats_I) 
cs = m.contourf(X,Y,data,np.linspace(-5,5,26),cmap='RdBu_r',extend='both') 

data = np.ma.masked_equal(data, 1) 

plt.pcolor(X,Y,data, hatch=".",alpha=0) 
cbar = m.colorbar(cs) 


plt.show() 

enter image description here

+0

ませんソリューション - これは、バグですか? –

+1

SOで半日以内に答えが得られないすべての問題がバグだった場合、我々はグローバルなソフトウェアの崩壊を起こすでしょう。迅速な回答が得られない理由は主に質問に[mcve]が含まれていないことです。この場合、問題はベースマップから独立しているように見えるので、あなたはそれを残すことができます。また、巨大なnetcdfファイルをダウンロードする必要もありません(ほとんどの人はインターネットから未知のファイルをダウンロードしません)。 – ImportanceOfBeingErnest

+0

私はあなたのデータを持っていないので、あなたのプロットを再現することはできませんが、私は自己生成データを試しました。あなたのデータが正確に1ではないということだけが念頭に置かれます。(この方法を 'floats 'と比較するのは良い考えではありません - マスキングする前にデータを' int'にキャストしてください。つまり 'data = data.astype (np.int) ' –

答えて

3

問題はハッチングではありません。また、np.ma.masked_equalの機能でもありません。配列内で01に交換することでそれを試すことができます。これは1の代わりに0に問題を移植します。

解決策に向かうルートは、ハッチングを無視し、非ゼロのアルファを使用します。はるかに少ないポイントを使用して、我々は色の2つの異なる色合いがあることを観察し、

enter image description here

data = np.zeros((18,25)) 
data[:,0:9] = 1 
Lons_I,Lats_I = np.meshgrid(np.linspace(0,360,25),np.linspace(-90,90,18)) 

m = Basemap(projection='npstere',boundinglat=60,lon_0=0,resolution='c') 
m.drawcoastlines(linewidth=0.3) 
X, Y = m(Lons_I, Lats_I) 

data = np.ma.masked_equal(data, 1) 

plt.pcolor(X,Y,data, alpha=0.3) 

これは、メッシュの部分はより頻繁に他よりもプロットされていることを教えてくれる。

なぜなら、球座標系が使用されているからです。プロットは一度球(0,360)を横切るだけでなく、直交する方向(-90,90)でその周りを半分にします。次に、外側の点が接続され、マップの一部が二重に色付けされます。

これは、完全な半球を使用しないことによって、望ましい結果が得られることを意味します。したがって、-90から90に行くのではなく、少し遅れてグリッドを開始します。 -89.99から90までです。

enter image description here

import numpy as np 
from matplotlib import pyplot as plt 
from mpl_toolkits.basemap import Basemap 

data = np.zeros((324,432)) 
data[:,0:100] = 1 

Lons_I,Lats_I = np.meshgrid(np.linspace(0,360,432),np.linspace(-89.99,90,324)) 

m = Basemap(projection='npstere',boundinglat=60,lon_0=0,resolution='c') 
m.drawcoastlines(linewidth=0.3) 
X, Y = m(Lons_I, Lats_I) 
cs = m.contourf(X,Y,data,np.linspace(-5,5,26),cmap='RdBu_r',extend='both') 

data = np.ma.masked_equal(data, 1) 

plt.pcolor(X,Y,data, hatch=".", alpha=0) 
cbar = m.colorbar(cs) 

plt.show() 
+0

ああ、これはとても面白いです。理解を助けるために解決策を説明する時間をとってくれてありがとう。 –

関連する問題