Найти комбинации с помощью excel - (довольно легко). (Ваш компьютер не должен быть слишком медленным)
надеюсь, что это поможет.
В старой графической системе (R2014a и ранее) это невозможно с помощью встроенного объекта quiver
. Вы можете легко получить все объекты сюжета, которые используются для составления графика quiver
q = quiver(1:5, 1:5, 1:5, 1:5);
handles = findall(q, 'type', 'line');
. Но все хвосты представлены одним сюжетным объектом, а головки стрелок представлены другим. Таким образом, вы не можете индивидуально изменить цвет каждой головки / хвоста .
set(handles(1), 'Color', 'r')
set(handles(2), 'Color', 'g')
Однако, с введением HG2 (R2014b и более поздних) вы можете фактически получить доступ к двум (недокументированным) LineStrip
объектам (matlab.graphics.primitive.world.LineStrip
) (один представляет головы, а один представляет хвосты). Они доступны через скрытые свойства Tail
и Head
.
q = quiver(1, 1, 1, 1);
headLineStrip = q.Head;
tailLineStrip = q.Tail;
Затем вы можете изменить цветовые свойства этих объектов, чтобы каждая стрелка отличалась цветом.
Для этого я сначала вычисляю величину всех стрелок колчана (это работает как для quiver
, так и для quiver3
)
mags = sqrt(sum(cat(2, q.UData(:), q.VData(:), ...
reshape(q.WData, numel(q.UData), [])).^2, 2));
Затем я использую текущую цветовую карту для сопоставления каждой величины с значением RGB. Коротким стрелкам присваивается самый низкий цвет в цветовой палитре, а самой длинной стрелке присваивается самый высокий цвет в цветовой палитре. histcounts
отлично подходит для присвоения каждой величины индекса, который может быть передан ind2rgb
вместе с самой цветовой палитрой. Мы должны умножить на 255, потому что нам нужен цвет RGB как 8-разрядное целое.
% Get the current colormap
currentColormap = colormap(gca);
% Now determine the color to make each arrow using a colormap
[~, ~, ind] = histcounts(mags, size(currentColormap, 1));
% Now map this to a colormap
cmap = uint8(ind2rgb(ind(:), currentColormap) * 255);
Свойство LineStrip
ColorData
(когда указано как truecolor
) также необходимо имеют альфа-канал (который мы укажем на 255, что означает непрозрачность).
cmap(:,:,4) = 255;
В этот момент мы можем затем установить свойство ColorBinding
на interpolated
, а не object
(чтобы отделить его из объекта quiver
) и установите для свойства ColorData
как q.Head
, так и q.Tail
цвета, которые мы создали выше, указав каждую стрелку на собственный цвет.
ПРИМЕЧАНИЕ. Это решение работает для как quiver
, так и quiver3
, и код вообще не требуется.
%// Create a quiver3 as we normally would (could also be 2D quiver)
x = 1:10;
y = 1:10;
[X,Y] = meshgrid(x, y);
Z = zeros(size(X));
U = zeros(size(X));
V = zeros(size(X));
W = sqrt(X.^2 + Y.^2);
q = quiver3(X, Y, Z, U, V, W);
%// Compute the magnitude of the vectors
mags = sqrt(sum(cat(2, q.UData(:), q.VData(:), ...
reshape(q.WData, numel(q.UData), [])).^2, 2));
%// Get the current colormap
currentColormap = colormap(gca);
%// Now determine the color to make each arrow using a colormap
[~, ~, ind] = histcounts(mags, size(currentColormap, 1));
%// Now map this to a colormap to get RGB
cmap = uint8(ind2rgb(ind(:), currentColormap) * 255);
cmap(:,:,4) = 255;
cmap = permute(repmat(cmap, [1 3 1]), [2 1 3]);
%// We repeat each color 3 times (using 1:3 below) because each arrow has 3 vertices
set(q.Head, ...
'ColorBinding', 'interpolated', ...
'ColorData', reshape(cmap(1:3,:,:), [], 4).'); %'
%// We repeat each color 2 times (using 1:2 below) because each tail has 2 vertices
set(q.Tail, ...
'ColorBinding', 'interpolated', ...
'ColorData', reshape(cmap(1:2,:,:), [], 4).');
И применяется к объекту 2D quiver
Если вы не обязательно хотите масштабировать стрелки для всего диапазона цветовой карты вы можете использовать следующий вызов histcounts
(вместо строки выше) для сопоставления величин с использованием границ цвета осей.
clims = num2cell(get(gca, 'clim'));
[~, ~, ind] = histcounts(mags, linspace(clims{:}, size(currentColormap, 1)));
Если вы используете версию post r2014b, вы можете использовать недокументированные функции, чтобы изменить цвет каждой строки и главы:
figure
[x,y] = meshgrid(-2:.5:2,-1:.5:1);
z = x .* exp(-x.^2 - y.^2);
[u,v,w] = surfnorm(x,y,z);
h=quiver3(x,y,z,u,v,w);
s = size(x);
nPoints = s(1)*s(2);
% create a colour map
cmap = parula(nPoints);
% x2 because each point has 2 points, a start and an end.
cd = uint8(repmat([255 0 0 255]', 1, nPoints*2));
count = 0;
% we need to assign a colour per point
for ii=1:nPoints
% and we need to assign a colour to the start and end of the
% line.
for jj=1:2
count = count + 1;
cd(1:3,count) = uint8(255*cmap(ii,:)');
end
end
% set the colour binding method and the colour data of the tail
set(h.Tail, 'ColorBinding','interpolated', 'ColorData',cd)
% create a color matrix for the heads
cd = uint8(repmat([255 0 0 255]', 1, nPoints*3));
count = 0;
% we need to assign a colour per point
for ii=1:nPoints
% and we need to assign a colour to the all the points
% at the head of the arrow
for jj=1:3
count = count + 1;
cd(1:3,count) = uint8(255*cmap(ii,:)');
end
end
% set the colour binding method and the colour data of the head
set(h.Head, 'ColorBinding','interpolated', 'ColorData',cd)
Примечание: я не сделал ничего умного с величиной и просто изменил цвет каждого колчана, основанный на порядке в исходной матрице, но вы должны иметь возможность получить представление о том, как использовать эту «функцию»