Verfasst am: 21.02.2016, 23:57
Titel: Problem mit axes nextplot
Hallo goMatlab Forum,
ich habe ein Problem beim Ploten. Beim Start der GUI wird das axes Objekt mit der CreateFcn initalisiert. Dann drückt man den Button um ein Zufallssignal darzustellen. Die Textbox muss somit verschwinden.
gesetzt, fehlt jegliche graphische Formatierung von axes wenn ein neuer Plot erstellt wird. Setze ich die Eigenschaft auf 'add', stimmt die Darstellung der CreateFcn. Für einen neuen Plot muss ich nun aber in der Button Callback die Textbox löschen, da der nächste Plot einfach darüber gestellt wird.
fehlt dann wieder die graphische Formatierung. Mit cla werden zwar Graphikobjekte gelöscht, aber das xLabel bleibt gleich, da es schon in der CreateFcn gesetzt wird. Das xlim wird dann einfach ignoriert.
Muss ich denn tatsächlich alle axes Eigenschaften nach dem reset wieder alle setzen, oder gibt es eine andere Möglichkeit um einen neuen Plot zu erstellen? Hier ein Beispiel...
auch wenn niemand eine Lösung kennt, kann mir evtl jemand eklären wieso bei nextplot = replace keine graphische Formatierung zu sehen ist? Nicht mal ticklabels, obwohl in axh in der Button Callback welche definiert sind und ich das cla auskommentiere. Das ist doch irgendwie merkwürdig zumal nextplot = replace der Default ist.
hey dsp. da hier sonst keiner was schreibt hab ich mich mal doch durchgerungen zu antworten ich seh noch nicht so ganz durch da ich da grade nicht in der materie stehe und es mir schwer fällt mich da anhand deiner informationen so fix reinzuarbeiten. kannst du nochmal für anfänger erklären welche werte du jetzt gerne wo erhalten haben willst? also was genau nicht klappt? damit ich das mal besser nachvolziehen kann. vielleicht fällt mir dann ja spontan was ein
grüße
_________________
Nun startet man die GUI (der Code ist lauffähig) und der Plot soll initialisert werden, wofür ich die axes CreateFcn nutze. Hier fangen aber meine Probleme schon. Nur wenn die axes Eigenschaft nextplot = add gesetzt wird, sind auch meine gewünschten Farben,Schriftgrößen etc zu sehen. Bei nextplot = replace fehlt das alles.
Setze ich nextplot = add habe ich aber dann das Problem, wenn ich etwas Neues plotten möchte. Dafür ist der Button in der testgui. Durch add wird einfach über das bereits im Plot existierende "gemalt". Das will ich natrülich nicht.
Der Befehl cla löscht dann zwar die graphischen Objekte, nicht aber z.B. Ticklabels. Somit werden sie auch nicht bei neuen Daten im Plot aktualisiert. Die Grenzen des xlim Befehl in der Button Callback werden nicht gesetzt.
löscht alles bis auf Positionen. Damit ist dann wieder meine graphische Formatierung weg. Es muss doch eine Weg geben, ohne jedesmal bei einem neuen Plot im gleichen axes handle, die axes settings erst wieder zuweisen zu müssen.
Aber grundlegend verstehe ich schon nicht warum es nicht mit nextplot = replace(children) funktioniert. Warum sind dann alle axes settings "weg"?
'replace' Reset all axes properties, except Position and Units, to their default values and delete all axes children before displaying the new plot. Using this value is similar to using cla reset.
Obwohl ich die Doku zu axes properties gelesen habe, ist mir das entgangen . Damit fällt dieses setting schon mal aus.
Sieh wie es ausschaut muss ich 'replacechildren' verwenden. Nur sind dann die xticks immer auf die Werte aus der CreateFcn gesetzt.
ehrlich gesagt verstehe ich deine Fragen nicht. Der Infotext in der CreateFcn ist natürlich in der eigentlich GUIversion deutlich umfangreichen. Er soll nur beim Start der GUI gezeigt werden, weshalb ich ihn in die CreateFcn gepackt habe. Sobald der User dann Signale darstellt, sollen diese Infos nicht mehr gezeigt werden.
Ich verzichte jetzt einfach auf das manuelle setzen von ticklabels in der CreateFcn. Dann habe ich auch kein Problem in den neuen Plots, da sie dann mit nextplot = replacechildren aktualsisiert werden können. Das scheint bei einem kurzen Test erstmal zu funktionieren.
Möglichweise würde es auch Abhilfe schaffen statt der CreateFcn eine normale Funktion zu erstellen, die dann aufgerufen wird, wenn alle GUI Objekte erzeugt sind.
Er soll nur beim Start der GUI gezeigt werden, weshalb ich ihn in die CreateFcn gepackt habe. Sobald der User dann Signale darstellt, sollen diese Infos nicht mehr gezeigt werden.
Genau das passiert doch momentan? Dann verstehe ich noch nicht, was dich am momentanen Verhalten stört.
Dann schau mal in dem oberen Bsp auf die xticklabels nachdem der Button gedrückt wird. Sie sollten nicht von 1...10 gehen und dannach weiter mit 1
In der CreateFcn wurden sie gesetzt und können somit nicht mehr automatisch verändert werden. Ich müsste sie also jedesmal bei einem neuen plot manuell setzen, oder cla reset nutzen und müsste dann die axes settings neu zuweisen. Diese beiden Optionen will ich aber vermeiden.
Es geht hier nicht um die CreateFcn sondern um die folgenden Plots. Hier hatte ich bisher das Problem, dass entweder alles übereinander geplottet wird (nextplot = add). Oder die axes settings verloren gehen (nextplot = replace). Oder aber die ticklabels nicht mehr automatisch geändert werden (nextplot = replacechildren/add).
Daran hängt es nicht. Hast du dir mal angesehen was dann mit den Labels bei nachfolgenden Plots durch Drücken des Buttons passiert? Da kommt doch nur Mist raus.
Ich möchte...neuer Plot = neue tickLabels, welche automatisch neu gesetzt werden entsprechen den Vorgaben aus x/ylim. Das geht nur mit nextplot = replace. Was davon der Nachteil ist, habe ich schon mehrfach erwähnt.
Offensichtlich darf ich die ticklabels in der CreateFcn nicht setzen. Sonst werde ich sie automatisch nicht wieder los. Ich dachte daher es gibt evtl. eine Kombination aus nextplot, cla, newplot oder ähnliches, welche mir die Graphikobjekte löscht und dann beim erneuten Plotbefehlt aber die Settings (Color, Grid etc.) von axes behält, aber die ticklabels neu richtig setzt.
In der CreateFcn wurden sie gesetzt und können somit nicht mehr automatisch verändert werden. Ich müsste sie also jedesmal bei einem neuen plot manuell setzen, oder cla reset nutzen und müsste dann die axes settings neu zuweisen. Diese beiden Optionen will ich aber vermeiden.
Ich verstehe das Problem immer noch nicht.
Wenn die XTickLabels gesetzt werden, wird die Automatik ausgeschaltet. Das sieht man z.B. am Wert von XTickLabelMode, der dann auf 'manual' gesetzt wird. Das ist ja das gewollte Verhalten, wenn man die XTickLables manuell setzt.
Wenn sich nun die XTicks ändern, bleiben die XTickLabels immer noch wie vorher gesetzt, denn die Automatik ist ja explizit ausgeschaltet worden. Dass dann 1 bis 10 erscheint und es dann wieder mit 1 anfängt usw. ist also logisch.
Entweder man setzt die XTicks und XTickLabels (wie HArald schon erwähnte) immer gleichzeitig, oder man schaltet die Automatiken für beide wieder ein:
danke für den Hinweis bzgl. des TickLabelModes und cla. Für die TickLabels ist damit meine Frage beantwortet. Das man XTicks und XTickLabels immer zusammensetzen sollte, ist ir bewusst. Harald weist nicht das erste mal darauf hin. Allerdings ist es in diesem Fall nicht die Ursache für die falschen ticklabels bei nachfolgenden Plots. Eine Frage habe ich allerdings noch.
Nun braucht man ein Tool um Structs feldweise zu vergleichen. Ich habe dafür ein "ComparStruct" geschrieben, das aber nicht veröffentlichungsreif ist. Die Ergebnisse kann ich auch gerade nicht ermitteln, da ich hier kein Matlab zur Verfügung habe.
Zudem bleibt zu befürchten, dass undokumentierte Unterschiede von der Matlab-Version abhängen könnten. Wenn es in einem Code wirklich auf das Verhalten ankommt, würde ich es deshalb explizit schreiben und mich nicht auf die 'NextPlot' und CLA-Schlauheiten verlassen. Ich verwende aber auch grundsätzlich kein
gca
und
gcf
, füge in
plot
Befehlen immer die 'Parent' Eigenschaft ein und schreibe immer
sum(x, 1)
statt mich darauf zu verlassen, dass
sum(x)
schon tut, was ich mir wünsche.
Denn replacechildren löscht alle axes child Objekte, aber alle anderen axes properties bleiben erhalten. Axes nextplot = replace setzt alles bis auf Position und Einheiten zurück. cla(axh) löscht ebenfalls alle axes child Objekte, deren handle visibility = on ist. Daher der Vergleich von cla und replacechildren. In der Doku zu nextplot wird angegeben...
Zitat:
'replacechildren' Remove all child objects before adding new plots, but do not reset axes properties. This is similar to using cla.
Bedeutet das nun gleich oder ähnlich? Wenn Letzteres...wo ist dann der Unterschied? Nur in der Löschbedingung handle visibility = on für Objekte? Ich konnte in der Doku dazu leider keine genaueren Infos finden.
Letztendlich habe ich diesen Thread ja gestartet, um eine Lösung für das Bestehen der axes settings und das Löschen von Graphikobjekten bei wiederholenden plot Befelen zu bekommen.
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.