2 次元の離散空間データがあります。このデータの空間境界を概算して、その上に別のデータセットを含むプロットを作成したいと思います。
理想的には、これは、matplotlib が plt.Polygon() パッチでプロットできる (x,y) ポイントの順序付けられたセットになります。
私の最初の試みは非常に洗練されていません。データの上に細かいグリッドを配置し、データがセル内にある場合は、そのセルの正方形の matplotlib パッチを作成します。したがって、境界の解像度は、グリッドのサンプリング周波数に依存します。以下に例を示します。グレーの領域はデータを含むセルであり、データが存在しないセルは黒です。
最初の試み http://astro.dur.ac.uk/~dmurphy/data_limits.png
OK、問題は解決しました - なぜ私はまだここにいるのですか? うーん....もっと「エレガントな」ソリューション、または少なくとも1つ高速なソリューションが欲しいです(つまり、「実際の」作業を続けたくありません。これを楽しみたいです!)。私が考えることができる最良の方法は、レイトレーシングのアプローチです-例:
- xmin から xmax まで、y=ymin で、データ境界が間隔 dx で交差したかどうかを確認します
- y=ymin+dy, do 1
- 1-2 を実行しますが、今度は y でサンプリングします
別の方法は、中心を定義し、r-シータ空間でサンプリングすることです。つまり、dシータの増分で放射状のスポークを使用します。
どちらも (x,y) ポイントのセットを生成しますが、隣接するポイントを順序付け/リンクして境界を作成するにはどうすればよいですか?
最近接アプローチは適切ではありません。たとえば、(Geography から借りるために) 地峡 (N&S America を接続するパナマを考えてください) が地域を閉鎖して孤立させる可能性があるためです。これはまた、別の plt.Polygon として表現したいデータに見られる穴をうまく処理できない可能性があります。
解決策は、おそらく面積最大化問題を解くことから得られます。データ範囲を定義する一連のポイントについて、これらのポイント内に含まれる最大連続エリアは? 囲まれたエリアを形成するために、n 番目のポイントの隣接ポイントは? このスキームでは、穴はどのように扱われますか? これは現在、トポロジーに誤りがありますか?
申し訳ありませんが、これの多くは私が大声で考えていることです。ヒント、提案、または解決策を教えていただければ幸いです。これは、多くのソリューション手法でよく研究されている問題だと思いますが、コーディングが簡単で、すぐに実行できるものを探しています...誰もが本当にそうだと思います!
~~~~~~~~~~~~~~~~~~~~~~~~~
マークの凸包のアイデアを使用した試み #2 を 次に示します。代替テキスト http://astro.dur.ac.uk/~dmurphy/data_limitsv2.png
このために、qhull パッケージの qconvex を使用して、極端な頂点を返すようにしました。興味のある方へ:
猫 [データ] | qconvex Fx > out
境界のサンプリングはかなり低いようで、設定をあまりいじっていませんが、忠実度を改善できるとは確信していません。