我想绘制带有填充标记的散点图并使其半透明,这样当两个或多个标记重叠时,重叠区域将更加不透明。
我天真地想着sg = scatter(rand(1000,1),rand(1000,1), 'filled');
alpha(0.5)
会起作用,但事实并非如此。还
set(get(sg, 'Children'), 'FaceAlpha', 0.2)
不起作用。有什么想法吗?
答案 0 :(得分: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
答案 1 :(得分:5)
AFAIK,您无法在scatter
中更改绘图标记的Alpha值。一个解决方案是patch
自己绘制标记。可以为patch()
个对象设置Alpha值,当标记重叠时,您将获得所需的效果。但是,这可能非常麻烦,需要根据您的需求进行定制。
参见this related question,其中问题中定义的函数就是这样做的。您可以将其作为起点并从那里开始工作。
答案 2 :(得分:4)
你可以在不使用补丁的情况下实现这一目标。下面的示例使用隐藏的MarkerHandle来访问透明度。您需要提供的只是所需颜色的rgb代码和相同比例的透明度级别。以下示例通过将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
编辑:当您调整大小,保存......或者显然只是看起来很有趣时,MATLAB似乎会在没有警告的情况下更改这些属性。
基于http://undocumentedmatlab.com/blog/plot-markers-transparency-and-color-gradient
答案 3 :(得分: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
答案 4 :(得分:1)
我不确定以前的版本,但是 Matlab 2016似乎有你想要的功能:
sg = scatter(rand(1000,1),rand(1000,1),'filled');
sg.MarkerFaceAlpha = 0.1;
答案 5 :(得分: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