10

塗りつぶされたマーカーを使用して散布図をプロットし、それらを半透明にして、2つ以上のマーカーが重なると、重なる領域がより不透明になるようにします。

素朴に思った

sg = scatter(rand(1000,1),rand(1000,1), 'filled');
alpha(0.5)

動作しますが、動作しません。また

set(get(sg, 'Children'), 'FaceAlpha', 0.2)

動作しません。何か案は?

4

6 に答える 6

10

パッチオブジェクトを使用して透明な散布図ポイントを作成するMATLABコードのサンプルを次に示します。

x=randn(5000,1)*20;
y= randn(5000,1)*20;
t= 0:pi/10:2*pi;
figure();
for i=1:size(x)
    pb=patch((sin(t)+ x(i)),(cos(t)+y(i)),'b','edgecolor','none');
    alpha(pb,.1);
end
于 2013-03-08T18:49:36.407 に答える
5

AFAIK、のプロットマーカーのアルファ値を変更することはできませんscatter。1つの解決策は、patch自分でマーカーを描くことです。オブジェクトにアルファ値を設定できpatch()、マーカーが重なると目的の効果が得られます。ただし、これは非常に面倒になる可能性があり、ニーズに合わせてカスタマイズする必要があります。

この関連する質問を参照してください。質問で定義された関数がまさにそれを実行します。それを出発点として使用し、そこから作業することができます。

于 2011-06-16T03:02:21.827 に答える
4

実際には、パッチを使用せずにこれを実行できます。以下の例では、非表示のMarkerHandleを使用して、透明度にアクセスできるようにしています。提供する必要があるのは、必要な色のrgbコードと同じスケールの透明度レベルだけです。FaceColorData次の例では、に設定することにより、不透明度が10%の透明な赤でランダムマーカーをプロットします。uint8(255*[1;0;0;0.1])

sg = scatter(rand(1000,1),rand(1000,1), 'filled');
sMarkers=sg.MarkerHandle; %hidden marker handle
sMarkers.FaceColorData = uint8(255*[1;0;0;0.1]); %fourth element allows setting alpha
sMarkers.EdgeColorData = uint8(255*[1;0;0;0]); %set edge color in a similar way

編集:MATLABは、サイズを変更したり、保存したりするときに、警告なしにこれらのプロパティを変更するようです。

http://undocumentedmatlab.com/blog/plot-markers-transparency-and-color-gradientに基づく

于 2015-04-20T14:53:55.213 に答える
3

以前のバージョンについてはよくわかりませんが、Matlab2016にはお探しの機能があるようです。

sg = scatter(rand(1000,1)、rand(1000,1)、'filled');

sg.MarkerFaceAlpha = 0.1;

于 2016-12-01T14:13:41.133 に答える
1

これは、半透明のスキャッターを作成するために使用した関数です。

*これはuser2149589回答の修正バージョンです(もう少しmatlabに適しています)。

function scatterPoints = transparentScatter(x,y,sizeOfCirlce,opacity)
% usage example:
% scatterPoints = transparentScatter(randn(5000,1),randn(5000,1),0.1,0.05);
% set(scatterPoints,'FaceColor',[1,0,0]);


    defaultColors = get(0,'DefaultAxesColorOrder');
    assert(size(x,2)  == 1 && size(y,2)  == 1 , 'x and y should be column vectors');
    t= 0:pi/10:2*pi;

    rep_x = repmat(x',[size(t,2),1]);
    rep_y = repmat(y',[size(t,2),1]);
    rep_t = repmat(t',[ 1, size(x,1)]);

    scatterPoints = patch((sizeOfCirlce*sin(rep_t)+ rep_x),(sizeOfCirlce*cos(rep_t)+rep_y),defaultColors(1,:),'edgecolor','none');
    alpha(scatterPoints,opacity);

end
于 2014-01-05T15:20:13.057 に答える
0

上記のコードは(2014bより前の私たちにとっては)ちょっとした関数ですが、「DataAspectRatio」を呼び出してパッチサイズを調整し、円が円のように見えるようにすることで改善できます。

function scatterPoints = transparentScatter(x,y,sizeOfCirlce,opacity)
% usage example:
% scatterPoints = transparentScatter(randn(5000,1),randn(5000,1),0.1,0.05);
% set(scatterPoints,'FaceColor',[1,0,0]);

    dRatio = get(gca,'DataAspectRatio');
    dRatio = dRatio(1) / dRatio(2);
    defaultColors = get(0,'DefaultAxesColorOrder');
    assert(size(x,2)  == 1 && size(y,2)  == 1 , 'x and y should be column vectors');
    t= 0:pi/10:2*pi;

    rep_x = repmat(x',[size(t,2),1]);
    rep_y = repmat(y',[size(t,2),1]);
    rep_t = repmat(t',[ 1, size(x,1)]);

    scatterPoints = patch((dRatio*sizeOfCirlce*sin(rep_t)+ rep_x),(sizeOfCirlce*cos(rep_t)+rep_y),defaultColors(1,:),'edgecolor','none');
    alpha(scatterPoints,opacity);

end
于 2016-06-22T15:36:55.930 に答える