Matlab図の半透明マーカー
-
28-10-2019 - |
質問
散布図を塗りつぶされたマーカーでプロットして半透明にしたいので、2つ以上のマーカーが重複すると、重複領域がより不透明になります。
私は素朴に考えました
sg = scatter(rand(1000,1),rand(1000,1), 'filled');
alpha(0.5)
動作しますが、そうではありません。また
set(get(sg, 'Children'), 'FaceAlpha', 0.2)
うまくいきません。何か案は?
他のヒント
パッチオブジェクトを使用して透明な散布図ポイントを作成するサンプル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
実際にパッチを使用せずにこれを進めることができます。以下の例では、Hidden MarkerHandleを使用して透明性にアクセスできます。あなたが提供する必要があるのは、あなたが望む色のRGBコードと同じスケールでの透明度レベルだけです。以下の例は、設定により10%の不透明度で透明な赤のランダムマーカーをプロットしています FaceColorData
に 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
編集:マトラブは、サイズを変更したり、保存したりするときに警告なしにこれらのプロパティを変更するようです。
に基づく http://undocumentedmatlab.com/blog/plot-markers-transparency-and-color-gradient
これは、半透明の散布を作成するために使用した関数です。
*これは変更されたバージョンです 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
以前のバージョンについてはわかりませんが、Matlab 2016にはあなたが探している機能があるようです。
sg = scatter(rand(1000,1)、rand(1000,1)、 'fell');
sg.markerfacealpha = 0.1;
上記のコードは素晴らしい機能(まだ2014b以前の私たちにとって)ですが、「Dataspectratio」への呼び出しとパッチサイズの調整により、円が円のように見えることを確認することで改善できます。
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