Полупрозрачные маркеры в Matlab Figures - PullRequest
10 голосов
/ 16 июня 2011

Я хочу построить график рассеяния с заполненными маркерами и сделать их полупрозрачными, чтобы при перекрытии двух или более маркеров область перекрытия была более непрозрачной.

Я наивно думал,

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

будет работать, но это не так.Также

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

не работает.Есть идеи?

Ответы [ 6 ]

10 голосов
/ 08 марта 2013

Вот пример кода 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
5 голосов
/ 16 июня 2011

AFAIK, вы не можете изменить альфа-значения маркеров графика в scatter. Одним из решений было бы patch, чтобы рисовать маркеры самостоятельно. Альфа-значения могут быть установлены для patch() объектов, и вы получите желаемый эффект, когда маркеры перекрываются. Однако это может быть довольно громоздким и должно быть настроено в соответствии с вашими потребностями.

См. этот связанный вопрос , где функция, определенная в вопросе, делает именно это. Вы можете использовать это как отправную точку и работать оттуда.

4 голосов
/ 20 апреля 2015

Вы можете сделать это без использования патча.В приведенном ниже примере используется скрытый 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

РЕДАКТИРОВАТЬ: кажется, что MATLAB изменит эти свойства без предупреждения при изменении размера, сохраните... или, по-видимому, просто смешно.

На основании http://undocumentedmatlab.com/blog/plot-markers-transparency-and-color-gradient

1 голос
/ 01 декабря 2016

Я не уверен насчет предыдущих версий, но в Matlab 2016, похоже, есть функция, которую вы ищете:

sg = scatter (rand (1000,1), rand (1000,1), ')заполнено ');

sg.MarkerFaceAlpha = 0,1;

1 голос
/ 05 января 2014

Вот функция, которую я использовал для создания полупрозрачного рассеяния.

* Это модифицированная версия 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
0 голосов
/ 22 июня 2016

Приведенный выше код - приятная маленькая функция (для тех, кто еще до 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
...