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

Mehrere Diagramme überlappen bei bestimmten Radioboxklicke

 

Henky
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 23.03.15
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 24.03.2015, 10:31     Titel: Mehrere Diagramme überlappen bei bestimmten Radioboxklicke
  Antworten mit Zitat      
Hallo,

ich bin dabei aus einer sehr umfangreichen Datei mit vielen Spalten und Zeilen Daten auszuwerten. Mit dem guide habe ich bereits ein GUI entwickelt mit einem Diagramm (Axes) und 2 Radiobuttons (weitere folgen). Die einzelnen Programme zur Erstellung der Diagramme habe ich in mehreren .m-files abgespeichert. In diesen .m-files werden aus einer Datei unterschiedliche Spalten ausgewertet und anschließend geplottet (z. B. Spalte 1 und 17 oder Spalte 1 und 18.. etc.). Die Radiobuttons haben in der Callbackfunktion folgenden Code:

Code:

% --- Executes on button press in radiobutton1.
function radiobutton1_Callback(hObject, ~, handles)
radiobutton1 = get(hObject,'Value');
handles.Buttons.Klick1 = radiobutton1;
guidata(hObject, handles);
if handles.Buttons.Klick1 == 1 &&  handles.Buttons.Klick2 ==1
    Berechnung3;
end
if handles.Buttons.Klick1 == 0 &&  handles.Buttons.Klick2 ==1
    Berechechnung1;
end
if handles.Buttons.Klick1 == 1 &&  handles.Buttons.Klick2 ==0
    Berechnung2;
end
if handles.Buttons.Klick1 == 0 &&  handles.Buttons.Klick2 ==0
    cla;
end
guidata(hObject, handles);


% --- Executes on button press in radiobutton2.
function radiobutton2_Callback(hObject, ~, handles)
% hObject    handle to radiobutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
radiobutton2 = get(hObject,'Value');
handles.Buttons.Klick2 = radiobutton2;
guidata(hObject, handles);
if handles.Buttons.Klick1 == 1 &&  handles.Buttons.Klick2 ==1
    Zusammentest;
end
if handles.Buttons.Klick1 == 0 &&  handles.Buttons.Klick2 ==1
    Berechnung_Thumb_Near;
end
if handles.Buttons.Klick1 == 1 &&  handles.Buttons.Klick2 ==0
    Berechnung_Thumb;
end
if handles.Buttons.Klick1 == 0 &&  handles.Buttons.Klick2 ==0
    cla;
end
guidata(hObject, handles);
 


Bis auf kleine Startschwierigkeiten (man muss alle Radiobuttons 1x anklicken, weil beim 1. Mal anklicken ein Fehler kommt) funktioniert das Programm. Wenn ich jetzt nur 2-3 Radiobuttons hätte, würde ich es einfach so lassen! Mein Problem ist, dass ich ca. 11 Radiobuttons einbauen möchte und die ganzen if ... end Bedingungen würden extrem viel Tipparbeit werden, wenn jeder Befehl in jedem Radiobutton kopiert würde. Zusätzlich sollen die Diagramme nur bei markierten Radiobuttons ( 'Value' ==1) dargestellt werden. Maximal also ca. 11 Graphen in einer Axes. Gibt es eine Möglichkeit diesen If-code zu reduzieren und evtl. die Diagramme zu überlappen wenn die Radiobutton aktiv sind? Dann würde ja pro Radiobutton ein Programm zur Berechnung ausreichen.

Ich hoffe ihr versteht mein Problem und würde mich freuen, wenn ihr mir dabei helfen könnt.

Liebe Grüße,
Nils
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: 24.03.2015, 23:50     Titel: Re: Mehrere Diagramme überlappen bei bestimmten Radioboxkli
  Antworten mit Zitat      
Hallo Henky,

Du hast noch nicht erklärt, wie die weiteren Buttons den eingefügt werden sollen. Welche Logik soll dahinter stecken?

Der Sinn von Radio-Buttons ist sich gegenseitig auszuschließen. Deshalb ist es merkwürdig, wenn hier 2 Buttons gleichzeitig aktiviert sein können.

Eine Methode für eine Liste von Button wird es sein, die Indices nicht in die Namen zu schmuggeln, sondern in Vektoren zu speichern und mit einem Index darauf zu zu greifen. Dann gibt es nur noch eine einzige Callback-Funktion für alle Buttons:

Code:

function radiobutton_Callback(hObject, ~, handles)

Index = find(handles.ButtonList == hObject);
Value = get(hObject,'Value');

handles.Buttons.Klick(Index) = Value;

if isequal(handles.Buttons.Klick, [0,1,1,1,0,0,0,1, <etc>])
    Berechnung3;
elseif isequal(handles.Buttons.Klick, [...])

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 23.03.15
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 25.03.2015, 17:30     Titel:
  Antworten mit Zitat      
Hallo Jan,
die weiteren Buttons sollen ebenso wie die beiden ersten Buttons eingefügt werden. Jede Kombinationsmöglichkeit an Klicks, soll dabei unterschiedliche Graphen anzeigen (alles unterschiedliche .m-files wie z. B. "Berechung1").

