varias una titulo superponer sirve que punto para marcar graficas graficar grafica funciones comandos comando matlab plot annotations figure

una - superponer graficas en matlab



Cómo trazar una flecha en una figura en Matlab? (8)

Acabo de descubrir este método, ya que no quiero tener que molestarme con las unidades normalizadas. Usa el intérprete de látex:

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]'')

Para hacer que la flecha sea más larga, usa un formato de letra más grande.

Pros

  • Más fácil, más rápido y más rápido que usar unidades normalizadas
  • No es necesario instalar ninguna función (buena para nosotros, gente perezosa ...)
  • haciendo uso del intérprete LaTeX, hay un rango completo de flechas (arriba, abajo, izquierda, derecha y otros ángulos (ver lista de símbolos )

Contras

  • Definitivamente necesita prueba / error / ajuste para obtener la ubicación correcta de la punta de la flecha en relación con el PDI.
  • Existe un control limitado sobre la longitud de la flecha
  • Algunos comandos de látex no son entendidos por el intérprete (boo).

Sé que hay una función llamada anotación que puede trazar flechas o flechas dobles. Pero la anotación solo puede trazar en una unidad normalizada. Por ejemplo:

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

Aquí, [x1, x2] debería ser un número de relación menor que uno.

Entonces, mi pregunta es ¿cómo puedo trazar flechas con un valor verdadero en lugar de un valor normalizado?

Me pregunto si hay alguna otra función que pueda abordar esto o si hay alguna función. Puedo obtener el valor del eje de la figura para poder ajustar el valor verdadero en un valor normalizado.


Aunque la annotation utiliza unidades normalized como predeterminadas, puede asociar estos objetos a los ejes actuales ( gca ) y usar unidades de datos para establecer las propiedades X e Y

Aquí hay un ejemplo de trazado de una flecha simple.

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;


Después de crear el objeto de anotación, debe establecer la propiedad Unidades en una absoluta. Ejemplo:

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


Para cualquiera que se encuentre con este tema buscando dibujar flechas en "espacio de datos" en lugar de unidades en relación con la figura y / o los ejes, recomiendo arrow.m desde el intercambio de archivos.


Para el posicionamiento de anotaciones, Matlab ofrece la función dsxy2figxy para convertir puntos de espacio de datos a coordenadas de espacio normalizadas. Sin embargo, por cualquier razón, la función no está incluida en la distribución de Matlab y debe ser "creada" primero.

Copie la siguiente línea en la ventana de comandos y ejecútela para abrir la función en su editor.

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

Para usar la función dsxy2figxy en algún lugar de su ruta de búsqueda de matlab.

Encuentre las instrucciones completas para la función dsxy2figxy en matlab-central: http://www.mathworks.de/help/techdoc/creating_plots/bquk5ia-1.html


Puede usar el componente ''flecha'' en la caja de herramientas de DaVinci Draw (bien documentada) (divulgación completa: escribí / vendí la caja de herramientas, aunque las flechas son gratuitas).

Ejemplo de sintaxis y salida de ejemplo a continuación.

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


Si recuerdo correctamente, necesitas calcular la posición de los ejes en relación con la figura.

debería ir así:

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

Nota Corrección fija en el cálculo original: ap (3), ap (4) son ancho y alto de gca, no posiciones de esquina


Un enfoque sería definir una punta de flecha en las unidades del eje:

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

Luego, en el índice de punta de flecha deseado en una curva vv, calcule

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).

Funcionó para mí, para mis circunstancias particulares.