ポリゴン内の海面温度 (SST) データの塗りつぶされた等高線図を作成する必要がありますが、これを行う最善の方法がわかりません。X、Y、および SST のデータを含む 3 つの 1D 配列があり、以下を使用してプロットし、添付のプロットを作成します。
p=PatchCollection(mypatches,color='none', alpha=1.0,edgecolor="purple",linewidth=2.0)
levels=np.arange(SST.min(),SST.max(),0.2)
datamap=mymap.scatter(x,y,c=SST, s=55, vmin=-2,vmax=3,alpha=1.0)
これらのデータを、ポリゴンの境界 (紫色の線) 内に制約 (クリップ) された塗りつぶされた等高線 (散布図ではなく輪郭線) としてプロットできるようにしたいと考えています。これを達成する方法についての提案は大歓迎です。
更新: 最初に griddata を試しましたが、正しく動作させることができませんでした。ただし、@eatHam から提供された回答に基づいて、もう一度やり直すことにしました。メソッド 'cubic' を選択するとグリッドにハングアップし続けるため、scipy griddata を機能させることができませんでしたが、matplotlib.mlab.griddata に切り替えて 'linear' 補間を使用すると機能しました。境界をマスキングするという提案は、非常に粗く、私が好むほど正確な解決策ではありませんでした。
matplotlib で輪郭をクリップする方法に関するオプションを検索したところ、このリンクで @pelson の回答が見つかりました。「輪郭セット自体にはset_clip_pathメソッドはありませんが、各輪郭コレクションを反復処理して、それぞれのクリップパスを設定できます」に示されている提案された解決策を試しました。私の新しい最終的な解決策は次のようになります(下のプロットを参照):
p=PatchCollection(mypatches,color='none', alpha=1.0,edgecolor="purple",linewidth=2.0)
levels=np.arange(SST.min(),SST.max(),0.2)
grid_x, grid_y = np.mgrid[x.min()-0.5*(x.min()):x.max()+0.5*(x.max()):200j,
y.min()-0.5*(y.min()):y.max()+0.5*(y.max()):200j]
grid_z = griddata(x,y,SST,grid_x,grid_y)
cs=mymap.contourf(grid_x, grid_y, grid_z)
for poly in mypatches:
for artist in ax.get_children():
artist.set_clip_path(poly)
ax.add_patch(poly)
mymap.drawcountries()
mymap.drawcoastlines()
mymap.fillcontinents(color='lightgrey',lake_color='none')
mymap.drawmapboundary(fill_color='none')
このソリューションは、特に北の極端なエッジを外挿するという点で改善される可能性があります。完全なポリゴンを実際に「塗りつぶす」方法についての提案を歓迎します。また、mlab が機能し、scipy が機能しない理由も理解したいと思います。