7

ポリゴン内の海面温度 (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 が機能しない理由も理解したいと思います。

set_clip_path を使用して切り取られた輪郭を示す最終的なソリューション

4

1 に答える 1

4

scipy.griddataを使用してデータを補間します。あなたの地域 (mypatches) の外側の領域を に設定できますnp.nan。そして、pyplot.contourを使用してプロットします。

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata

def sst_data(x, y):
    return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2

                         #replace with ...
x = np.random.rand(1000) #... your x
y = np.random.rand(1000) #... your y
sst = sst_data(x, y)     #... your sst

# interpolate to a grid
grid_x, grid_y = np.mgrid[0:1:100j, 0:1:200j] 
grid_z = griddata((x,y), sst, (grid_x, grid_y), method='cubic')

# mask out the area outside of your region
nr, nc = grid_z.shape
grid_z[-nr//3:, -nc//3:] = np.nan

plt.contourf(grid_x, grid_y, grid_z)

plt.show()

ここに画像の説明を入力

編集: plt.contourf() 呼び出しで変数名を変更しました (..(grid_z, grid_y, grid_z) でした)

于 2013-09-13T10:41:14.983 に答える