Je voudrais changer le style de tête de flèche par défaut dans Quiver plot. Comment puis-je le changer?
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.
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
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');
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;
):
Avec alpha = .5;
beta = .5;
:
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.
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);