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

plot: slider mit zeitwerten

 

ls
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2013, 21:11     Titel: plot: slider mit zeitwerten
  Antworten mit Zitat      
Hallo miteinander,

ich hänge leider an einem Problem, und komme nicht weiter... vielleicht hat ja wer eine Idee...

Ich suche nach einer Lösung an einen Plot einen Slider anzufügen (soweit klar) und die x-Achse soll Zeitwerte haben (alleine auch klar). Nur leider kriege ich die Kombination nicht hin... Sad

hier der Code soweit ich ihn habe:
Code:

startTime = datenum('00:00:00.000');
endTime = datenum('10:00:00.543');

timeVec  = linspace(startTime,endTime,10);

plot(timeVec,rand(1,10))
datetick('x','HH:MM:SS.FFF','keeplimits')

 xShown = '00:10:00';
 S=['set(gca,''xlim'',get(gcbo,''value'')+[0 ' num2str(xShown) '])'];

 h=uicontrol('style','slider',...
     'units','normalized','position',barPosition,...
     'callback',S,'min',0,'max',max(timeVec)/10);
 


->Das läuft zwar so durch, gibt aber sobald man den Slider bewegt folgenden Fehler:
Code:

Error using set
Bad property value found.
Object Name :  axes
Property Name : 'XLim'
Values must be increasing and non-NaN.
 
Error while evaluating uicontrol Callback
 


OK... ich verstehe es, dass er NaN nicht hochzählen kann und denke das dies der Wert in "S" für den Callback ist... soweit richtig?

...wie kriege ich es hin, dass mir bspl. 10min abgezeigt werden und ich dann in 10min schritten weiter laufe?
...gibt es eine Möglichkeit, dass ich aus dem Plotfenster die Schrittweite bzw. den aktuellen Ausschnitt verändere (statt 10min nur 1min oder 60min?) (sowas wie zoom also...)?


Hoffe es hat wer ne Idee!!


DANKE schonmal


viele Grüße

ls
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.04.2013, 21:34     Titel:
  Antworten mit Zitat      
Hallo,

das Problem liegt in xShown bzw. der Verwendung im Callback. Vermutlich wolltest du nicht num2str, sondern datenum verwenden?

Ich empfehle als Callback dringend die Verwendung einer Funktion, um den kryptischen Befehl zu umgehen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
ls
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2013, 21:59     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für die schnelle Antwort, aber leider hat sie mich nur bedingt weiter gebracht..

hab die beiden zeilen wie folgt getauscht:

Code:

 S=['set(gca,''xlim'',get(gcbo,''value'')+[0 ' datenum(xShown) '])'];

 h=uicontrol('style','slider',...
     'units','normalized','position',barPosition,...
     'callback',S,'min',0,'max',datenum(max(timeVec))/10);
 


...nun erhalte ich folgendes:
Code:

Warning: Out of range or non-integer values truncated during conversion to character.
> In test_Timeplot at 18
Error using set(gca,'xlim',get(gcbo,'value')+[0 ])
Error: This statement is incomplete.
 
Error while evaluating uicontrol Callback
 


würde es gerne mit einer Funktion ersetzen (danke für den Tipp), aber bin mir nicht so ganz im klaren drüber, was die zurück geben muss...
in S gibt der Wert das Ende des am Anfang dargestellten bereichs an, oder???
in der uicontrol ist es ja das Ende des insgesamt dargestellten Bereichs, oder??

...ich kann die werte ja problemlos in Millisekunden oder per datenum() umwandeln, aber welche Werte kann ich nehmen, bzw. wie mache ich matlab dann klar, dass es zeitwerte sind?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

vielleicht hilft es, wenn du dir mal genauer ansiehst, was die Auswertung verschiedener Ausdrücke ergibt.

Code:
datenum(xShown)
datestr(datenum(xShown))

datenum(max(timeVec))/10

Beim letzten Befehl ist mir nicht klar, was da das datenum soll. Das ist doch schon numerisch?

Grundsätzlich ist mir noch nicht klar, wie du dir die Abbildung von Wert des Sliders zu geplotteten Datenbereich vorstellst.

Zitat:
aber bin mir nicht so ganz im klaren drüber, was die zurück geben muss...

Gar nichts. Aufpassen musst du eher auf die Eingabeargumente.

