Wenn Sie eine Figur in MATLAB erstellen, wird mit axis equal
sichergestellt, dass die Achsen unabhängig von der Größe der Figur immer quadratisch sind:
Mein derzeitiges Problem ist, dass ich diesem Diagramm eine zweite Achse hinzufügen möchte. Normalerweise ist das kein Problem; Ich würde einfach axes([x1 y1 x2 y2])
eingeben, und eine neue quadratische Zahl würde mit Ecken bei (x1, y1), (x2, y2)
hinzugefügt werden, was eine feste Position relativ zur Figur ist. Das Problem ist, ich möchte, dass diese neuen Achsen an einer festen Position relativ zu den ersten Achsen liegen .
Meine Fragen sind also:
Eine Achse Positionseigenschaft ist relativ zu ihrem übergeordneten Container. Daher besteht eine Möglichkeit darin, ein transparentes Panel mit derselben Größe wie die erste Achse zu erstellen Im Inneren erstellen Sie die zweite Achse und legen Sie ihren Standort und ihre Größe nach Bedarf fest. Die angegebene Position wäre so, als wäre sie relativ zur ersten Achse.
Jetzt müssen wir das Panel immer so halten, dass es die gleiche Größe / Position wie die erste Achse hat. Normalerweise kann dies mithilfe von LINKPROP erfolgen, das eine Eigenschaft mehrerer Grafikobjekte (Panel und Achse) verknüpft. identisch sein, nämlich die Eigenschaft 'Position'
.
Dies würde jedoch in Ihrem Fall fehlschlagen: wenn Sie axis image
, fixiert es die Dateneinheiten in allen Richtungen gleich, indem die Seitenverhältniseigenschaften wie 'PlotBoxAspectRatio'
und 'DataAspectRatio'
festgelegt werden. Die traurige Nachricht ist, dass die Eigenschaft 'Position'
die Größenänderung nicht widerspiegelt und somit die obige Lösung durchbricht. Hier ist ein Beispiel, um das Problem zu veranschaulichen: Wenn Sie die Position-Eigenschaft vor / nach dem Aufruf des Aufrufs axis image
abfragen, wird es dasselbe sein:
Zum Glück gibt es eine Einreichung auf FEX ( plotboxpos ), die genau dieses Problem löst, und gibt die tatsächliche Position des Zeichenbereichs der Achse zurück. Sobald wir das haben, ist es eine Frage der Synchronisierung der Plattenposition mit der Achsenposition. Ein Trick besteht darin, einen Ereignis-Listener zu erstellen, wenn die Achse ihre Größe ändert ( erscheint dass die Eigenschaft 'TightInset'
sich im Gegensatz zur Eigenschaft 'Position'
ändert, was in unserem Fall der Auslöser sein könnte.)
Ich habe das oben genannte in eine Funktion AXESRELATIVE
eingepackt: Sie nennen es so, wie Sie es in eingebaut hätten AXES Funktion. Der einzige Unterschied besteht darin, dass Sie als ersten Argument den Punkt angeben, an dem die neu erstellte Achse relativ positioniert werden soll. Es gibt Griffe sowohl für die neue Achse als auch für das zugehörige Panel zurück.
Hier ist eine Beispielverwendung:
%Vor%Und die Funktion Implementierung:
%Vor%
Ganz anders: Vor der letzten Bearbeitung hatte ich den Eindruck, dass Sie versucht haben, ein Streudiagramm von Bildern zu erzeugen (d. h. wie ein gewöhnliches Streudiagramm, aber mit vollen Bildern anstelle von Punkten).
Was Sie vorgeschlagen haben (was ich verstehe), ist die Erstellung einer Achse für jedes Bild und die Einstellung der Position, die den x / y-Koordinaten des Punktes entspricht.
Meine Lösung besteht darin, das IMAGE / IMAGESC Funktionen und zeichnen Sie die kleinen Bilder, indem Sie die Eigenschaften 'XData'
und 'YData'
explizit setzen, um die Bilder entsprechend zu verschieben und zu skalieren. Das Schöne daran ist, dass es eine einzige Achse benötigt und nicht unter Größenproblemen leidet.
Hier ist eine Beispielimplementierung dafür:
%Vor%
Dies ist normalerweise die Art von Dingen, auf die Sie mit einem benutzerdefinierten 'ResizeFcn'
Und hier ist ein Beispiel für seine Verwendung:
%Vor%