Dabei müssten in meinem Beispiel jeder Button neu erweitert werden. Bei z. B. drei Buttons würde der Code so aussehen:

Code:
radiobutton1 = get(hObject,'Value');
handles.Buttons.Klick3 = radiobutton3;
guidata(hObject, handles);
if handles.Buttons.Klick1 == 1 &&  handles.Buttons.Klick2 ==1 && handles.Buttons.Klick3 ==1
    Berechnung4;
end
if handles.Buttons.Klick1 == 0 &&  handles.Buttons.Klick2 ==0 && handles.Buttons.Klick3 ==1
    Berechnung5;
end
if handles.Buttons.Klick1 == 0 &&  handles.Buttons.Klick2 ==1 && handles.Buttons.Klick3 ==0
    Berechnung6;
end
if handles.Buttons.Klick1 == 1 &&  handles.Buttons.Klick2==0 &&handles.Buttons.Klick3 ==0
    Berechnung7;
end
if handles.Buttons.Klick1 == 1 &&  handles.Buttons.Klick2 ==0 && handles.Buttons.Klick3 ==1
    Berechnung7;
end
if handles.Buttons.Klick1 == 1 &&  handles.Buttons.Klick2 ==1 && handles.Buttons.Klick3 ==0
    Berechnung8;
end
...
...
if handles.Buttons.Klick1 == 0 &&  handles.Buttons.Klick2 ==0 && handles.Buttons.Klick3 ==0
    cla;
end
guidata(hObject, handles);
save test.mat
 


Wenn der Sinn eines Radiobuttons ist, die anderen auszuschließen, missachte ich diesen in meinem Programm wohl sehr. Alternativ machen Checkboxen jedoch das gleiche, sehen nur anders aus, oder? Es wird ein Datenauswertungsprogramm, sodass man verschiedene Graphen direkt in einem Diagramm vergleichen kann. Darum ist die Funktion aus meiner Sicht schon gewollt.

Muss dein Code auch in jeder Radiobuttonfunktion sein? Wenn ich 10 Buttons mit dem guide erstelle, woher weiß Matlab dann in welchem der Code steht? Oder benenne ich die Radiobuttons alle gleich? Wenn ich das mit den Vektoren ausprobiere bekomme ich die Fehlermeldung "Reference to non-existent field 'Buttonlist'." Soll Matlab dieses Feld nicht automatisch selber erstellen und dann mit Values füllen?


Eine Möglichkeit die geplotteten Graphen aus den Programmen "Berechnung1" (etc.) einfach zu überlappen, solange die gewünschten Radiobuttons markiert sind, gibt es nicht?

Liebe Grüße,

Nils
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: 26.03.2015, 09:29     Titel:
  Antworten mit Zitat      
Hallo Henky,

Bei 11 Buttons gäbe es schon 2048 verschiedene Möglichkeiten. Ist das wirklich sinnvoll?
Ist mein Vorschlag klar geworden, statt der nummerierten Variablen besser einen Vektor zu nehmen?

Zitat:
Wenn der Sinn eines Radiobuttons ist, die anderen auszuschließen, missachte ich diesen in meinem Programm wohl sehr. Alternativ machen Checkboxen jedoch das gleiche, sehen nur anders aus, oder?

Genau. Checkboxen sehen anders aus. Da eine Benutzer-Oberfläche für die Benutzung gedacht ist, ist es eine gute Idee sich an die gewohnten Konventionen zu halten.

Zitat:
Muss dein Code auch in jeder Radiobuttonfunktion sein? Wenn ich 10 Buttons mit dem guide erstelle, woher weiß Matlab dann in welchem der Code steht?

Der gezeigte Code kann als Callback-Funktion für alle Buttons verwendet werden. Es wird dann intern durch die Abfrage von hObject betimmt, welche Button genau gedrückt wurde.

Zitat:
Wenn ich das mit den Vektoren ausprobiere bekomme ich die Fehlermeldung "Reference to non-existent field 'Buttonlist'."

Ja, das ist zu erwarten. Man muss z.B. in der OpeningFcn zunächste das Feld ButtonList initialisieren, z.B. mit ZEROS(1, 11), und im handles-Struct speichern.

Zitat:
Soll Matlab dieses Feld nicht automatisch selber erstellen und dann mit Values füllen?

Nein, Matlab kann nicht auf magische Weise erraten, was es erstellen soll. Man muss das hier explizit selbst tun.

Zitat:
Eine Möglichkeit die geplotteten Graphen aus den Programmen "Berechnung1" (etc.) einfach zu überlappen, solange die gewünschten Radiobuttons markiert sind, gibt es nicht?

Ich verstehe nicht, was "überlappen" hier bedeutet. Aber ich vermute, dass es natürlich solche Möglichkeiten gibt. Man muss nur genau wissen, was man möchte und es dann programmieren.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 23.03.15
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 26.03.2015, 12:24     Titel:
  Antworten mit Zitat      
Hallo Jan,