Die nachfolgenden Fragen verstehe ich nicht, kann sie also auch nicht beantworten.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
ls
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2013, 23:06     Titel:
  Antworten mit Zitat      
mhhh ich stehe leider immernoch aufm Schlauch... Rolling Eyes

hier mal die aktuelle Form:
(an der Stelle muss eigentlich ein string stehen.... daher num2str(datenum()) - siehe alternativ bspl. unten)
Code:

startTime = datenum('00:00:00.000');
endTime = datenum('10:00:00.543');

timeVec  = linspace(startTime,endTime,10);

plot(timeVec,rand(1,10))
datetick('x','HH:MM:SS.FFF','keeplimits')

 xShown = '00:10:00'
 
datenum(xShown)
datestr(datenum(xShown))
datenum(max(timeVec))/10
 
 
 
S=['set(gca,''xlim'',get(gcbo,''value'')+[0 ' num2str(datenum(xShown)) '])'];
 h=uicontrol('style','slider',...
     'units','normalized','position',barPosition,...
     'callback',S,'min',0,'max',(max(timeVec))/10);
 

->Momentan wird mir sofort der komplette Graf (00:00:00-06:00:00) angezeigt und wenn ich den slider benutze ist der rest weiß. -Ziel wäre genau das zu ändern, sodass ich nur z.B. 10min jeweils sehe.
(muss am Ende 24h in einen Plot packen und dort werte auslesen die teilweise aber nur wenige Sek. da sind. =>ich kann die 24h unmöglich auf einmal darstellen, sondern würde gerne stückweise "durchfahren" können...)



beim uicontrol war es mein Fehler... hab ich wieder rausgenommen

Zitat:
Grundsätzlich ist mir noch nicht klar, wie du dir die Abbildung von Wert des Sliders zu geplotteten Datenbereich vorstellst.

...an sich ganz einfach - ich hätte gerne als x-Achse Zeiten im Format HH:MM:SS (ggf. HH:MM:SS:FFF) angezeigt.
sprich wenn der Plot aufgeht hätte ich gerne 00:00:00 bis 00:10:00 dargestellt und alles weitere kann man dann mit dem Slider sichtbar machen.
(Hübsch wäre noch wenn ich dann ""zoomen"" könnte, sodass doch nicht 10min angezeigt werden, sondern z.B. 00:00:00 bis 01:00:00, aber das ist der 2.Schritt...)


->zwecks der Funktion reden wir glaub ich aneinander vorbei....
Ich hatte es so verstanden, dass du mir empfehlst dort eine Funktion einzusetzen, die mir den richtigen Wert zurückgibt, aber das hast du wohl anders gemeint...?



hier mal das alternative Bspl. mit normalen Zahlen statt Zeiten, welches ich mir zusammen gebastelt/gesucht habe:
Code:

numberValues = 100;
stepSize = 10;

x=0:stepSize:((numberValues*stepSize)-1);
%nur 0 oder 1
y=rand(1,numberValues);
y(y>.5)=1;
y(y<=.5)=0;

xShown = 100;
xMax = max(x);
plot(x,y);
set(gca,'ylim',[-0.2 1.2]);
set(gca,'xlim',[0 xShown]);
S=['set(gca,''xlim'',get(gcbo,''value'')+[0 ' num2str(xShown) '])'];
currentBarPossition = get(gca,'position');
barPosition = [currentBarPossition(1) currentBarPossition(2)-0.0 currentBarPossition(3) 0.05];
h=uicontrol('style','slider',...
    'units','normalized','position',barPosition,...
    'callback',S,'min',0,'max',xMax-xShown);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
ls
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.04.2013, 19:27     Titel:
  Antworten mit Zitat      
ok, hier nochmal der Versuch, das Problem anders und hoffentlich einfacher darzustellen:

Der folgende Code zeigt mir die Werte von value an und nimmt als X-Achse Zeitwerte im Format (HH:MM:SS)
Code:

startTime = datenum('2013-03-26 00:00:00');
endTime = datenum('2013-03-26 00:30:00');

time = linspace(startTime, endTime, 20);
value = linspace(1,10,20);

plot(datenum(time),value);
grid on

numberTicks = 13;
xTicks = linspace(startTime,endTime,numberTicks);
xTickLabel = datestr(xTicks,'HH:MM:SS');
set(gca,'XTick',xTicks,'XTickLabel',xTickLabel,'XLim',[xTicks(1),xTicks(end)],'FontSize',7)
set(gca,'yLim',[0,10.5]);
 


Nun möchte ich diesen Code so erweitern, dass ich nicht die Zeit von 00:00:00 - 00:30:00 sehe, sondern nur beispielsweise die ersten 5min und für den Rest einen Slider habe, sodass ich mir immer 5min Stückchen anschauen kann.
Da muss es doch einen Trick geben, dass das funktioniert oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.04.2013, 20:59     Titel:
  Antworten mit Zitat      
Hallo,

ich würde es so angehen:

Code:
function dateslider
startTime = datenum('2013-03-26 00:00:00');
endTime = datenum('2013-03-26 00:30:00');

time = linspace(startTime, endTime, 20);
value = linspace(1,10,20);

plot(datenum(time),value);
grid on
h = uicontrol('style','slider',...
    'units','normalized','position',[ 0.7 0.02 0.2 0.05],...
    'min',0,'max',25);
set(h, 'callback', {@update, h})
update([], [], h)


function update(~, ~, h)
val = round(get(h, 'Value'))
fmt = 'yyyy-mm-dd HH:MM:SS';
start = datenum(['2013-03-26 00:' num2str(val, '%02d') ':00'], fmt);
ende = datenum(['2013-03-26 00:' num2str(val+5, '%02d') ':00'], fmt);
xlim([start, ende])
set(gca, 'XTick', linspace(start, ende, 6))
datetick('x', 'keepticks')


Kann man sicher noch verfeinern.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
ls
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.04.2013, 21:38     Titel:
  Antworten mit Zitat      
*wow* SUPER!!! DANKE!!!! - ja, dass ist genau das was ich gesucht habe und die letzten Tage egal wie dran gescheitert bin!!! -DANKE-

...für das Verständnis hätte ich noch eine Frage:
was machen die beiden Tilden in update(~,~,h) ?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.04.2013, 21:46     Titel:
  Antworten mit Zitat      
Hallo,

die ~ bedeuten, dass diese Eingabeargumente nicht verwendet werden. Genausogut könntest du a und b hinschreiben. Benötigt werden sie jedoch, damit die Funktion als Callback-Funktion verwendet werden kann.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
ls
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.04.2013, 22:36     Titel:
  Antworten mit Zitat      
Ahh, ok - wieder was gelernt...

DANKESCHÖN!!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
ls
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.04.2013, 13:55     Titel: subplot mit einem Slider steuern
  Antworten mit Zitat      
....jetzt muss ich doch noch einmal nachfragen...
Ich hatte gehofft, dass ich den Sprung jetzt selbst schaffe, aber leidere scheitere ich schon wieder und weder die foren suche, noch google hilft...

Ich will mit diesem einen Slider mehrere Plots (subplots) steuern. Also auch jeden Subplot wird die gleiche x-Achse kommen und dann will ich mit einem Slider gleichzeitig alle plots bewegen können...

habe den Ansatz von Harald mal wie folgt erweitert:
Code:

function dateSlider_MultiplePlots

clearvars
clc

startTime = datenum('2013-03-26 00:00:00');
endTime = datenum('2013-03-26 00:30:00');

time = linspace(startTime, endTime, 20);
value = linspace(1,10,20);

p(1) = subplot(3,1,1)
plot(datenum(time),value);

p(2) = subplot(3,1,2)
plot(datenum(time),value);


p(3) = subplot(3,1,3)
plot(datenum(time),value);

grid on
handle = uicontrol('style','slider',...
    'units','normalized','position',[ 0.7 0.02 0.2 0.05],...
    'min',0,'max',25);
set(handle, 'callback', {@update, handle})
update([], [], handle)

function update(~,~ , handle)
val = round(get(handle, 'Value'));
fmt = 'yyyy-mm-dd HH:MM:SS';
start = datenum(['2013-03-26 00:' num2str(val, '%02d') ':00'], fmt);
ende = datenum(['2013-03-26 00:' num2str(val+5, '%02d') ':00'], fmt);
xlim([start, ende])
set(gca, 'XTick', linspace(start, ende, 6))
datetick('x', 'keepticks')
 


