Verfasst am: 15.01.2012, 11:00
Titel: Legende im Plot wird nicht angezeigt
Hey Leute!
Ich plage mich mit einem Problem rum und wäre dankbar, wenn mir jemand von euch einen guten Tipp oder vielleicht sogar die Lösung für das Problem geben könnte.
Ich habe eine GUI in der Daten in Vektoren aufgezeichnet werden. In einer Timerfunktion wird dann periodisch geplottet. Das Anlegen von x und yLabel für den Plot geht ohne Probleme, nur die Legende wird nicht angezeigt. Und ich verstehe nicht warum!!!
ausprobiert, statt dem Anderen, denn ich kannte den Befehl auch schon und fragte mich, warum ich den nicht genommen hatte. Das Resultat war, dass das laufende Programm in der Timerfunktion eine zusätzliche Figure mit einem Plot öffnete und den neuen Plot "Sprungantwort" taufte.
Mit dem längeren Befehl passiert das nicht.
Es scheint so, als würde das Programm irgendwie das Axesobject an dieser Stelle nicht kennen ?!
nutze, wird der Titel richtig angezeigt. Das funktioniert.
Gebe ich den Befehl:
legend(h.axes1,'Sprungantwort','Sprung');
ein, so schmiert mir das Programm ab. Wie gehabt.
Auf die Frage, ob der Timer zu schnell hintereinander aufgerufen wird, kann ich mit nein antworten. Ich habe mit "tic" und "toc" gemessen und komme auf eine Bearbeitungszeit der Timerfunction von nicht mehr als 40ms. Der Timer löst alle 100ms aus. Also ein zeitliches Problem ist das nicht.
Was mir noch eingefallen ist:
Während des Rumprobierens hatte ich zwischenzeitlich eine Fehlermeldung. Ich weiß nicht mehr genau, was ich da probiert habe, aber sie lautete: "Axes must be an existing child of figure". Hilft das weiter?
legend(ph,'Sprung','Sprungantwort');
oder
legend(h.axes1,'Sprung','Sprungantwort');
hängt sich das Programm auf. Sogar wenn es in ner "Try catch"-Anweisung steht.
Verwende ich:
legend('Sprung','Sprungantwort');
Dann schmiert das Programm nicht ab, öffnet aber eine zusätzliche Figure und wirft eine Warnung, dass der (neue) Plot leer ist.
Es ist total merkwürdig. Normaler Weise bedeutet es, wenn er eine neue Figure aufmacht, dass er keine finden konnte, weshalb man ja einen Handle übergibt. Doch übergebe ich diesen, dann hängt sich das Programm auf.
Sollte dir das auch nichts sagen, dann schaue ich mal, was und wie ich was vom Programm kopieren kann.
Beim Debuggen habe ich gesehen, dass das Programm doch eine legend darstellt.
Deshalb habe ich nochmal die Zeit gemessen.
Resultat:
Wenn der legend-Befehl nicht drin ist, braucht mein Programm 40ms.
Ist der legend-Befehl drin, dann braucht mein Programm 150ms.
Wobei der Timer alle 100ms auslöst!!!
Mit anderen Worten, während die legend erstellt wird, wird die Timerfunktion wieder aufgerufen, was wohl das Problem verursacht.
Ich bin erstaunt, dass der "Legendeneintrag" soviel Zeit braucht... .
Um das Problem zu umgehen, werde ich einen Trick anwenden:
Ich lege eine zweite durchsichtige Axes über die erste Axes und lasse dort eine Legende einmalig erzeugen. Das sollte das Problem beheben.
da sich die Beschriftung nicht ändert, wäre eine schönere Möglichkeit, den Graphen nicht neu darzustellen, sondern nur die auf der x- und y-Achse dargestellten Daten zu ändern.
ifisempty(ph) % so wie bisher else set(ph(1), 'XData',gSPR_timebuffer,'YData', gSPR_databufferHeat) set(ph(2), 'XData', gSPR_timebuffer, 'YData', gSPR_databufferTemp) % kann sein, dass das genau vertauscht ist; bitte ausprobieren! set(h.axes1,'YLim',[012]);
set(h.axes1,'XLim',[-1ceil(length(gSPR_timebuffer)*gSPR_timerIntervall)]);
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.