Полупрозрачные маркеры в фигурах 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