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

Alternative zur Legende

 

Vanillebacke
Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 06.05.09
Wohnort: Hamburg
Version: R2014a
     Beitrag Verfasst am: 24.07.2009, 12:39     Titel: Alternative zur Legende
  Antworten mit Zitat      
Moinsen,

ich habe in gui einen plot mit ca. 100 messreihen und möchte natürlich eine legende haben. dies funzt auch jedoch ist eine legende bei 100 variablen sehr unübesichtlich.
eine alternative, die ich gedacht habe ist folgendes:

ist es möglich, wenn ich mit der maus über einen der 100 graphen geh (mit anklicken gerne), dass man mir dann die Sensor Nummer (Variablen Name) darstellt, die er mir sonst in der Legende anzeigen würde???? wie lautet der code dazu???

danke für die hilfe schonmal!!!

gruß
vb
Private Nachricht senden Benutzer-Profile anzeigen


LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2009, 13:51     Titel:
  Antworten mit Zitat      
Hallo,

Du könntest z.B. mit der buttondownfcn der Linien arbeiten. Mit inputname wird der Name der Übergabevariablen ausgelesen und ich speichere die in der jeweiligen Linie unter "userdata".

Kleines Beispiel:

Code:

function clickLine(varargin)

h = plot([varargin{:}]);
for idx = 1:nargin
    set(h(idx),'userdata',inputname(idx))
end

t = text(8,0.8,'nothing selected');

set(h,'buttondownfcn',@mycb)

    function mycb(varargin)
        set(t,'string',get(varargin{1},'userdata'))
    end

end
 


Beispielaufruf:
Code:

a = rand(10,1);
abcd = rand(10,1);
x = rand(10,1);
clickLine(a,abcd,x)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Vanillebacke
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 06.05.09
Wohnort: Hamburg
Version: R2014a
     Beitrag Verfasst am: 29.07.2009, 07:20     Titel:
  Antworten mit Zitat      
danke , aber ich habe leider keine idee wie und wo ich das in meinem gui einbringen muss????
Private Nachricht senden Benutzer-Profile anzeigen
 
LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2009, 08:10     Titel:
  Antworten mit Zitat      
Da ich Deinen Code nicht kenne, wird das ganze etwas schwierig zu beantworten.
Prinzipiell muss der Code (oder Teile/Varianten davon) dort eingefügt werden, wo Du den Plot erstellst.
Wichtig ist, dass Du Dir beim Plotten das handle auf die Linien zurückgeben lässt.
Damit setzt Du dann direkt nach dem Plot die Callback Funktion für die Linienplots (mit set...).Ich habe das Feld user data verwendet, um für jede Linie den Namen zu speichern, den ich ausgeben will.
Ob Du die Namen mit inputname ausliest wie ich in dem Beispiel oder irgendwo anders her hast, ist ja egal.
Private Nachricht senden Benutzer-Profile anzeigen
 
Vanillebacke
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 06.05.09
Wohnort: Hamburg
Version: R2014a
     Beitrag Verfasst am: 29.07.2009, 08:30     Titel:
  Antworten mit Zitat      
wie hole ich mir dieses handle der linien denn zurück?

der plot befehl lauet bei mir:
Code:


h = plot(handles.axes1, t1, A1); % t1 ist die x-achse und A1 meine Matrix  
                                               %mit den Messdaten

 


Dort wollt ich jetzt teile von deinem code einbauen... kannst du mir da vielelicht weiterhelfen???

gruß

vb
Private Nachricht senden Benutzer-Profile anzeigen
 
LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2009, 08:46     Titel:
  Antworten mit Zitat      
Du hast das handle schon. Es ist der Rückgabewert von plot (also h).

Mit
Code:

t = text(8,0.8,'nothing selected');
 

erzeugst Du Dir ein Textfeld in dem steht, welche Linie ausgewählt wurde.
Die ersten beiden Parameter sind die Position, musst Du entsprechend für Deine Anwendung anpassen.

