web-dev-qa-db-fra.com

Dans Matlab, comment changer le style de la tête de flèche dans l'intrigue de quiver

Je voudrais changer le style de tête de flèche par défaut dans Quiver plot. Comment puis-je le changer?

14

Pour la version Matlab> R2014b 

Depuis la version R2014b, Matlab a modifié la structure de ses composants graphiques. Voici le code à jour qui utilise le annotations de Matlab. 

 enter image description here

est produit par

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

Veuillez noter que ce morceau de code modifie le style de la tête et les commandes de longueur du trait (dans le panneau de gauche, vous pouvez voir que les flèches se chevauchent sur la partie supérieure gauche de la sous-parcelle gauche, alors qu'elle ne le fait pas sur la sous-parcelle droite. ). La longueur et la largeur des flèches ne sont pas modifiées.

Pour cette édition, je n'ai pas conservé le jeu de couleurs codé pour l'angle et jeté la taille de la tête dynamique. Cela rend les choses plus claires.


Pour la version Matlab <R2014b 

Les parcelles de carquois sont difficiles à modifier. Comme @Luis Mendo l'a dit, vous pouvez modifier la fonction quiver dans l'installation de matlab. Cependant, vous serez toujours limité par la complexité du dessin par programme des flèches avec des correctifs/lignes de Nice. Il pourrait y avoir une route plus facile utilisant annotation - voir la sous-intrigue "Quiver - annotation" qui définit la propriété headStyle sur cback1

Les annotations sont des objets graphiques (lignes, zones de texte, flèches, ...) que vous pouvez facilement insérer à la main une fois le tracé terminé. Ils affichent du texte supplémentaire ou pointent vers une zone particulière, par exemple. Vous pouvez également les insérer par programme en définissant leurs positions - et c'est l'option que nous allons choisir. Nous commençons par tracer un tracé quiver régulier (panneau de gauche), obtenir les données X et Y des lignes bleues et utiliser ces coordonnées pour insérer des flèches d'annotation, chacune d'elles étant affichée exactement au même emplacement ; panneau de droite). 

Les flèches d'annotation ont des propriétés intéressantes que vous pouvez facilement modifier, telles que Color, HeadWidth, HeadLength et HeadStyle. Dans le graphique suivant, j'ai modifié la couleur de chaque flèche en fonction de son angle par rapport à l'axe des x et de headWidth à la longueur. 

L'image suivante

enter image description here

est produit par

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

Le fichier refresh.m situé dans le dossier ...\MATLAB\...\toolbox\matlab\specgraph\@specgraph\@quivergroup\@quivergroup contient les lignes suivantes:

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

Changer les valeurs de alpha et beta permet d'obtenir l'effet souhaité.

Cependant, cela implique de modifier les fichiers de Matlab, ce qui n'est donc pas recommandé. Si vous le faites, conservez une copie du fichier refresh.m d'origine.


Résultats utilisant l'exemple de code qui apparaît dans l'aide de quiver:

[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
  • Avec les paramètres d'origine (alpha = .33;beta = .25;):

    enter image description here

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

    enter image description here

7
Luis Mendo

Vous pouvez commencer ici: 

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

et alors vous pouvez rechercher les propriétés disponibles de carquois ici: 

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

Par exemple, la propriété MaxHeadSize permet de changer la taille des flèches. 

EDIT: Plus d'informations sur ce lien: Propriétés de la flèche

Lire en bas, où dit 

Vous pouvez sélectionner une annotation, puis choisir Afficher le code M pour obtenir un extrait de code que vous pouvez insérer dans une fonction ou un script pour reproduire l'annotation.

4
pablo1977

Cette réponse de pablo1977 fut la plus instructive pour moi. J'ai réussi à obtenir de plus grandes pointes de flèche en ajustant les propriétés du groupe de quiver, notamment par ces 2 lignes de code:

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