2016-03-25 42 views
0

私は、2つのカテゴリからいくつかの2次元確率質量関数を持っています。私はそれらを視覚化するために輪郭をプロットしようとしています(例えば、半分の高さではありますが、実際には問題はありません)。1つのレベルを持つ複数のMATLAB等高線プロット

塗りの色と不透明度を制御したいので、私は直接プロットするのにcontourfを使いたくありません。だから、contourcを使ってxy座標を生成し、次にfillをこれらのxy座標で使用しています。

contourc関数のxy座標には、次の奇妙な頂点がプロットされる原因となる奇妙な数が含まれているという問題があります。まず

enter image description here

私はそれが奇妙contourmatrix形式だと思ったが、私は唯一contourcから一つの値を求めていて、それがこれですとは思いません。私は唯一の輪郭を求めていたときにcontourmatrixがそれらでこれらの奇妙な値を持っている理由はたとえば...

contourmatrix = contourc(x, y, Z, [val, val]); 
h = fill(contourmatrix(1,:), contourmatrix(2,:), 'r'); 

は誰でも知っていますか?

UPDATE:

私の問題は、入力された2D行列は「スムーズ」ではないときcontourcの故障モードであるかもしれないようです。ソースデータは(x、y)点の大きな集合です。次に、hist2d関数を使って2D行列を作成します。しかし、ときに、この問題は誇張されている... enter image description here

うるさいですが、私はよりスムーズな2D機能をもたらすように、2Dカーネル密度関数を使用する場合、問題が軽減されています... enter image description here

フルプロセスは、A)I配布 Bからのサンプルを形成する(x、y)の点の集合を持っている)Iが2D PMF Cにこれを変換)contourc Dを使用してcontourmatrixを作成 ある)プロットfill

+1

あなたがサンプルデータと情報を追加するための – Hoki

+0

感謝を簡略化した例を提供してもらえますが、それは本当に私たちがいる限り、我々がそうであるように手助けすることはできません。問題を再現するのに必要なデータがありません。そのため、どこかの場所(Googleドライブ/ Dropboxなど)にデータセットをアップロードしたり、リンクを共有したり、Figureを作成するためのコードを表示したり、サンプルデータを簡単に作成して簡単に作成できます。いずれにしても、何がうまくいかないかを知るためにはコードを参照する必要があります。 – Hoki

+0

あなたの寄生線はアンカーポイントから来ていると思われます。 'ContourMatrix'構造を注意深く見てください。いくつかの点は座標ではなく、与えられたプロファイルに対して考慮すべき点のレベルと数を示しています。これらの点は 'fill'コマンドに含めてはなりません。ですから、 'contourmatrix(1、:)'をfill関数に送ることによって、余分なポイントを送ります。輪郭によって1つの形状しか定義されていない場合は、少なくとも 'contourmatrix(1,2:end)'(最初の列を送らないでください)を使用する必要があります。 isolevelに複数の図形がある場合、輪郭行列を解析する必要があります。 – Hoki

答えて

1
を使用して

あなたのグラフィックの不具合は、ContourMatrixのデータを使用する方法が原因です。たとえ1つのアイソレーブしか指定しなくても、これはいくつかの別個の塗りつぶし領域になります。したがって、ContourMatrixにはいくつかの図形のデータが含まれている可能性があります。


簡単な例:

isolevel = 2 ; 
[X,Y,Z] = peaks ; 
[C,h] = contourf(X,Y,Z,[isolevel,isolevel]); 

が生成されます、あなたが描画するだけisolevelを指定した場合でも


contourf outputが、これは2つのパッチになります(2つの形状)。それぞれに独自の定義がありますが、どちらもContourMatrixに埋め込まれているため、個々の図形座標を個別に抽出する場合は解析する必要があります。私は単にpatch機能にフル等高線行列を投げた場合(私はとき実用的な低レベルの機能を使用することを好むようfill機能はとにかくパッチオブジェクトを作成します)、ポイントを証明するために

。あなたがそうであるように、私は同じグリッチ行を取得:

xc = X(1,:) ; 
yc = Y(:,1) ; 
c = contourc(xc,yc,Z,[isolevel,isolevel]); 
hold on 
hp = patch(c(1,1:end),c(2,1:end),'r','LineWidth',2) ; 

は、あなたが持っているグリッチの同じ種類の生成:あなたが適切に各形状を抽出する場合は今

not parsed


は含めずに座標適切な図形が得られます。下の例は、インスピレーションのために各図形を抽出して描画するための1つの方法ですが、これはさまざまな方法で行います。確かに多くのコードをコンパクトにまとめることができますが、ここでは明確にするために操作を詳しく説明しました。

キーは、ContourMatrixがどのように構築されているかを読んで理解することです。

parsed = false ; 
iShape = 1 ; 
while ~parsed 
    %// get coordinates for each isolevel profile 
    level = c(1,1) ; %// current isolevel 
    nPoints = c(2,1) ; %// number of coordinate points for this shape 

    idx = 2:nPoints+1 ; %// prepare the column indices of this shape coordinates 
    xp = c(1,idx) ;  %// retrieve shape x-values 
    yp = c(2,idx) ;  %// retrieve shape y-values 
    hp(iShape) = patch(xp,yp,'y','FaceAlpha',0.5) ; %// generate path object and save handle for future shape control. 

    if size(c,2) > (nPoints+1) 
     %// There is another shape to draw 
     c(:,1:nPoints+1) = [] ; %// remove processed points from the contour matrix 
     iShape = iShape+1 ;  %// increment shape counter 
    else 
     %// we are done => exit while loop 
     parsed = true ; 
    end 
end 
grid on 

これが生成されます。

enter image description here

関連する問題