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

Как построить стрелку с координатами данных в Matlab?

Я знаю, что функция с именем аннотация может содержать стрелки или двойные стрелки. Но аннотация может отображаться только в нормализованной единице. Например:

annotation('arrows',[x1 x2],[y1 y2])

Здесь [x1, x2] должно быть числом отношений меньше единицы.

Итак, мой вопрос заключается в том, как я могу нарисовать стрелки с истинным значением, а не нормализованным значением?

Интересно, может ли какая-либо другая функция подходить к этому или есть какая-либо функция, я могу получить значение оси фигуры, чтобы я мог настроить истинное значение в нормализованное значение.

4b9b3361

Ответ 1

Я только что открыл этот метод, так как я не хочу беспокоиться о нормализованных единицах. Используйте интерпретатор латекса:

figure
plot([1:5],[1:5]*3,'.-')
%// Say I want to put an arrow pointing to the location, [3 9]    
text(2.94,8.3,'\uparrow','fontsize',20)
text(2.8,7.8,'point [3,9]')

Чтобы увеличить длину стрелки, используйте более крупный шрифт.

Pros

  • Легче, быстрее и быстрее, чем использование нормализованных единиц.
  • Не нужно устанавливать какие-либо функции (хорошо для нас, ленивых людей..)
  • Используя интерпретатор LaTeX, существует целый ряд стрелок (вверх, вниз, влево, вправо и другие углы (см. Список символов)

против

  • Определенно нужна пробная версия и ошибка/настройка, чтобы получить правильное расположение головки стрелки относительно POI.
  • Ограниченный контроль над длиной стрелки
  • Некоторые латексные команды не интерпретируются интерпретатором (boo).

Ответ 2

Для позиционирования аннотаций Matlab предлагает функцию dsxy2figxy для преобразования точек пространства данных в нормализованные пространственные координаты. Однако по каким-либо причинам функция не включена в дистрибутив Matlab и должна быть сначала создана.

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

edit(fullfile(docroot,'techdoc','creating_plots','examples','dsxy2figxy.m'))

Чтобы использовать функцию dsxy2figxy, сохраните ее где-нибудь в пути поиска по методу matlab.

Пожалуйста, найдите полные инструкции для функции dsxy2figxy в matlab-central: http://www.mathworks.de/help/techdoc/creating_plots/bquk5ia-1.html

Ответ 3

Даже если annotation использует normalized как единицы по умолчанию, вы можете связать эти объекты с текущими осями (gca) и использовать единицы данных для установки свойств X и Y.

Вот пример построения одной стрелки.

plot(1:10);
ha = annotation('arrow');  % store the arrow information in ha
ha.Parent = gca;           % associate the arrow the the current axes
ha.X = [5.5 5.5];          % the location in data units
ha.Y = [2 8];   

ha.LineWidth  = 3;          % make the arrow bolder for the picture
ha.HeadWidth  = 30;
ha.HeadLength = 30;

введите описание изображения здесь

Ответ 4

Для тех, кто сталкивается с этой темой, стремящейся рисовать стрелки в "пространстве данных", а не в единицах относительно фигуры и/или осей, я настоятельно рекомендую arrow.m из обмена файлами.

Ответ 5

Если я правильно помню, вам нужно рассчитать положение осей относительно фигуры.

он должен выглядеть так:

%% example plot
clf
plot(rand(5,2)*5)
%% get info specific to the axes you plan to plot into
set(gcf,'Units','normalized')
set(gca,'Units','normalized')
ax = axis;
ap = get(gca,'Position')
%% annotation from 1,2 to 3,4
xo = [1,3];
yo = [2,4];
xp = (xo-ax(1))/(ax(2)-ax(1))*ap(3)+ap(1);
yp = (yo-ax(3))/(ax(4)-ax(3))*ap(4)+ap(2);
ah=annotation('arrow',xp,yp,'Color','r');

Примечание Фиксированное смещение в исходном расчете - ap (3), ap (4) - ширина и высота gca, а не угловые положения

Ответ 6

После создания объекта аннотации вы должны установить абсолютные единицы единиц. Пример:

arrowObj = annotation('arrow', [0.1 0.1], [0.5 0.5]);
set(arrowObj, 'Units', 'centimeters');
set(arrowObj, 'Position', [1 1 3 5]);

Ответ 7

Один подход заключался бы в определении стрелки в единицах оси:

Ax=[0 -0.003 0.003 0];       % (Ax,Ay) form an upward pointing arrowhead.
Ay=[0.01 0.0060 0.0060 0.01];
Ax=Ax-mean(Ax);  % center it on zero
Ay=Ay-mean(Ay);

Затем при желаемом указателе стрелки на кривой vv вычислите

x1=vv(in,1); y1=vv(in,2);
x2=vv(in+1,1); y2=vv(in+1,2);
u=x2-x1;
v=y2-y1;
th=-pi/2+atan2(v,u);
R=[cos(th) -sin(th); sin(th) cos(th)];   % Rotation matrix for local slope of vv.
A=R*[Ax;Ay];    % Rotate the arrowhead.
patch(x1+A(1,:),y1+A(2,:),'r','LineWidth',0.01)   % plot rotated arrowhead at (x1,y1).
plot(x1+A(1,:),y1+A(2,:),'r','LineWidth',0.01)    % Kludge to make boundary red too (I'm sure there is a more elegant way).

Работал для меня, для моих конкретных обстоятельств.

Ответ 8

Вы можете использовать компонент "стрелка" в (хорошо документированном) DaVinci Draw toolbox (полное раскрытие: я написал/продал toolbox, хотя стрелки свободны).

Ниже приведен пример синтаксиса и примера.

davinci( 'arrow', 'X', [0 10], 'Y', [0 2], <plus-lots-of-options> )

введите описание изображения здесь