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

Figure(s) - Plot updaten

 

Martinuk
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.06.2012, 07:28     Titel: Figure(s) - Plot updaten
  Antworten mit Zitat      
Hallo,

ich arbeite gerade an einer Matlab-GUI, meine Frage bezieht sich allerdings mehr auf das Thema Figures + Plots weshalb ich es hier poste.

Folgende Situation:
Ich habe bei meiner GUI ein PopUpMenü mit 3 Einträgen.
zB.
PopupMenü Eintrag 1: X
PopupMenü Eintrag 1: Y
PopupMenü Eintrag 1: Z

Je nachdem ob X,Y,Z ausgewählt ist soll ein anderer Datensatz geplottet werden.

Unabhängig vom Datensatz öffne ich immer wenn ich plotte 4x Figures mit jeweils 2 Subplots.

Nun zu meiner Frage.
Angenommen ich habe die genannten 4x Figures mit den jeweiligen 2 Subplots geöffnet und geplottet wurde der X Datensatz.

Jetzt stelle wähle ich im PopupMenü den Eintrag Z und möchte jetzt die Daten sofort aktualisieren ohne das die Figures und folglich die Suplots neu erstellt werden. Praktisch sollen die einzelnen Subplots nur aktualisiert werden, weil die Figures sind ja bereits geöffnet.

1. Wie stelle ich das am elegantesten an. Mein Ansatz wäre sowas wie
a. Subplots löschen (mit cla(h(x)) wobei h(x) dem handle eines Subplots entspricht)
b. Figure in einer Schleife immer als Current Figure set(0,'CurrentFigure', fig(x)) setzen und Subplots neu plotten

Bisher nehme ich an, dass bei der Aktualisierung alle Figure geöffnet sind. Was aber wenn man zB. versehentlich ein Figure geschlossen wurde und ich jetzt den Datensatz erneut aktualisieren möchte (jetzt möchte ich Y plotten). In einem solchen Fall muss meiner Meinung geprüft werden welches Figure geschlossen ist, denn dieses muss bei der Aktualisierung zwangsläufig neu erstellt werden.

Ich hoffe meine Beschreibung ist einigermaßen verständlich, ansonsten bitte einfach nachfragen.

Freue mich über jede konstruktive Antwort.

mfg
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.06.2012, 09:31     Titel: Re: Figure(s) - Plot updaten
  Antworten mit Zitat      
Hallo Martinuk,

Das Programm könnte sich eine Liste der Handles der geöffneten Figures merken und beim Neu-Zeichnen zunächst per ISHANDLE prüfen, ob die Figure noch existiert. Falls ja, kann man darin die entsprechende AXES suchen (z.B. per FINDOBJ und einem eindeutigen Tag) oder den Handle in den UserData oder ApplicationData (siege GUIDATA) speichern. Nun kann man die bisherigen Objekte in der AXES löschen ("delete(get(AxesHandle, 'Children'))") oder was noch effizienter wäre, nur die XData und YData der vorhandenen Objekte anpassen.

Zum Neu-Zeichnen muss die Figure nicht in den Vordergrund gebracht werden, wenn man das "Parent"-Objekt in jedem PLOT-Befehl definiert.

Da es sehr viele unterschiedliche Methoden gibt, dies zu implementieren, bleibe ich hier zunächst ewtas vage.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.06.2012, 15:17     Titel:
  Antworten mit Zitat      
Danke Jan für die rasche Antwort.

Wäre es für dich ein großer Aufwand mir vllt. einen Codeschnipsel zur Verfügung zu stellen welcher deines Erachtens mein Vorhaben elegant lösen würde.
Mit 'Parent' oder 'Children' bin ich aktuell nämlich nicht so vertraut. Und was du mit XData und YData anpassen genau meinst ist mir auch nicht ganz klar um ehrlich zu sein. Mit dem Befehl (cla(...)) hat das nichts zu tun oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.06.2012, 17:25     Titel:
  Antworten mit Zitat      
Hallo Martinuk,

