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

(Abhängige) Linie in axis in plotten

 

HansJürgenMaier85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2016, 18:02     Titel: (Abhängige) Linie in axis in plotten
  Antworten mit Zitat      
Hallo Leute,

ich mache gerade meine ersten Gehversuche in der Erstellung einer GUI. - Das klappt soweit ganz prima, auch konnte ich schon erste Graphen erzeugen.

Nun habe ich eine kleine Frage. - Meine GUI besitzt ein ListBox-Element, in welchem eine Liste von Werten (Zeitpunkte) enthalten ist. In Abhängigkeit des jeweils selektierten Elements soll nun in einem axis-Element eine gerade vertikale Linie geplottet werden. - Meine Lösung, so wie ich sie bisher habe funktioniert an sich. Das Problem daran ist nur, dass pro Selektions-Event jedes Mal eine neue vertikale Linie dazugeplottet wird. ... Dabei möchte ich eigentlich, dass nur eine vertikale Linie zum jeweils aktuell selektierten Wert vorhanden ist.
Ist es irgendwie möglich Linien zu "verschieben", oder die zuvor geplottete und nun unerwünschte Linie zu "löschen"?

Meine listbox-Callback-Funktion sieht so aus:

Code:

function lb_timeselect_Callback(hObject, eventdata, handles)
% hObject    handle to lb_timeselect (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns lb_timeselect contents as cell array
%        contents{get(hObject,'Value')} returns selected item from lb_timeselect

% Ausgewaehlten Wert bekommen
contents = cellstr(get(hObject,'String'));
selection = str2double(contents{get(hObject,'Value')});

axes(handles.plotwindow_1);
hx = graph2d.constantline(selection, 'LineStyle', '--', 'Color', [0 0 0]);
changedependvar(hx,'x');
 


Vielen Dank im Voraus,
Hans-Jürgen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.02.2016, 18:05     Titel:
  Antworten mit Zitat      
Hallo,

Linie verschieben: Aktualisieren der Eigenschaften 'XData' bzw. 'YData'.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
HansJürgenMaier85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2016, 20:09     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für Deine Antwort. Prinzipiell verstehe ich sie, allerdings weiß ich nicht, wie ich das auf die mit graph2d.constantline() erzeugte vertikale Linie anwenden kann, weil das 'constantline()' nicht dokumentiert ist und ich nicht weiß, wie bzw. ob ich ihre XData-Eigenschaft ansprechen kann.

Ansonsten hätte ich mir folgendes Vorgehen gedacht: Beim Aufrufen der GUI wird eine vertikale Linie erzeugt (z.B. an der Stelle 0 auf der x-Achse); diese muss ich dann in der CallBack-Funktion der listbox ansprechen und entsprechend modifizieren ...

mlg
HansJürgen
 
HansJürgenMaier85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2016, 20:47     Titel:
  Antworten mit Zitat      
Soo ... jetzt habe ich die Lösung selbst gefunden.

Der "Trick" ist der, dass ich zunächst beim Aufrufen der GUI eine vertikale Linie + Handle, erzeuge:

Code:

function gui_viewer_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to gui_viewer (see VARARGIN)

handles.hx = graph2d.constantline(0, 'LineStyle', '--', 'Color', [0 0 0]);
changedependvar(handles.hx,'x');
 


... und genau diese Linie wird dann geupdated:

Code:

function lb_timeselect_Callback(hObject, eventdata, handles)
% hObject    handle to lb_timeselect (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns lb_timeselect contents as cell array
%        contents{get(hObject,'Value')} returns selected item from lb_timeselect

contents = cellstr(get(hObject,'String'));
selection = str2double(contents{get(hObject,'Value')});

axes(handles.plotwindow_1);
set(handles.hx, 'XData', [selection, selection]);
 


So läufts eigentlich ... Smile

mlg
HansJürgen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.02.2016, 22:17     Titel:
  Antworten mit Zitat      
Hallo,

wenn graph2d.constantline nicht dokumentiert ist und du demnach nicht 100%ig weißt, wie es funktioniert, warum verwendest du es dann?
Geraden jeglicher Art lassen sich auch wunderbar mit plot erzeugen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
HansJürgenMaier85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2016, 11:21     Titel:
  Antworten mit Zitat      
Hallo Harald,

da hast Du recht. - Ich habe das mit dem graph2d.constantline() noch aus einem alten Code von mir übernommen und nicht mehr darüber nachgedacht, ob es hier auch andere Möglichkeiten gibt. Aber mit plot() funktioniert es ganz gut. - Danke für den Hinweis!

Eine Frage hätte ich noch die im Prinzip dasselbe Thema betrifft, nur dass ich nun keine Linie, sondern eine komplette Funktion updaten muss.

Mit dem Skript polyfitn mache ich zu verschiedenen Zeitpunkten Datenfits mit einem von 2 Variablen abhängigen Polynom. Dieses Polynom bzw. die Gesamtrückgabe des Fits speichere ich in ein struct-Array p(ii,1) ab.
Für ii = 3 kann die Funktion an einer beliebigen Stelle [X, Y] bzw. auch über ein Feld mittels polyvaln(p(3,1),[X, Y]) ausgewertet werden.

Bisher erzeuge ich einen Plot für einen bestimmten Zeitpunkt (dbl_height ist dabei eine Höhenangabe, die ebenfalls zeitabhängig ist) folgendermaßen:

Code:

        [xPfit_mesh, yPfit_mesh] = meshgrid(0:0.1:2.5, 0:0.1:dbl_height);
        zPfit = polyvaln(p(3,1), [xPfit_mesh(:), yPfit_mesh(:)]);
        surf(xPfit_mesh, yPfit_mesh, reshape(zPfit, size(yPfit_mesh)));

        axis([0 2.5 0 8 20 60]);
        xlabel('Breite [m]', 'FontWeight', 'bold');
        ylabel('Höhe [m]', 'FontWeight', 'bold');
        zlabel('Temperatur [°C]', 'FontWeight', 'bold');
        title('Datenfit', 'FontWeight', 'bold', 'FontSize', 12);
        grid on;
        daspect([8 8 60]);
        colorbar;
        colormap(redblue/255);
        caxis([20 60]);
 


Kann hier die zu plottende Funktion p(3,1) bzw. das mesh-grid auch "einfach" durch ein Update eines surf-Handles geändert werden?
- Oder bewege ich mich hier rein gedanklich schon am falschen Dampfer?

Danke schon im Voraus,
mlg
HansJürgen
 
Harald
Forum-Meister

Forum-Meister


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

auch surf kann aktualisiert werden, indem man XData, YData und ZData aktualisiert. Wenn ich das richtig sehe, sollte in deinem Fall eine Aktualisierung von ZData ausreichen.

Grüße,
Harald
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 - 2024 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.