56

等間隔の2Dデータ(画像のようなデータ)の単一の輪郭からデータを取得したいと思います。

同様の質問で見つかった例に基づいて:等高線図(matplotlib)によってプロットされた線の(x、y)値を取得するにはどうすればよいですか?

>>> import matplotlib.pyplot as plt
>>> x = [1,2,3,4]
>>> y = [1,2,3,4]
>>> m = [[15,14,13,12],[14,12,10,8],[13,10,7,4],[12,8,4,0]]
>>> cs = plt.contour(x,y,m, [9.5])
>>> cs.collections[0].get_paths()

この呼び出しの結果cs.collections[0].get_paths()は次のとおりです。

[Path([[ 4.          1.625     ]
 [ 3.25        2.        ]
 [ 3.          2.16666667]
 [ 2.16666667  3.        ]
 [ 2.          3.25      ]
 [ 1.625       4.        ]], None)]

プロットに基づくと、この結果は理にかなっており、等高線の(y、x)ペアのコレクションであるように見えます。

この戻り値を手動でループし、座標を抽出し、行の配列を組み立てる以外に、matplotlib.pathオブジェクトからデータを取得するためのより良い方法はありますか?からデータを抽出するときに注意すべき落とし穴はありmatplotlib.pathますか?

あるいは、同様のことを行うための代替案がありますかmatplotlib?理想的なのは、線を表す(x、y)ペアの高解像度ベクトルを取得することです。これは、一般に、上記の例のようにデータセットが小さくも単純でもないため、さらに分析するために使用できます。numpyscipy

4

4 に答える 4

60

特定のパスについて、次のようにポイントを取得できます。

p = cs.collections[0].get_paths()[0]
v = p.vertices
x = v[:,0]
y = v[:,1]
于 2011-04-14T16:31:40.050 に答える
10

から: http://matplotlib.org/api/path_api.html#module-matplotlib.path

Path オブジェクトのユーザーは、頂点とコードの配列に直接アクセスしないでください。代わりに、 iter_segments() を使用して頂点/コードのペアを取得する必要があります。多くの Path オブジェクトは最適化としてコードをまったく保存せず、iter_segments() によってデフォルトのコードが提供されるため、これは重要です。

そうでなければ、あなたの質問が何であるかよくわかりません。[Zip] は、座標を操作するときに便利な組み込み関数です。1

于 2013-02-04T05:17:10.957 に答える
4

私は同様の問題に直面しており、このmatplotlibリストの議論に出くわしました。

基本的に、プロットを取り除き、基になる関数を直接呼び出すことができます。これは非常に便利ではありませんが、可能です。ソリューションもピクセル単位では正確ではありません。これは、基になるコードで何らかの補間が行われている可能性があるためです。

import matplotlib.pyplot as plt
import matplotlib._cntr as cntr
import scipy as sp

data = sp.zeros((6,6))
data[2:4,2:4] = 1

plt.imshow(data,interpolation='none')
level=0.5
X,Y = sp.meshgrid(sp.arange(data.shape[0]),sp.arange(data.shape[1]))
c = cntr.Cntr(X, Y, data.T)
nlist = c.trace(level, level, 0)
segs = nlist[:len(nlist)//2]
for seg in segs:
    plt.plot(seg[:,0],seg[:,1],color='white')

plt.show()
于 2015-05-20T13:11:20.503 に答える
3

すべてのパスの頂点は、単純に次の方法で float64 の numpy 配列として返すことができます。

cs.allsegs[i][j]  # for element j, in level i

wherecsは、元の質問のように次のように定義されています。

import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
y = [1, 2, 3, 4]
m = [[15, 14, 13, 12], [14, 12, 10, 8], [13, 10, 7, 4], [12, 8, 4, 0]]
cs = plt.contour(x, y, m, [9.5])

より詳細な:

コレクションを調べてパスと頂点を抽出することは、最も簡単で最速の方法ではありません。返された Contour オブジェクトには、実際には を介し​​てセグメントの属性がありcs.allsegs、形状 [level][element][vertex_coord] のネストされたリストを返します。

num_levels = len(cs.allsegs)
num_element = len(cs.allsegs[0])  # in level 0
num_vertices = len(cs.allsegs[0][0])  # of element 0, in level 0
num_coord = len(cs.allsegs[0][0][0])  # of vertex 0, in element 0, in level 0

参照を参照してください: https://matplotlib.org/3.1.1/api/contour_api.html

于 2019-08-26T10:08:07.277 に答える