scatterplot визуализирует те же точки в matlab
у меня следующая проблема: мне нужно построить диаграмму рассеяния данных. Все хорошо, но там есть некоторые дубликаты данных:
x = [11, 10, 3, 8, 2, 6, 2, 3, 3, 2, 3, 2, 3, 2, 2, 2, 3, 3, 2, 2];
y = [29, 14, 28, 19, 25, 21, 27, 15, 24, 23, 23, 18, 0, 26, 11, 27, 23, 30, 30, 25];
можно видеть, что есть два элемента с (2, 25);
(2,27);
(3,24);
Поэтому, если построить эти данные с помощью regular scatter(x,y)
Я теряю эту информацию:
выход из этого я нашел, чтобы использовать недокументированные 'jitter'
параметр
scatter(x,y, 'jitter','on', 'jitterAmount', 0.06);
но мне не нравится прогноз:
чего я пытался достичь, так это:
где количество дубликатов находится рядом с точкой (если число больше 1) или может находиться внутри точки.
есть идеи, как этого достичь?
1 ответов
вы можете сделать это довольно легко, давайте сократить его на две части:
сначала вам нужно будет определить уникальные 2d-точки и подсчитать их. Вот что у нас есть уникальный и accumarray для. Прочитайте документацию, если вы не сразу понимаете, что они делают и какие результаты у них есть:
x = [11 10 3 8 2 6 2 3 3 2 3 2 3 2 2 2 3 3 2 2];
y = [29 14 28 19 25 21 27 15 24 23 23 18 0 26 11 27 23 30 30 25];
A=[x' y'];
[Auniq,~,IC] = unique(A,'rows');
cnt = accumarray(IC,1);
теперь каждый ряд Auniq
содержит уникальные 2d точки, в то время как cnt
содержит номер возникновение каждой из этих точек:
>> [cnt Auniq]
ans =
1 2 11
1 2 18
1 2 23
2 2 25
1 2 26
...etc
для отображения количества случаев существует множество возможностей. Как вы уже упоминали, вы можете поместить числа внутри / рядом с маркерами разброса, другие опции-цветовая кодировка, размер маркеров... давайте сделаем все это, вы также можете, конечно, объединить!
рядом с маркером
scatter(Auniq(:,1), Auniq(:,2));
for ii=1:numel(cnt)
if cnt(ii)>1
text(Auniq(ii,1)+0.2,Auniq(ii,2),num2str(cnt(ii)), ...
'HorizontalAlignment','left', ...
'VerticalAlignment','middle', ...
'FontSize', 6);
end
end
xlim([1 11]);ylim([0 30]);
номер внутри маркера
scatter(Auniq(:,1), Auniq(:,2), (6+2*(cnt>1)).^2); % make the ones where we'll put a number inside a bit bigger
for ii=1:numel(cnt)
if cnt(ii)>1
text(Auniq(ii,1),Auniq(ii,2),num2str(cnt(ii)), ...
'HorizontalAlignment','center', ...
'VerticalAlignment','middle', ...
'FontSize', 6);
end
end
как вы можете видеть, я увеличил размер маркеров очень просто с помощью самой функции scatter.
цветовая кодировка
scatter(Auniq(:,1), Auniq(:,2), [], cnt);
colormap(jet(max(cnt))); % just for the looks of it
после чего вы можете добавить colorbar или легенда чтобы указать количество случаев на цвет.