die ganzen 2048 Möglichkeiten zu programmieren halte ich auch für unsinnig, es muss eigentlich eine einfache Lösung für mein Problem geben. Mein Code sollte eigentlich zur Veranschaulichung meines Problems dienen. Ich habe hier nochmal ein Screenshot gemacht, im letzten Bild sieht man die "überlappten" Graphen. Es sind aber keine Überlappten, sondern wie in meinem Code gezeigt, neue Berechnungen aus Datensatz 1 und 2 ( Berechnung 3 ). Durch das wirkliche "Überlappen" würde ich mir die 2048 Kombinationsmöglichkeiten bei den 11 Checkboxen einsparen, nur weiß ich nicht wie.



Zu deinem Code: Das mit dem Index und dem Vektor habe ich ansich schon verstanden, nur funktioniert es bei mir leider nicht. Ich glaube Matlab hat ein Problem mit der Indexprogrammzeile. Es passiert nichts, auch keine Fehlermeldungen mehr.

Code:
% --- Executes just before Auswertungdiagrammeneu is made visible.
function Auswertungdiagrammeneu_OpeningFcn(hObject, ~, 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 Auswertungdiagrammeneu (see VARARGIN)

% Choose default command line output for Auswertungdiagrammeneu
handles.output = hObject;
load('matlab2','handles');
handles.Buttonlist = zeros(1,2);
guidata(hObject, handles);

% UIWAIT makes Auswertungdiagrammeneu wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = Auswertungdiagrammeneu_OutputFcn(~, ~, handles)
varargout{1} = handles.output;


% --- Executes on button press in checkbox1.
function checkbox1_Callback(hObject, ~, handles)
Index = find(handles.Buttonlist == hObject);
Value = get(hObject,'Value');

handles.Buttons.Klick(Index) = Value;

if isequal(handles.Buttons.Klick, [1,0])
      Berechnung1;
elseif  isequal(handles.Buttons.Klick, [0,1])
      Berechnung2;
elseif  isequal(handles.Buttons.Klick, [1,1])
      Berechnung3;
elseif isequal(handles.Buttons.Klick, [0,0])
      cla;
end


% --- Executes on button press in checkbox2.
function checkbox2_Callback(hObject, ~, handles)
Index = find(handles.Buttonlist == hObject);
Value = get(hObject,'Value');

handles.Buttons.Klick(Index) = Value;

if isequal(handles.Buttons.Klick, [1,0])
      Berechnung1;
elseif  isequal(handles.Buttons.Klick, [0,1])
      Berechnung2;
elseif  isequal(handles.Buttons.Klick, [1,1])
      Berechnung3;
elseif isequal(handles.Buttons.Klick, [0,0])
      cla;
end


Tut mir Leid falls ich etwas unbeholfen erscheine, aber das ist mein erstes Matlabprogramm.

Liebe Grüße und Danke für die Hilfe!

Nils
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: 26.03.2015, 13:16     Titel:
  Antworten mit Zitat      
Hallo Henky,

Ich stimme Dir ganz zu, dass 2048 unterschiedliche Programm-Verzeigungen nicht sinnvoll geschrieben werden können. Das ist viel zu anfällig für Fehler.

Zitat:
Zu deinem Code: Das mit dem Index und dem Vektor habe ich ansich schon verstanden, nur funktioniert es bei mir leider nicht. Ich glaube Matlab hat ein Problem mit der Indexprogrammzeile. Es passiert nichts, auch keine Fehlermeldungen mehr.

Du kannst den Debugger verwenden um Zeile für Zeile durch den Code zu gehen. Dann bekommst Du genau heraus, was an welcher Stelle geschieht.

Zitat:
load('matlab2','handles');

Es sieht sehr unpraktisch aus den "handles"-Struct zeitraubend aus einem File zu laden. GUIDATA speichert diesen Struct effizient in den ApplicationData der Figure.

Code:
function checkbox_Callback(hObject, EventData)
handles = guidata(hObject);  % Besser, wenn handles dynamisch geändert wird

Index = find(handles.Buttonlist == hObject);
Value = get(hObject,'Value');

handles.Buttons.Klick(Index) = Value;

if isequal(handles.Buttons.Klick, [1,0])
      Berechnung1;
elseif  isequal(handles.Buttons.Klick, [0,1])
      Berechnung2;
elseif  isequal(handles.Buttons.Klick, [1,1])
      Berechnung3;
elseif isequal(handles.Buttons.Klick, [0,0])
      cla;
end

Dies ist natürlich nur ein Tipp, kein lauffähiges Programm. Das [1,0] use. musst Du natürlich an den wirklichen Code anpassen und "handles.Buttons.Klick" auch in der OpeningFcn oder CreateFcn definieren.
Und dann benötigst Du diesen Callback nur einmal und kannst ihn von allen Buttons aus aufrufen.

Es macht gar nichts, wenn Du beim Fragen nicht so wirkst, als habest Du bereits alle Antwortet! :-) Das ist ja der Sinn dieses Forums!

Gruß, Jan
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.