WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Legende im Plot wird nicht angezeigt

 

Tobias_2011
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 22.12.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2012, 11:00     Titel: Legende im Plot wird nicht angezeigt
  Antworten mit Zitat      
Hey Leute! Smile

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!!!

Hier mein Code:

Code:
function TimerFunction(src,event,h)

%mach was mit den Daten(Code entfernt)      


           %plotten
           ph=plot(h.axes1,gSPR_timebuffer,gSPR_databufferHeat,'r',gSPR_timebuffer,...
                    gSPR_databufferTemp,'b');

           %Axes beschriften
           set(h.axes1,'YLim',[0 12]);
           set(h.axes1,'XLim',[-1 ceil(length(gSPR_timebuffer)*gSPR_timerIntervall)]);
           set(get(h.axes1,'XLabel'),'String','Zeit [s]');
           set(get(h.axes1,'YLabel'),'String','Spannung [V]');  
           set(get(h.axes1,'Title'),'String','Sprungantwort');
           legend(h.axes1,'Sprung','Sprungantwort');
           grid(h.axes1);      


Das Plotten klappt gut, alles klappt gut, nur die Legende wird nicht angezeigt. Hat jemad ne Idee, woran es liegt ???


Danke im Voraus! Smile


Edit by Martin: Bitte Code-Formatierung verwenden. Danke!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.01.2012, 13:11     Titel:
  Antworten mit Zitat      
Hallo,

bei LEGEND müssen an sich als erstes Argument die Plot-Objekte angegeben werden, die beschriftet werden sollen. Bei dir sollte das

Code:
legend(ph,'Sprung','Sprungantwort');


sein. Ansonsten: gibt es Fehlermeldungen / Warnungen im Command Window? Wenn ja, welche?

Grüße,
Harald

P.S.: warum verwendest du nicht die Befehle xlim, ylim, xlabel, ylabel und title?
Private Nachricht senden Benutzer-Profile anzeigen
 
Tobias_2011
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 22.12.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2012, 14:15     Titel:
  Antworten mit Zitat      
Hallo Harald!

Das ist nett von dir, dass du dich wieder einem meiner Schwierigkeiten widmest! Vielen Dank! Smile

Deinen Vorschlag:

Code:
legend(ph,'Sprung','Sprungantwort');


habe ich auch schon ausprobiert, jedoch schmiert mein Programm dann komplett ab und die CPU springt auf 100%.

Dann habe ich die Zeile wieder auskommentiert und mal den Befehl:

Code:
title('Sprungantwort');


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 ?!

Hast du noch eine Idee ?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.01.2012, 16:36     Titel:
  Antworten mit Zitat      
Hallo,

du kannst auch bei Befehlen wie TITLE das Handle angeben.

Mir erschließt sich nicht, warum das beim LEGEND-Befehl abstürzen sollte.

Probier das ganze bitte auch mal unabhängig von Timern. Vielleicht wird der Timer zu oft in zu kurzer Zeit angestoßen?

Kannst du ein lauffähiges Beispiel zur Verfügung stellen, wo das Problem auftritt?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Tobias_2011
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 22.12.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2012, 11:07     Titel:
  Antworten mit Zitat      
Hallo Harald!

Wenn ich den Befehl:

title(h.axes1,'Sprungantwort');

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?

Oder hast du noch eine andere Idee???
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.01.2012, 11:12     Titel:
  Antworten mit Zitat      
Hallo,

ich dachte, das Programm schmiert bei
Code:
legend(ph,'Sprung','Sprungantwort');  
ab?

Hast du mal probiert, nur
Code:
legend('Sprung','Sprungantwort');  
zu nehmen?

Wie gesagt, es wäre gut, ein lauffähiges Beispiel zu haben, anhanddessen ich das reproduzieren kann.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Tobias_2011
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 22.12.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2012, 13:27     Titel:
  Antworten mit Zitat      
Verwende ich:

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Tobias_2011
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 22.12.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2012, 14:49     Titel:
  Antworten mit Zitat      
Ok, ich nehme alles zurück!

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... . Shocked

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.

Ich danke dir!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.01.2012, 14:58     Titel:
  Antworten mit Zitat      
Hallo,

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.

Etwa so:

Code:
persistent ph

if isempty(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',[0 12]);
           set(h.axes1,'XLim',[-1 ceil(length(gSPR_timebuffer)*gSPR_timerIntervall)]);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Tobias_2011
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 22.12.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2012, 15:11     Titel:
  Antworten mit Zitat      
Ok, das klingt einfacher.

Ich werde es gleich ausprobieren.

Danke nochmals! Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.