Saltar al contenido

En Matlab, ¿cómo cambio el estilo de la punta de flecha en el gráfico de aljaba?

Nuestro team de trabajo ha estado horas investigando para dar resolución a tus preguntas, te dejamos la resolución y nuestro objetivo es resultarte de gran apoyo.

Solución:

Para la versión Matlab > R2014b

Desde la versión R2014b, Matlab ha modificado la estructura de sus componentes gráficos. Aquí está el código actualizado que usa Matlab anotaciones.

ingrese la descripción de la imagen aquí

es producido por

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

Tenga en cuenta que este fragmento de código cambia el estilo del encabezado y controla la longitud de la línea (en el panel izquierdo, puede ver que las flechas se superponen en la parte superior izquierda de la subparcela izquierda, mientras que no en la subparcela derecha). ). La longitud y el ancho de las puntas de flecha no se modifican.

Para esta edición, no mantuve el esquema de colores que codificaba para el ángulo y descarté el tamaño dinámico de la cabeza. Hace las cosas más claras.


Para la versión de Matlab

Los diagramas de carcaj son difíciles de modificar. Como dijo @Luis Mendo, puede modificar la función quiver dentro de la instalación de matlab. Sin embargo, aún estará limitado por la complejidad de dibujar flechas mediante programación con parches/líneas agradables. Puede haber una ruta más fácil usando annotation – ver la trama secundaria “Carcaj – anotación” que establece el headStyle propiedad a cback1.

Las anotaciones son objetos gráficos (líneas, cuadros de texto, flechas, …) que se pueden insertar fácilmente a mano una vez que se realiza un gráfico. Muestran texto adicional o apuntan a un área en particular, por ejemplo. También puede insertarlos programáticamente definiendo sus posiciones, y esa es la opción que tomaremos. Primero dibujamos un regular quiver gráfico (panel izquierdo), obtenga las líneas azules’ X y Y y use estas coordenadas para insertar flechas de anotación, cada una de ellas mostrándose exactamente en la misma ubicación (misma posición, mismo ángulo, mismo tamaño; panel derecho).

Las flechas de anotación tienen algunas propiedades agradables que puede modificar fácilmente, como Color, HeadWidth, HeadLengthy HeadStyle. En el siguiente gráfico, modifiqué el color de cada flecha según su ángulo con respecto al eje x, y headWidth eso depende de la longitud.

la siguiente imagen

ingrese la descripción de la imagen aquí

es producido por

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

El archivo refresh.m ubicado en la carpeta ...MATLAB...toolboxmatlabspecgraph@specgraph@quivergroup@quivergroup contiene las siguientes lineas:

%// 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

Cambiando los valores de alpha y beta logra el efecto deseado.

Sin embargo, esto implica modificar los archivos de Matlab y, por lo tanto, no se recomienda. Si lo hace, conserve una copia del original. refresh.m expediente.


Resultados utilizando el código de ejemplo que aparece en quiverla ayuda de:

[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
  • Con parámetros originales (alpha = .33;beta = .25;):

    ingrese la descripción de la imagen aquí

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

    ingrese la descripción de la imagen aquí

Puedes empezar aquí:

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

y luego puede buscar las propiedades disponibles de quiver aquí:

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

Por ejemplo, la propiedad MaxHeadSize permite cambiar el tamaño de las puntas de flecha.

EDITAR: Más información en este enlace: Propiedades de flecha

Lea al final, donde dice

Puede seleccionar una anotación y luego elegir Mostrar código M para obtener un fragmento de código que puede insertar en una función o secuencia de comandos para reproducir la anotación.

Si guardas algún pregunta o capacidad de aumentar nuestro post puedes realizar una interpretación y con placer lo ojearemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *