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

Zwei Data-Tips synchronisieren

 

MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 29.01.2013, 22:17     Titel: Zwei Data-Tips synchronisieren
  Antworten mit Zitat      
Hallo,

ich möchte zwei Data-Tips in unterschiedlichen Axes synchronisieren (dieselben x-Werte). Im Anhang mein Code. Leider gelingt das nicht. Das zweite Data-Tip wird im ersten Axes dargestellt, wenn die Update-Funktion aufgerufen wird. Wie bekomme ich das hin?

Grüße, Marc

labeldtips.m
 Beschreibung:

Download
 Dateiname:  labeldtips.m
 Dateigröße:  369 Bytes
 Heruntergeladen:  336 mal
makedatatip.m
 Beschreibung:

Download
 Dateiname:  makedatatip.m
 Dateigröße:  4.29 KB
 Heruntergeladen:  370 mal
SyncDataTips.m
 Beschreibung:

Download
 Dateiname:  SyncDataTips.m
 Dateigröße:  3.45 KB
 Heruntergeladen:  353 mal
SyncDataTips.fig
 Beschreibung:

Download
 Dateiname:  SyncDataTips.fig
 Dateigröße:  5.97 KB
 Heruntergeladen:  305 mal
Private Nachricht senden Benutzer-Profile anzeigen


MaFam
Themenstarter

Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 30.01.2013, 19:14     Titel:
  Antworten mit Zitat      
Ich erlaube mir mal einen "Push"...
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: 31.01.2013, 10:05     Titel:
  Antworten mit Zitat      
Hallo MaFam,

Der gepostete Code ist umfangreich und man kann nicht auf Anhieb erkennen, was Du genau damit vorhast. Deshalb kann ich mit dieser Problembeschreibung nichts anfangen:
Zitat:
Das zweite Data-Tip wird im ersten Axes dargestellt, wenn die Update-Funktion aufgerufen wird

Kannst Du herausfinden in welcher Programmzeile der nicht gewünschte Effekt auftritt? Der Debugger ist dabei sicherlich hilfreich.

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

Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 31.01.2013, 10:38     Titel:
  Antworten mit Zitat      
Hallo Jan,

wenn man die entscheidenden Stellen betrachtet, ist der Code gar nicht so umfangreich. Die Funktion makedatatip.m braucht man nicht zu beachten. Diese erstellt per Code Data-Tips beliebiger Anzahl an einer beliebigen Stelle. Die Funktion labeldtips.m ist die von mir überschriebene Update-Funktion für die Data-Tips. Diese wird immer dann aufgerufen, wenn man die Position der Data-Tips per Maus verändert.

Die eigentliche Funktionalität ist im Callback des Pushbuttons Plot implementiert. Dort werden die beiden Plots und die beiden Data-Tips angelegt. Auf der Oberfläche steuere ich die Position der Data-Tips. Führt man das einmal aus, sieht das von mir geschilderte Verhalten. Die Data-Tips bewegen sich zwar synchron, aber im selben Axes oben. Das sollte so natürlich nicht sein.

Ich denke, ich könnte das Problem damit lösen, dass ich die Update-Funktion für jedes Data-Tip separat definiere. Das scheint indes in der aktuelle Ausbaustufe für alle Objekte vom Typ Data-Tip zu gelten. Außerdem könnte man vielleicht über die Eigenschaften Parent und Host was machen. Leider gelingt mir das bisher nicht.

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Themenstarter

Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 05.02.2013, 11:16     Titel:
  Antworten mit Zitat      
Hallo zusammen,

gibt es denn noch Unklarheiten bei der Problemstellung? Ich bin hier übrigens nicht weitergekommen.

Grüße, Marc
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: 05.02.2013, 11:40     Titel:
  Antworten mit Zitat      
Hallo MaFam,

Mir hilft die Erklärung nicht weiter.

Zitat:
wenn man die entscheidenden Stellen betrachtet, ist der Code gar nicht so umfangreich.

Das ist selbstverständlich. Zu bedenken belibt, dass Du weißt, welches die entscheidende Stelle ist, wir aber nicht. Natürlich kann ich Dein Programm durchlesen und irgendwann dieses Detail herausfinden, das wäre aber nicht effizient, da Du Dich doch bestens mit dem Code auskennst.

Zitat:
Die eigentliche Funktionalität ist im Callback des Pushbuttons Plot implementiert.

Dann würde ich empfehlen, genau diesen Code zu posten und das Drumherum stark zu reduzieren.

Zitat:
Die Data-Tips bewegen sich zwar synchron, aber im selben Axes oben. Das sollte so natürlich nicht sein.

Stattdessen soll dieses Verhalten auftreten:
Zitat:
ich möchte zwei Data-Tips in unterschiedlichen Axes synchronisieren (dieselben x-Werte)

Heißt dies, dass wenn Du einen Data-Tip im zweiten AXES bewegst, dass sich der entsprechende im ersten AXES-Objekt ebefalls bewegt bzw. bewegen soll? Wie ist dann festgelegt, welches der "entsprechende" ist? Und was geschieht nun genau? Statt des entsprechenden im andern AXES-Objekt bewegen sich alle Tips im angeklickten AXES-Objekt? Oder die Tips des anderen AXES werden in das aktivierte AXES gewegt?

Ein Posten im Forum hat meist dann Erfolg, wenn ein Leser in weniger als 60 Sekunden begreift, was das Problem ist. Wenn downloaden von 4 Files, eine viertel Stunde Code-Studium und erraten der eigentlichen Problem-Details notwendig ist, werden hilfreiche Antworten zunehmend unwahrscheinlich. Und so kann ich Dir zur Zeit nur diese unhilfreiche Un-Antwort senden.

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

Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 05.02.2013, 14:48     Titel:
  Antworten mit Zitat      
Hallo Jan,

ich sehe keine Möglichkeit den Code zu reduzieren, es ist bereits ein Minimalbeispiel. Ich habe zur Vereinfachung nun eine ZIP-Datei erstellt, so dass man sich das Projekt als Gesamtes herunterladen kann.

Zwei Data-Tips synchronisieren hinsichtlich ihrer x-Ausrichtung ist doch eine eindeutige Aussage?! Dann ist es egal, welches ich davon bewege, sie sollen sich stets synchron bewegen.

Den Code in den Thread kopieren siehst du wirklich als sinnvoll an? Man wird doch eher das Projekt bei sich auf dem Rechner testweise ausführen wollen, gerade weil es eine GUI ist. Oder sehe ich das falsch?

Hauptfunktion innerhalb der GUI. Hier werden die Plots und Data-Tips mit makedatatip erzeugt:
Code:

% --- Executes on button press in pushbutton_plot.
function pushbutton_plot_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_plot (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

hdt = datacursormode;
set(hdt,'UpdateFcn',{@labeldtips,hdt});

%% 1. Plot
set(handles.figureDataTipTest,'CurrentAxes',handles.axes1);

n=20;
t=1:n;
y1=3*ones(n,1);
p1=plot(t,y1);
dt1=makedatatip(p1,t(1));

%% 2. Plot
set(handles.figureDataTipTest,'CurrentAxes',handles.axes2);

y2=sin(t);
p2=plot(t,y2);
dt2=makedatatip(p2,t(1));
 


Update-Funktion der Data-Tips. Wird aufgerufen, wenn man die Data-Tips bewegt:
Code:

function output_txt  = labeldtips(obj,event_obj,hdt)
% Display an observation's Y-data and label for a data tip
% obj          Currently not used (empty)
% event_obj    Handle to event object
dcs=hdt.DataCursors;
pos = get(event_obj,'Position');
set(dcs(1),'Position',pos);
output_txt{1} = ['X: ', num2str(pos(1))];
output_txt{2} = ['Y: ', num2str(pos(2))];
 


Problem: Wenn man das obere Data-Tip bewegt, wird das untere im gleichen, oberen Axes dargestellt.

Ziel: Das untere Data-Tip soll im unteren Axes verbleiben und synchron zum oberen automatisch "mitwandern".

Beste Grüße, Marc

DataTips.zip
 Beschreibung:

Download
 Dateiname:  DataTips.zip
 Dateigröße:  9.59 KB
 Heruntergeladen:  322 mal
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: 05.02.2013, 18:57     Titel:
  Antworten mit Zitat      
Hallo Marc,

Sorry, wenn ich nochmal nachfrage.
Ich selbst lasse Dein Programm z.B. gar nicht laufen, da ich aktuell gar kein Matlab zur Verfügung habe. darum hatte ich gehofft, Du könntest uns vielleicht die Zeile zeigen, die die Datatips ins falsche AXES-Objekt bewegt. Eventuell könnte man ja Breakpoints setzen und bei schrittweisen durchlaufen lassen die verantwortliche Zeile finden. Ist es vielleicht:
Code:
set(dcs(1),'Position',pos);

?? Hier verstehe ich aber nicht, was genau in dcs gespeichert ist und ob es wirklich jeweils den dazugehörigen anderen Datatip enthält.
Es sieht so aus, also würden die Handles der Datatips dt1 und dt2 nirgends gespeichert, aber dann könntest Du ja auf den Datatip im anderen AXES überhaupt keinen Einfluß nehmen.

Also, wie gesagt, ich kann Dir leider nicht weiterhelfen. Aber ich habe es zumindest versucht. Hoffentlich ist jemand anderes erfolgreicher, oder Du bekommst mit dem Debugger doch die spezielle Zeile heraus, die wohl das Parent-Property des Tips ändert, obwohl sie nicht soll.

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

Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 06.02.2013, 09:42     Titel:
  Antworten mit Zitat      
Hallo Jan,

ok, verstehe. Kein Problem. In dcs sind die beiden Data-Tip Objekte gespeichert. Diese kann man mit dcs(1) und dcs(2) ansprechen.

Ich denke auch, dass das Problem in der Zeile
Code:

set(dcs(1),'Position',pos);
 

steckt. Da kommt irgendwas mit den handles der Axes durcheinander. Die Axes sind doch parents der Data-Tips?!

Eigentlich würde ich lieber die Update-Funktion für jedes Data-Tip separat definieren. Das geht aber scheinbar nicht...

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 18.02.2013, 12:28     Titel:
  Antworten mit Zitat      
Zwei Schritte zur Lösung:

1. Die 'UpdateFcn' reagiert nicht auf Veränderungen durch den Benutzer,
du brauchst die 'WindowButtonMotionFcn'

Code:
hdt = datacursormode;

%% 1. Plot
set(handles.figureDataTipTest,'CurrentAxes',handles.axes1);

n=20;
t=1:n;
y1=3*ones(n,1);
p1=plot(t,y1);
dt1=makedatatip(p1 ,t(1));

%% 2. Plot
set(handles.figureDataTipTest,'CurrentAxes',handles.axes2);

y2=sin(t);
p2=plot(t,y2);
dt2=makedatatip(p2, t(1));


set( gcf ,'WindowButtonMotionFcn',{@labeldtips,hdt});



2. Das der Datatip in der falschen axes ist täuscht, er hat blos die falschen
y-Werte, die musst du auf SEINE Werte anpassen nicht auf die des anderen Datatips


Code:
dcs=hdt.DataCursors;
pos = get(dcs(2),'Position');

x1 = get( dcs(1).Host , 'XData' );
y1 = get( dcs(1).Host , 'YData' );
set(dcs(1),'Position', [ pos(1) y1( pos(1) == x1  )  0 ] );

output_txt{1} = ['X: ', num2str(pos(1))];
output_txt{2} = ['Y: ', num2str(pos(2))];



so läuft der Code bei mir

Gruß

Blues
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Themenstarter

Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 18.02.2013, 14:01     Titel:
  Antworten mit Zitat      
Hallo Blues,

recht herzlichen Dank für den Lösungsvorschlag! Ich werde das übermorgen testen können...

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