Ответ 1
Для версии Matlab > R2014b
Начиная с версии R2014b, Matlab изменил структуру своих графических компонентов. Вот обновленный код, который использует аннотации Matlab.
получается
headWidth = 8;
headLength = 8;
LineLength = 0.08;
%some data
[x,y] = meshgrid(0:0.2:2,0:0.2:2);
u = cos(x).*y;
v = sin(x).*y;
%quiver plots
figure('Position',[10 10 1000 600],'Color','w');
hax_1 = subplot(1,2,1);
hq = quiver(x,y,u,v); %get the handle of quiver
title('Regular Quiver plot','FontSize',16);
%get the data from regular quiver
U = hq.UData;
V = hq.VData;
X = hq.XData;
Y = hq.YData;
%right version (with annotation)
hax_2 = subplot(1,2,2);
%hold on;
for ii = 1:length(X)
for ij = 1:length(X)
headWidth = 5;
ah = annotation('arrow',...
'headStyle','cback1','HeadLength',headLength,'HeadWidth',headWidth);
set(ah,'parent',gca);
set(ah,'position',[X(ii,ij) Y(ii,ij) LineLength*U(ii,ij) LineLength*V(ii,ij)]);
end
end
%axis off;
title('Quiver - annotations ','FontSize',16);
linkaxes([hax_1 hax_2],'xy');
Обратите внимание, что этот фрагмент кода изменяет стиль головы и элементы управления длиной линии (на левой панели вы можете видеть, что стрелки перекрываются в верхней левой части левого подзаголовка, в то время как она не включена правый подзаговор). Длина и ширина стрелочных головок не изменяются.
Для этого редактирования я не сохранил схему цветов, закодированную для угла, и отменил размер динамической головки. Это делает вещи более ясными.
Для версии Matlab < R2014b
Творцы дрожаний трудно модифицировать. Как сказал @Luis Mendo, вы можете изменить функцию колчана в установке matlab. Тем не менее, вы все равно будете ограничены сложностью программного рисования стрелок с красивыми патчами/строками. Простейший маршрут может быть с использованием annotation
- см. Подзапись "Quiver - annotation", которая устанавливает свойство headStyle
в cback1
.
Аннотации - это графические объекты (строки, текстовые поля, стрелки,...), которые можно легко вставить вручную, как только будет выполнен график, Например, они отображают дополнительный текст или указывают на конкретную область. Вы также можете вставить их программно, указав свои позиции - и этот вариант мы возьмем. Сначала мы нарисуем обычный график quiver
(левая панель), получим синие линии "X
и Y
данных и используем эти координаты для вставки стрелок аннотации, каждый из которых отображается в одном и том же месте (то же положение, тот же угол, тот же размер, правая панель).
У стрелок аннотации есть некоторые приятные свойства, которые вы можете легко изменить, например Color
, HeadWidth
, HeadLength
и headStyle
. На следующем рисунке я изменил каждый цвет стрелки в зависимости от его угла относительно оси x и HeadWidth
, который зависит от длины.
Следующее изображение
получается
%some data
[x,y] = meshgrid(0:0.2:2,0:0.2:2);
u = cos(x).*y;
v = sin(x).*y;
%quiver plots
figure('Position',[10 10 1000 600],'Color','w');
hax_1 = subplot(1,2,1);
%left version (regular)
hq1 = quiver(x,y,u,v);
%get the line position (first handle)
hkid = get(hq1,'children');
X = get(hkid(1),'XData');
Y = get(hkid(1),'YData');
axis off;
title('Quiver - regular ','FontSize',16);
%right version (with annotation)
hax_2 = subplot(1,2,2);
cmap = jet(116); %colormap, 116 because angles goes up to 115 degrees
for ii = 1:3:length(X)-1
headWidth = 200 * sqrt((X(ii+1)-X(ii)).^2 + (Y(ii+1)-Y(ii)).^2); % set the headWidth, function of length of arrow
angled = floor(atan2(Y(ii+1)-Y(ii),X(ii+1)-X(ii))*180/pi) + 1; %get the angle
ah = annotation('arrow',...
'Color', cmap(angled,:),...
'headStyle','cback1','HeadLength',50,'HeadWidth',headWidth);
set(ah,'parent',gca);
set(ah,'position',[X(ii) Y(ii) X(ii+1)-X(ii) Y(ii+1)-Y(ii)]);
end
axis off;
title('Quiver - annotations ','FontSize',16);
linkaxes([hax_1 hax_2],'xy');