Alle Grafik-Objekte haben einen Parent und können mehrere Children haben. Das Basis-Objekt hat den Handle 0 und die Eigenschaften kannst Du per "get(0)" anschauen. Alle FIGUREs sind Children des 0-Handles. Deshalb ist 0 der Parent aller FIGUREs.
Jede Figure kann nun UICONTROLs, AXES, UIPANELs, UIMENUs etc. beinhalten, dies sind also wieder die Children.
Alle Elemente, die in ein AXES gezeichnet wurden, kann man so löschen:
Code:
delete(get(AxesHandle, 'Children'));

CLA macht etwas ähnliches, schaue einfach mal rein: "edit cla".

XData und YData anpassen ist knuffig:
Code:
x = linspace(0, 2*pi, 100);
y = sin(x);
H = plot(x, y);  % Handle des LINE-Objekts
for i = 1:1000
  x = linspace(0, 2*pi, i);
  y = sin(x);
  set(H, 'XData', x, 'YData', y);
  drawnow;
end

Nun muss nicht mehr die Linie neu erzeugt werden, sondern es werden nur die Koordinaten erneuert. Das spart eine Menge Overhead-Zeit.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.06.2012, 19:49     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für den Code. Jetzt ist mir das mit 'Parents' und 'Children' schon etwas klarer.

Allerdings verstehe ich nicht ganz den Vorteil den Plot in einer Schleife abzuwickeln. Praktisch wird der Graph/Kurve Punkt für Punkt erstellt.

Würde es nicht reichen es etwa so abzuwickeln?

Code:
delete(get(h(1), 'Children')); % Subplot h(1) löschen
set(fig(1),'CurrentAxes',h(1)) % Suplot h(1) in Figure fig(1) aktivieren
plot(Freq, mag2dB(abs(squeeze(Data(1,2,:))))) % Plot updaten


Schöne Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.06.2012, 21:18     Titel:
  Antworten mit Zitat      
Hallo Martinuk,

Ja, reichen würde dies. Das Setzen des CurrentAxes-Objekts ist aber langsamer und fehleranfälliger als das Definieren des Parent-Objekts im PLOT Befehl. Die CurrentAxes lönnte z.B. zwischen den Befehlen unerwartet von einem TIMER-Callback geändert werden.

Das Ändern der XData ist zudem schneller. Das mag in Deinem Beipiel nicht wichtig sein, wenn man aber z.B. einen film mit 10.000 Bildern erstellen möchte, ist es schon praktisch, wenn es dreimal so schnell geht.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2012, 15:31     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für die Beschreibung. Jetzt macht es mehr Sinn. Momentan habe ich wieder weniger Zeit für meine GUI, Simulink steht auf dem Fahrplan.

Wenn ich wieder an der GUI arbeite werde ich deine Posts berücksichtigen und dich wissen lassen wenns was neues gibt.

Vielen Dank.
Private Nachricht senden Benutzer-Profile anzeigen
 
Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.06.2012, 05:49     Titel:
  Antworten mit Zitat      
Hallo Jan,

hab mich heute mal mit deinem Codeschnipsel beschäftigt. Dein Bsp. benutzt einen Plot-Befehl. Meine Figures haben jeweils 2 Subplots. Bei Subplots wird XData und YData nicht angeboten als Eigenschaft.

Hast du eine Idee wie ich es für Subplots lösen könnte?

mfg
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.06.2012, 15:13     Titel:
  Antworten mit Zitat      
Hallo Martinuk,

SUBPLOT erstellt ein AXES-Objekt an einer bestimmten Stelle im FIGURE-Window. Hier wären XData und YData nicht hilfreich. Dazu benötigst Du schon ein LINE, PATCH oder SURF-Objekt. Man muss also das Objekt einmal zeichnen und kann danach in den folgenden Iterationen die XData anpassen. Das erstmalige Zeichnen kann auch leere Daten enthalten, z.B. "plot([])".

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2012, 20:01     Titel:
  Antworten mit Zitat      
Hallo Jan,

wollte dich nur wissen lassen, dass nun alles so funktioniert wie ich es mir vorgestellt habe. Deine Beiträge waren wirklich hilfreich. Vielen Dank nochmal dafür.

Schöne Grüße
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.