it-swarm.com.de

Wie ändere ich in Matlab den Pfeilstil im Köcherplot?

Ich möchte den Standardpfeilstil im Köcherplot ändern. Wie kann ich das ändern?

14

Für Matlab-Version> R2014b 

Seit der Version R2014b hat Matlab die Struktur seiner grafischen Komponenten geändert. Hier ist der aktuelle Code, der Matlabs Anmerkungen verwendet. 

 enter image description here

wird produziert von

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

Beachten Sie, dass dieser Code den Kopfstil und die Steuerelemente für die Länge der Linie ändert (im linken Bereich können Sie sehen, dass sich die Pfeile im linken oberen Teil des linken Untergrundes überlappen, nicht aber im rechten Untergrund.) ). Die Länge und Breite der Pfeilspitzen wird nicht geändert.

Bei dieser Bearbeitung habe ich das Farbschema, das für den Winkel kodiert ist, nicht beibehalten und die dynamische Kopfgröße verworfen. Es macht die Dinge klarer.


Für Matlab-Version <R2014b 

Köcher-Diagramme sind schwer zu ändern. Wie @Luis Mendo sagte, können Sie die Köcherfunktion innerhalb des matlab install ändern. Sie werden jedoch durch die Komplexität des programmgesteuerten Zeichnens von Pfeilen mit Nice-Patches Lines immer noch eingeschränkt. Es gibt möglicherweise eine einfachere Route mit annotation - siehe das Subplot "Quiver - annotation", das die headStyle-Eigenschaft auf cback1 setzt. 

/ - Anmerkungen sind grafische Objekte (Linien, Textfelder, Pfeile, ...), die Sie nach dem Plot einfach von Hand einfügen können. Sie zeigen beispielsweise zusätzlichen Text an oder zeigen auf einen bestimmten Bereich. Sie können sie auch programmgesteuert einfügen, indem Sie ihre Positionen festlegen - und dies ist die Option, die wir ergreifen werden. Zuerst zeichnen wir ein reguläres quiver-Diagramm (linkes Feld), erhalten die blauen Daten der Variablen X und Y und verwenden diese Koordinaten, um Anmerkungspfeile einzufügen, die jeweils an genau derselben Stelle (gleiche Position, gleicher Winkel, gleiche Größe) angezeigt werden ; rechtes Feld). 

Anmerkungspfeile verfügen über einige Nice-Eigenschaften, die Sie leicht ändern können, z. B. Color, HeadWidth, HeadLength und HeadStyle. In der folgenden Abbildung habe ich die Farbe jedes Pfeils in Abhängigkeit von seinem Winkel zur x-Achse geändert, und headWidth hängt von der Länge ab. 

Folgendes Bild

enter image description here

wird produziert von

%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

Die Datei refresh.m im Ordner ...\MATLAB\...\toolbox\matlab\specgraph\@specgraph\@quivergroup\@quivergroup enthält folgende Zeilen:

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

Durch Ändern der Werte von alpha und beta wird der gewünschte Effekt erzielt.

Dies erfordert jedoch das Ändern der Matlab-Dateien und wird daher nicht empfohlen. Behalten Sie in diesem Fall eine Kopie der ursprünglichen refresh.m-Datei.


Ergebnisse mit dem Beispielcode, der in der Hilfe von quiver angezeigt wird:

[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
  • Mit Originalparametern (alpha = .33;beta = .25;):

    enter image description here

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

    enter image description here

7
Luis Mendo

Sie können hier anfangen: 

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

und dann können Sie hier nach den verfügbaren Eigenschaften des Köchers suchen: 

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

Mit der Eigenschaft MaxHeadSize können Sie beispielsweise die Größe der Pfeilspitzen ändern. 

EDIT: Weitere Informationen in diesem Link: Pfeileigenschaften

Lesen Sie unten, wo sagt 

Sie können eine Anmerkung auswählen und dann Show M-code wählen, um eine .__ zu erhalten. Code-Snippet, das Sie in eine Funktion oder ein Skript einfügen können, um dies zu reproduzieren die Anmerkung.

4
pablo1977

Diese Antwort von pablo1977 war für mich die lehrreichste. Durch Anpassen der Eigenschaften der Köchergruppe, nämlich durch diese beiden Codezeilen, habe ich größere Pfeilspitzen erhalten:

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