2016-09-07 3 views
3

Ich erstelle eine Multi-Panel-Figur in MATLAB (mit mehreren Achsen von verschiedenen Größe). Ich möchte, dass alle Teilstriche die gleiche absolute Größe über alle Teilpläne haben.Achsen Ticks gleicher Länge über Unterplots in MATLAB

Nach der MATLAB user guide, tick Länge bezüglich der längsten Achse normalisiert wird:

TickLength. Tick-Markierungslänge, angegeben als ein Zwei-Element-Vektor der Form [2Dlength 3Dlength]. [...] Geben Sie die Werte in Einheiten an, die relativ zur längsten Linie der sichtbaren X-Achse, Y-Achse oder Z-Achse normalisiert sind.

Um alle Zecken der gleichen Länge zu machen, ich bin mit dem folgenden Code:

fixlen = 0.005;      % Desired target length 
for i = 1:numel(h)     % Loop over axes handles 
    rect = get(h(i),'Position');  % Get the axis position 
    width = rect(3);     % Axis width 
    height = rect(4);     % Axis height  
    axislen = max([height,width]); % Get longest axis 
    ticklen = fixlen/axislen;   % Fix length 
    set(h(i),'TickDir','out','TickLength',ticklen*[1 1]); 
end 

Leider produziert der oben genannte Code tut nicht eine Figur, in der alle Tick Längen gleich sind . Vielleicht fehlt mir etwas?


Lösung. In meinem Code gab es zwei Probleme.

  1. allererst, musste ich von Normalized Einheiten auf einige feste Einheiten (wie beispielsweise Pixel) schalten. Siehe die Antwort unten.

  2. In einem Teil des Codes, vor dem obigen Snippet, habe ich die Größe geändert und ich hatte eine , um es zu aktualisieren. MATLAB würde jedoch das Code-Snippet erreichen, bevor die Grafikbefehle ausgeführt wurden und daher die angegebenen Größen nicht korrekt waren. Ich löste das Problem, indem ich einen pause(0.1) Befehl nach der drawnow platzierte.

+1

Ihre Lösung funktioniert für mich, auf MATLAB 2015a (Mac). –

Antwort

1

standardmäßig Axis Objekte haben ihre Units Eigenschaft auf normalized. Dies bedeutet, dass die Werte in der Position-Eigenschaft durch die Größe der Figur normalisiert werden. Daher erzeugt Ihr Code möglicherweise nicht das gewünschte Verhalten, wenn die Figur nicht quadratisch ist.

Eine Möglichkeit, dies zu beheben, ist die folgende:

rect = get(h(i),'Position');  % Axis position (relative to figure) 
hfig = get(h(i),'Parent');  % Handle to parent figure 
rectfig = get(hfig, 'Position'); % Figure position (in pixels) 
width = rect(3) * rectfig(3); % Absolute width of axis (in pixels) 
height = rect(4) * rectfig(4); % Absolute height of axis (in pixels) 

Dies wird Ihnen Breite/Höhe in Bezug auf die Pixel auf dem Bildschirm (vorausgesetzt, dass Sie nicht die Units Eigenschaft der Figur geändert haben).

Und wenn Sie rectfig = get(hfig,'PaperPosition') verwenden, dann erhalten Sie Breite/Höhe in Zoll auf der gedruckten Seite (wieder vorausgesetzt, Standardwert für die Figur PaperUnits Eigenschaft).

Beachten Sie jedoch, dass Sie den Wert, den Sie für fixlen verwenden, an die neuen Einheiten anpassen müssen, die wir hier verwenden.

+0

(+1) Danke. Ja, in der Zwischenzeit habe ich herausgefunden, dass Einheiten der Schlüssel sein könnten. Allerdings habe ich eine Lösung implementiert, die * es * hätte beheben sollen, aber nicht.Jetzt habe ich auch Ihre vorgeschlagene Lösung versucht, und das Problem besteht weiter; Zecken enden immer noch in unterschiedlichen Größen. – lacerbi

+1

Nun, mein Code ging davon aus, dass die Achsen "Units" noch auf "normalized" gesetzt waren und die Zahl "Units" auf "pixels" gesetzt war. Wenn sich das geändert hat, dann würde es nicht funktionieren. Was war die andere Lösung, die * es * hätte beheben sollen? Können Sie Ihrer Frage einen Code hinzufügen, der Beispielachsen mit ungleichen Ticks erzeugt? Und nur um zu überprüfen: Sie verändern die Größe nicht, nachdem Sie die Tick-Länge eingestellt haben, oder? – KQS

+0

Okay, habe die Lösung gefunden. In einem Teil des Codes, * vor *, änderte ich die Größe der Figur und ich hatte eine "Drawnnow", um sie zu aktualisieren. Allerdings würde MATLAB den Teil darunter wohl vor der Grafik-Engine erreichen. Ich habe das Problem gelöst, indem ich nach dem 'drawnnow' einen' pause (0.1) 'Befehl gesetzt habe. – lacerbi

Verwandte Themen