Подтвердить что ты не робот

В Matlab, как мне изменить стиль стрелочной головки на участке колчана?

Я хочу изменить стиль заголовка стрелки по умолчанию в квадрате колчана. Как я могу его изменить?

4b9b3361

Ответ 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, который зависит от длины.

Следующее изображение

enter image description here

получается

%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');

Ответ 2

Файл refresh.m, расположенный в папке ...\MATLAB\...\toolbox\matlab\specgraph\@specgraph\@quivergroup\@quivergroup, содержит следующие строки:

%// Arrow head parameters
alpha = .33;  %// Size of arrow head relative to the length of the vector
beta = .25;  %// Width of the base of the arrow head relative to the length

Изменение значений alpha и beta достигает желаемого эффекта.

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


Результаты, используя пример кода, который появляется в quiver help:

[x,y] = meshgrid(-2:.2:2,-1:.15:1);
z = x .* exp(-x.^2 - y.^2); [px,py] = gradient(z,.2,.15);
quiver(x,y,px,py), hold off, axis image
  • С исходными параметрами (alpha = .33; beta = .25;):

    enter image description here

  • С alpha = .5; beta = .5;:

    enter image description here

Ответ 3

Вы можете начать здесь:

http://www.mathworks.com/help/matlab/ref/quiver.html

а затем вы можете найти доступные свойства колчана:

http://www.mathworks.com/help/matlab/ref/quivergroupproperties.html

Например, свойство MaxHeadSize позволяет изменять размер стрелок.

EDIT: Дополнительная информация по этой ссылке: Свойства стрелки

Прочитайте снизу, где говорится

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

Ответ 4

Этот ответ pablo1977 был для меня самым поучительным. Мне удалось получить большие головки стрелок, отрегулировав свойства группы колчанов, а именно этими двумя строками кода:

h = quiver(...);
set(h,'MaxHeadSize',1e2,'AutoScaleFactor',1);

Ответ 5

Я использовал вашу первую аннотацию с черными стрелками и использовал ее с моими дифференциальными уравнениями, но теперь стрелки не соответствуют наклону стрелки. Стрелы

Вы знаете, почему это происходит и как я могу это исправить?