...wie auch immer ich es versuche, es steuert nur einen plot, aber nicht die beiden anderen.
(Alles was ich schaffe ist matlab mit meinen Versuchen regelmäßig zum abstürzen zu bringen, aber nicht das mehere plots gesteuert werden...)

noch wer eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

du musst darauf achten, dass alle Koordinatensysteme gleichzeitig oder nacheinander angesteuert werden.

Grüße,
Harald

Code:
function dateSlider_MultiplePlots

clearvars
clc

startTime = datenum('2013-03-26 00:00:00');
endTime = datenum('2013-03-26 00:30:00');

time = linspace(startTime, endTime, 20);
value = linspace(1,10,20);

p(1) = subplot(3,1,1)
plot(datenum(time),value);

p(2) = subplot(3,1,2)
plot(datenum(time),value);


p(3) = subplot(3,1,3)
plot(datenum(time),value);

grid on
handle = uicontrol('style','slider',...
    'units','normalized','position',[ 0.7 0.02 0.2 0.05],...
    'min',0,'max',25);
set(handle, 'callback', {@update, handle, p})
update([], [], handle, p)

function update(~,~ , handle, p)
val = round(get(handle, 'Value'));
fmt = 'yyyy-mm-dd HH:MM:SS';
start = datenum(['2013-03-26 00:' num2str(val, '%02d') ':00'], fmt);
ende = datenum(['2013-03-26 00:' num2str(val+5, '%02d') ':00'], fmt);
set(p, 'xlim', [start, ende])
set(p, 'XTick', linspace(start, ende, 6))
for I = 1:numel(p)
    datetick(p(I), 'x', 'keepticks')
end
Private Nachricht senden Benutzer-Profile anzeigen
 
ls
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.04.2013, 23:51     Titel:
  Antworten mit Zitat      
klingt logisch und funktioniert auch!!! (...eigentlich)

DANKE!! - DANKE!! - DANKE!! schon einmal!!!


...hab nur leider das Problem, dass es sehr "absturz-freudig" ist und habe noch keine Idee, wie ich das umgehen kann...
(dachte erst das mein Matlab nen Problem hat, aber auch nach nem update auf 2013a (=neuinstallation) ist es nicht weg... Sad )

...es verhält sich recht komisch - ich kann bspl. im Editor noch arbeiten und speichern, doch im CommandWindow kann ich nix mehr tun und auch das schließen von matlab geht ohne taskmanager nicht Sad

...hab jetzt festgestellt, dass wenn ich im commandWindow mit "Strg+C" den letzten Vorgang abbreche, ich eine Fehlermeldung erhalte die seeeehr lang ist....
hier mal der Anfang
Code:

Operation terminated by user during dateTickPicker>localGetExtentHG1 (line 253)


In dateTickPicker (line 206)
    extent = localGetExtentHG1(formlen,format,ax,axh,dateInd,axPos);

In datetick>bestscale (line 293)
[labels,format] = dateTickPicker(axh,[xmin,xmax],dateform,dateChoice,axVal);

In datetick (line 260)
        [dum,dateform] = bestscale(axh,ax,min(ticks),max(ticks));%#ok

In correlationVisualisation>update (line 129)
    datetick(p(I), 'x', 'keepticks')
 
Error using figure
Interrupt while evaluating uicontrol Callback.

Operation terminated by user during dateTickPicker>localGetExtentHG1 (line 253)


In dateTickPicker (line 206)
    extent = localGetExtentHG1(formlen,format,ax,axh,dateInd,axPos);

(...)
 


->Für mich sieht es so aus, als würde er die figure aus irgendwelchen Gründen nicht schließen, wenn ich das Fenster zu mache - kann das sein?? und wenn ja, wie kann ich sicherstellen, dass es zu geht und matlab nicht weiter im callback hängt??
(kenne ähnliche Probleme aus java beim Datei lesen/schreiben - ist aber nur eine reine Vermutung... - so schlau werde ich aus der Fehlermeldung leider nicht... )
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.04.2013, 19:12     Titel:
  Antworten mit Zitat      
Hallo,

verstehe ich auf den ersten Blick auch nicht. Vor allem kann ich es nicht reproduzieren. Ich weiß also erst mal auch nicht weiter.

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