Durch
Code:

for idx = 1:n
    set(h(idx),'userdata',['A',num2str(idx)])
end
 

kannst Du z.B. die Linien einfach durchnummerieren (oder jeden anderen Namen zuweisen, der Sinn macht).

Mit
Code:

set(h,'buttondownfcn',@mycb)
 

legst Du fest, dass immer wenn jemand eine der Linien anklickt, die Funktion mycb ausgeführt wird. Die Funktion bekommt als ersten Übergabeparameter das object, das den Callback ausgelöst hat (damit weisst Du welche Linie es war).

Die Funktion selber habe ich als nested function (verschachtelte Funktion) angelegt, damit ich einfach und direkt auf t (handle auf das Textfeld) zugreifen kann.
Private Nachricht senden Benutzer-Profile anzeigen
 
Vanillebacke
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 06.05.09
Wohnort: Hamburg
Version: R2014a
     Beitrag Verfasst am: 29.07.2009, 09:22     Titel:
  Antworten mit Zitat      
klappt noch nicht ganz...

bis zur buttondownfcn habe ich das verstanden und auch umsetzen können. im grap wird mir auch das textfeld mit dem eintarg 'nothing selected' angezeigt.

die funct mycb habe ich noch nicht durchschauen können.

vom prinzip her aktualisiert sie mir doch die linien die ich anklicke??!!1

Code:

function mycb(???)
set (t,'string', get(????){1}.'userdata'))
end
 


müsste bei mycb nicht h in die klammer und bei get auch???

bei mir erscheint dann immer die fehlermeldung


.....
too many input arguments...

sind aber auf den richtigen weg....Wink

gruß vb
Private Nachricht senden Benutzer-Profile anzeigen
 
LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2009, 09:46     Titel:
  Antworten mit Zitat      
varargin steht für eine variable Anzahl von Eingabeargumenten. Es handelt sich dabei um den Datentyp cell, daher greife ich mit {} auf den Inhalt zu.
Es werden bei der Callback Funktion immer automatisch zwei Argumente mit übergeben: das Objekt (varargin{1}, in Deinem Fall ein handle auf die Linie die angeklickt wurde) und eine event-Struktur (varargin{2}, leer in diesem Fall).

Code:

function mycb(varargin)
       % user data von der ausgewählten Linie auslesen
       str = get(varargin{1},'userdata');
       % ändern der Anzeige in der Textbox
        set(t,'string',str)
    end
 


Wenn Dir varargin nicht gefällt, kannst Du auch zwei eigene Namen übergeben:
Code:

function mycb(hObj, ev)
       % user data von der ausgewählten Linie auslesen
       str = get(hObj,'userdata');
       % ändern der Anzeige in der Textbox
        set(t,'string',str)
    end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Vanillebacke
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 06.05.09
Wohnort: Hamburg
Version: R2014a
     Beitrag Verfasst am: 29.07.2009, 10:16     Titel:
  Antworten mit Zitat      
super es funktioniert-------

danke dir!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Vanillebacke
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 06.05.09
Wohnort: Hamburg
Version: R2014a
     Beitrag Verfasst am: 29.07.2009, 10:18     Titel:
  Antworten mit Zitat      
eins wär noch super... kann man die text position variabel halten? Dort wo ich mit der maus klicke, soll dann der text stehen????

geht sicherlich oder?

gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2009, 11:23     Titel:
  Antworten mit Zitat      
das kannst Du folgendermaßen machen:
Code:

pos = get(handles.axes1,'CurrentPoint');
set(t,'string',get(hObj,'userdata'),'position',pos(1,:))
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Vanillebacke
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 06.05.09
Wohnort: Hamburg
Version: R2014a
     Beitrag Verfasst am: 29.07.2009, 11:31     Titel:
  Antworten mit Zitat      
super!!!

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