3

ソフト クラスタリングを視覚化しようとしています。多数のポイントと少数のクラスターがあり、各ポイントはある程度の確率で各クラスターに属します。

現在、各クラスターの散布図を重ね合わせており、「o」マーカーのサイズは確率によって異なります。これにより、最も可能性の高いクラスターを簡単に特定できますが、それ以上のことはできません。

円グラフの散布図、つまり、これらの確率を示す、多くのデータ ポイントのそれぞれに対して 1 つの小さな円グラフを描きたいと思います。それはMatlabで可能ですか?円をマーカーとして描画する方法や、1 つのプロットの任意の位置に複数の円グラフを配置する方法が見つかりません…</p>

4

2 に答える 2

5

最初の試みとして、2 つのLINEグラフィック オブジェクト (円用と円内の分割用)のみを使用して、各ポイントで円グラフを描画することができました。したがって、塗りつぶされていない円グラフをプロットしているだけです。

これは、パフォーマンスの点で非常に効率的です。NaNこれは、線をセグメントに分割するために使用することによって実現されます。これを他の提案されたソリューションと比較してください。そのソース コードを見ると、1 つの点ごとに 1 つの軸が作成され、その中で MATLAB の関数PIEが呼び出されていることがわかります。

「ファジークラスタリング」とともにいくつかのデータポイントから始めます。

numPoints = 15; numClasses = 5;

%# random 2D points
points = randn(numPoints,2);

%# fuzzy clustering: probabilistic distribution
prob = rand(numPoints,numClasses);
prob = bsxfun(@rdivide, prob, sum(prob,2));

円グラフの散布図をプロットするコードは次のとおりです。

%# pie parameters
theta = linspace(0, 2*pi, 100); %# steps to approximate a circle
r = min(range(points)) / 10;    %# radius (determined based on points spread)

%# pie circles
px = bsxfun(@plus, cos(theta).*r, points(:,1))';
py = bsxfun(@plus, sin(theta).*r, points(:,2))';
px(end+1,:) = NaN; py(end+1,:) = NaN;

%# pie divisions
tt = cumsum(prob,2) .* 2*pi;
qx = cat(3, ...
    bsxfun(@plus, cos(tt).*r, points(:,1)), ...
    repmat(points(:,1), [1 numClasses]), ...
    NaN(numPoints,numClasses));
qy = cat(3, ...
    bsxfun(@plus, sin(tt).*r, points(:,2)), ...
    repmat(points(:,2), [1 numClasses]), ...
    NaN(numPoints,numClasses));
qx = permute(qx, [3 2 1]); qy = permute(qy, [3 2 1]);

%# plot
figure
line(px(:), py(:), 'Color','k')
line(qx(:), qy(:), 'Color','k')
axis equal

スクリーンショット1


2 回目の試行では、 PATCH関数を使用してすべての円に各スライスを描画することで、色付きの円グラフをプロットすることができました。明らかに、これは以前よりも多くのグラフィックス オブジェクトを作成していることを意味します...

同じNaN手法を使用して、単一の PATCH 呼び出しを使用してすべての円から同じスライスをプロットすることもできましたが、円グラフが重なっている場合 (具体的には z オーダーが正しくない) に問題があることが判明しました。

clr = hsv(numClasses);          %# colors for each class
r = min(range(points)) / 10;    %# radius (determined based on points spread)
tt = cumsum(prob,2) .* 2*pi;    %# pie divisions

figure
h = zeros(numPoints,numClasses);    %# handles to patches
for idx=1:numPoints                 %# for each point
    for k=1:numClasses              %# for each class
        %# start/end angle of arc
        if k>1
            t(1) = tt(idx,k-1);
        else
            t(1) = 0;
        end
        t(2) = tt(idx,k);

        %# steps to approximate an arc from t1 to t2
        theta = linspace(t(1), t(2), 50);

        %# slice (line from t2 to center, then to t1, then an arc back to t2)
        x = points(idx,1) + r .* [cos(t(2)) ; 0 ; cos(t(1)) ; cos(theta(:))];
        y = points(idx,2) + r .* [sin(t(2)) ; 0 ; sin(t(1)) ; sin(theta(:))];
        h(idx,k) = patch('XData',x, 'YData',y, ...
            'FaceColor',clr(k,:), 'EdgeColor','k');

        %# show percentage labels
        ind = fix(numel(theta)./2) + 3;     %# middle of the arc
        text(x(ind), y(ind), sprintf('%.2f%%', prob(idx,k)*100), ...
            'Color','k', 'FontSize',6, ...
            'VerticalAlign','middle', 'HorizontalAlign','left');
    end
end
axis equal

labels = cellstr( num2str((1:numClasses)', 'Cluster %d') );
legend(h(1,:), labels)

スクリーンショット2

パーセンテージ ラベルが多すぎる場合は、上記のTEXT呼び出しを削除するだけです。

于 2012-06-17T22:58:31.833 に答える
4

The Bubble Pie by Abraham Anderson on Matlab File Exchange は、あなたが説明しているものに関連しているようです。

ここに画像の説明を入力

于 2012-06-17T19:02:35.937 に答える