Полупрозрачные маркеры в фигурах Matlab

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

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

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

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

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

не работает. Любые идеи?

Ответ 1

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

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

Ответ 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

Ответ 3

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

EDIT: Кажется, что MATLAB изменит эти свойства без предупреждения, когда вы измените размер, сохраните... или, по-видимому, просто посмотрите на это смешно.

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

Ответ 4

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

* Это измененная версия user2149589 answer (немного более подходящая для 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

Ответ 5

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

sg = разброс (rand (1000,1), rand (1000,1), "заполненный" );

sg.MarkerFaceAlpha = 0,1;

Ответ 6

Приведенный выше код представляет собой небольшую небольшую функцию (для тех из нас, кто до 2014 года), но может быть улучшен с помощью вызова "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