Matlab 图形中的半透明标记

Posted

技术标签:

【中文标题】Matlab 图形中的半透明标记【英文标题】:Semi-transparent markers in Matlab Figures 【发布时间】:2011-09-16 00:31:08 【问题描述】:

我想绘制一个带有填充标记的散点图并使它们半透明,这样当两个或多个标记重叠时,重叠区域会更加不透明。

我天真地以为

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

会起作用,但不会。还有

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

不起作用。有什么想法吗?

【问题讨论】:

Plot circles with alpha values in matlab的可能重复 也许在提出这个问题时还没有一种直接的方法可以做到这一点,但现在有一种方法。不知道从哪个版本开始。 See this link.. 【参考方案1】:

下面是一些使用补丁对象制作透明散点图的示例 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

【讨论】:

真是个好建议。我想补充一点,如果有人对缩放补丁大小感兴趣,那么只需将乘法应用于 sin() 或 cos() 调用,例如sin(t)/3 会使补丁更小。【参考方案2】:

AFAIK,您无法更改 scatter 中绘图标记的 alpha 值。一种解决方案是到patch 自己绘制标记。可以为patch() 对象设置 Alpha 值,当标记重叠时,您将获得所需的效果。但是,这会变得非常麻烦,需要根据您的需要进行定制。

请参阅this related question,问题中定义的函数正是这样做的。您可以以此为起点,从那里开始工作。

【讨论】:

嗯,这就是我的猜测和恐惧。尽管如此,我还是会暂时搁置这个问题,以确保没有人在附近徘徊。谢谢! 我得出的结论是没有答案(好吧,没有办法设置绘图标记的 alpha 值)并且仍然使用我的 ag_plot_little_circles 函数。【参考方案3】:

您实际上可以在不使用补丁的情况下进行此操作。下面的示例使用隐藏的 MarkerHandle 让您访问透明度。您只需提供所需颜色的 rgb 代码和相同比例的透明度级别。下面的示例通过将FaceColorData 设置为uint8(255*[1;0;0;0.1]),将随机标记绘制为透明红色,不透明度为 10%

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

【讨论】:

仅适用于 Matlab 2014 及更高版本。 请注意有关使用 legend 的警告以及同一篇博文中提供的解决方法。【参考方案4】:

我不确定以前的版本,但是 Matlab 2016 似乎具有您正在寻找的功能:

sg = scatter(rand(1000,1),rand(1000,1), '填充');

sg.MarkerFaceAlpha = 0.1;

【讨论】:

有趣的是,使用 Matlab 2019 的绘图句柄仍然没有这个属性。对于 scatter 虽然你也有 MarkerEdgeAlpha。【参考方案5】:

这是我用来创建半透明散点图的函数。

* 这是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

【讨论】:

【参考方案6】:

上面的代码是一个不错的小函数(对于我们这些仍然在 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

【讨论】:

以上是关于Matlab 图形中的半透明标记的主要内容,如果未能解决你的问题,请参考以下文章

Android中的半透明状态栏

uinavigationbar 中的半透明在 iPhone 5 中有效,但在 4s 中无效

PyGame:具有每像素 alpha 的半透明精灵

iOS中模糊的半透明导航栏

利用 Android 4.4 KitKat 中的半透明状态栏

利用 Android 4.4 KitKat 中的半透明状态栏