2017-02-14 3 views
2

Ich versuche, die Lage der Achse tickvalues ​​aus einer MATLAB Figur zu bekommen. Zum Beispiel habe ich eine Figur wie folgt:Finding Lage der Achse tickvalues ​​in einer MATLAB Figur

MATLAB Figure

Ich versuche, die Lage der Achse tickvalues ​​zu finden, nachdem ich die Figur als Bild speichern (siehe Abbildung) [Anmerkung: Die Begrenzungskästen sind handgefertigt . Ignorieren jeder Fehler]

axis TickValue Location

Hier ist der Code, den ich bisher erzeugt:

h = plot(1:10); 
hFrame = getframe(h.Parent.Parent); 
hImage = hFrame.cdata; 
set(h.Parent,'Units','pixel'); 

Ich versuche, Boxen für x-Achse tickvalues ​​und y-Achse tickvalues ​​auf hImage von der zu bekommen begrenzen position von H.Parent.

Lassen Sie mich wissen, wenn die Frage noch nicht klar. Ich werde es bearbeiten, um es klarer zu machen.

+0

Was wollen Sie eigentlich erreichen? Dies scheint eine sehr runde Art zu sein, es zu tun. – Suever

+0

Ich versuche, diese Bereiche in dem Bild zu extrahieren, das vom Handle (das in Pixeln sein muss) erhalten wird, da wir wissen, dass Bilder normalerweise in Pixeln sind. Diese extrahierten Regionen werden in Zukunft für einen anderen Zweck verwendet werden. Extraktion in das Bild von der Figur Handle Informationen ist der Schlüssel. Ich verstehe nicht, wie es umgeht. – user7410580

+0

Warum nicht einfach 'getframe (h.Parent)' verwenden, um nur den Teil zu speichern, der die Labels nicht enthält? Sie müssen wahrscheinlich nicht in einem Bild speichern, wenn Sie nur die Positionen der Achsen möchten. Verwenden Sie einfach "h.Parent.Position", um das zu bekommen. – Suever

Antwort

1

Als @suever suggested in comments, die Position Eigenschaft der Achsen wird der einfachste Weg, das zu tun:

h = plot(1:10); 
pos = h.Parent.Position; % get the axes position 
m = 3; % width and hight multiplyer 
xth = h.Parent.XAxis.TickLength(2); % get x-axis tick hight 
dimx = [pos(1)-xth pos(2)-xth*m pos(3)+xth*2 xth*m]; 
annotation('rectangle',dimx,'color','r') % for demonstration 
yth = h.Parent.YAxis.TickLength(2); % get y-axis tick hight 
dimy = [pos(1)-yth*(m-1) pos(2)-yth yth*(m-1) pos(4)+yth*2]; 
annotation('rectangle',dimy,'color','r') % for demonstration 

Demonstration:

axis_position

und Sie können m sicher sein, ändern dass alle Tick-Werte innerhalb des Begrenzungsrahmens liegen.


EDIT:

Option 2:

op2

Option 3:

op3

+0

Es ist gut, aber nicht leise eine elegante Lösung. Es ist ein Weg, dies zu tun. Wenn wir Ihren Fall betrachten, gibt es eine Überschneidung. Wenn ich den Multiplikator zu 1 ändere, ist es tatsächlich über den TickValues ​​ – user7410580

+0

@ user7410580 Ich kann nicht sehen, wie sie sich nicht überschneiden würden? Kannst du das zeichnen? – EBH

+0

kann ich falsch im überlappenden Teil sein; aber ich war auf der Suche nach einer Lösung mit einer Region, die speziell für die Achsenwerte zugewiesen wurde. – user7410580