Verfasst am: 22.12.2011, 09:21
Titel: Verwendung von multiplen Achsen in Axes
Hallo Leute!
Ich hoffe, ihr könnt mir helfen, da ich nicht mehr weiterkomme!
Ich möchte in Matlab unter GUIDE in ein Axes einen Plot erstellen, der eine Y-Achse links, eine Y-Achse rechts und eine gemeinsame X-Achse unten hat. Die Besonderheit ist, dass zwei Datensätze "geplottet" werden sollen, der eine normal von links nach rechts und der zweite von rechts nach links. Somit kommt die Funktion "plotyy()" nicht in Frage.
In der online Mathlabhilfe habe ich dazu auch einen Artikel gefunden, der die Verwendung von multiplen Achsen in einem Axes beschreibt und auch Code dazu liefert. Die Seite dazu:
Using low-level line and axes routines allows you to superimpose objects easily. Plot the first data, making the color of the line and the corresponding x- and y-axis the same to more easily associate them.
Next, create another axes at the same location as the first, placing the x-axis on top and the y-axis on the right. Set the axes Color to none to allow the first axes to be visible and color code the x- and y-axis to match the data.
Draw the second set of data in the same color as the x- and y-axis.
hl2 = line(x2,y2,'Color','k','Parent',ax2);
Dieser Code erfüllt zwar noch nicht meine Aufgabe, jedoch muss dafür nur noch die eine X-Achse invertiert und auf 'bottom' gesetzt werden,was nicht mehr das Problem sein sollte, da es dafür jeweils einen Befehl gibt.
Das Problem mit dem Code ist aber:
Wenn ich den Code per copy & paste in Matlab in ein leeres m-File übernehme und starte, funktioniert der Code wie beschrieben.
Kopiere ich den Code aber in die openingFunction einer Figure in GUIDE, wobei ein Axes1-Objekt auf der Figure liegt, und führe ihn aus, dann funktioniert der Code nur noch zur Hälfte. Es wird dann nur der rote Datensatz, sowie die Achsen links und unten angezeigt. Die Achsen oben und rechts, sowie der schwarze Datensatz werden nicht angezeigt.
Hat jemand dazu bereits Erfahrungen, die er mit mir teilt?
Oder eine Idee, woran es liegen könnte?
die units von axes sind standardmäßig normalized. Wenn du mit GUIDE axes erstellst, dann sind die units standardmäßig auf character. Also einfach die units deiner axes ändern, denn beide units und positions müssen gleich sein...
Erst mal danke für den Tipp!
Das mit den Units habe ich auch bemerkt, weshalb ich dann heute morgen auch dafür gesorgt habe, dass beide gleich sind. Jedoch blieb der gewünschte Erfolg aus.
Ich stellte aber wenig später fest, dass der Code einwandfrei durchläuft, wenn garkeine Axes auf der figure liegt und die figure somit leer ist. Läuft der Code dann durch, wird alles erzeugt wie online dokumentiert.
Daraufhin habe ich folgendes probiert:
Ich habe auf die Figure zwei Axes-Objekte gelegt. D.h. axes1 und axes2.
Dann habe ich axes1 als Vorbild genommen und habe dort die Parameter wie Position und Units für axes2 übernommen.
%Axes2 wie Axes1 anlegen und Achsen ändern
set(ax2,'Position',get(ax1,'Position'),'Color','none','Units',get(ax1,'Units'));
set(ax2,'XAxisLocation','top','YAxisLocation','right','XDir','reverse','YLim',[0 11]);
set(get(ax2,'XLabel'),'String','Zeit [s]');
set(get(ax2,'YLabel'),'String','Spannung [V]');
% anderer Code....
%dann
%xAchsenbeschriftung der beiden Axes synchronisieren
%Axes1 geht von bis
xLimits=get(h.axes1,'XLim');
%Beschriftungen der xAchse von Axes1 holen
charAllLabel=get(h.axes1,'XTickLabel');
%Beschriftung von char zu string konvertieren
strAllLabel=cellstr(charAllLabel);
%Ermitteln, wie viele Beschriftungen vorhanden sind
labelAnzahl=size(strAllLabel);
%Die xAchse von Axes2 geht von bis genau wie bei Axes1
set(h.axes2,'XLim',get(h.axes1,'XLim'));
%Positionen für Beschriftungen bei Axes1 berechnen
set(h.axes2,'XTick',[xLimits(1):(xLimits(2)/(labelAnzahl(1)-1)):xLimits(2)]);
%Beschriftungen für Axes2 xAchse übergeben
set(h.axes2,'XTickLabel',strAllLabel);
%Hilfslinien für Axes2 abschalten
set(h.axes2,'XGrid','off');
set(h.axes2,'YGrid','off');
So funktioniert alles super!
Ich weiß bis jetzt zwar nicht, wo das Problem lag, aber mit diesem Workaround klappt es genau so wie es soll
Ich danke dir dennoch Marco, dass du dir die Zeit genommen hast, dich mit dem Problem zu befassen.
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.