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

Subplot und hold on: einzelne Punkte nach einander setzen

 

Karl_der_Grosse
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 12.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.07.2018, 10:58     Titel: Subplot und hold on: einzelne Punkte nach einander setzen
  Antworten mit Zitat      
Hallo zusammen,

ich bin neu hier im Forum und hoffe, ich bin auch an der richtigen Stelle mit meiner Frage.

Ich habe eine Frage zum „Subplot“-Befehl und die „hold on“-Funktion.

In Grunde möchte ich bei jedem Schleifen-Durchlauf einen neuen Punkt zeichnen, wobei die alten Punkte beibehalten werden. Für einen einfachen „Plot“ habe ich ein einfaches Beispiel erstellen können.
Leider stellt es sich für einen „Subplot“ die ganze Sache etwas schwieriger dar.
Hier mein Code-Beispiel:

Code:

clear all
close all
clc

fig = figure(1);
hAxes = axes('Parent',fig);
hold on

a = 2;

for k = 1:10
    b = a + k;
    hold on
    plot(hAxes, k, b, 'Marker', '*');
    c(k) = b;   %Linie
    plot(c);
end

hold off

%*** *** ***
%Subplots
k=0;
i=0;

fh2 = figure(2);
hAxes2 = axes('Parent',fh2);
clf(2);
hold on
numFields = 4;
for i = 1:numFields
    % Create handles for update of plots.
    subplot(numFields,1,i);
    if i == 2
        hold on
        ph(i) = plot(NaN,NaN,'r+');
        ylabel('[m]');
        xlabel('[s]');
    else
%        hold on
        ph(i) = plot(0,0,'o');
    end
    ax(i) = gca;
end

a = 2;
b = 0;
c = zeros(1,10);

for k = 1:10
    b = a + k;
    c(k) = b;
    hold on
    %Wird nur einmal gezeichnet. Warum?
    ph(1).XData = k;
    hold on
    ph(1).YData = b;
    hold on
    %Warum wird dies in subplot(4) geschrieben und nicht in subplot(1)????
    ph(1) = plot(c);
    ph(1).LineStyle = ('--');
    ph(2).XData = k;
    ph(2).YData = b;
    ph(2).Marker = 'o';
    pause(0.01)
    drawnow;
end
hold off

 


Ich habe meine eigentliche Frage-Stellung etwas reduziert und hoffe, ich kann dann damit mein Problem lösen.
Ganz am Ende wäre es schön, wenn auf der X-Achse die Zeit kontinuierlich mitläuft (z. B. sichtbarer Zeitraum von 60 Sekunden) und wenn das Fenster/Subplot voll ist, die neuen Werte Schritt für Schritt nachgeschrieben werden am Ende des Fensters „rein geschoben“ werden. Dabei wird der älteste Wert gelöscht. Auf der Y-Achse würden z. B. Amplituden-Werte anzeigt. (Vielleicht gibt es schon eine Antwort, die ich selbst leider nicht im Forum gefunden habe.)

Ich hoffe, meine Beschreibung war verständlich und nachvollziehbar.

Vorab vielen Dank für Eure Hilfe.
Private Nachricht senden Benutzer-Profile anzeigen


DerElch
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 18.07.18
Wohnort: Wien
Version: 2017b
     Beitrag Verfasst am: 27.07.2018, 12:30     Titel:
  Antworten mit Zitat      
Wenn ich deine Kommentare im Code richtig deute hast du das Problem, das er nur immer in subplot(4) schreibt?

Matlab schreibt immer in die letzte "aktive" figure bzw Axes. (for-Schleife mit num-Fields)
somit ist der letzte aktive Bereich subplot(4).

Erst dann baut deine letzte For-Schleife die Daten und plottet sie. Hier hast du aber nicht angegeben in welchen Plot-Bereich. Somit ist noch immer subplot(4).

Zu deinem Ablauf für das laufende Plotten von Signalen. Hier habe ich leider zu wenig Erfahrung. Wie lange dauert die Berechnung der Signale? Eine Updatefrequenz von 1Hz ist nicht hoch. Also zuerst die Linien berechnen und dann die 60sekunden darstellen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Karl_der_Grosse
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 12.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.07.2018, 19:18     Titel:
  Antworten mit Zitat      
Hallo DerElch,

vielen Dank für Deine Antwort.
Habe auch Deine Anmerkungen einmal ausprobiert und es hat funktioniert. Bin etwas schlauer geworden.
Anbei meine Anpassungen:

Code:

%[...]
a=2;
b=0;
cc=[];
dd=[(1:5).*2];
ee=[(-5:5).^2];
kk = [];
bb = [];


for k = 1:10
    b = a + k;
    cc(k) = b;
    kk(end+1) = k;
    bb(end+1) = b;
   
    subplot(4,1,1)    
    ph(1).XData = kk; % muss ein Vektor sein!!
    ph(1).YData = bb; % muss ein Vektor sein!!
    ph(1).Color = 'r';
    hold on;
    subplot(4,1,1)
    plot(bb,cc);

    subplot(4,1,2)
    ph(2).XData = kk;
    ph(2).YData = cc(:);
    ph(2).LineStyle = ('--');

    subplot(4,1,3)
    hold on
    plot(ee,':ms')    
    ph(3).XData = bb ./ 2;
    ph(3).YData = kk;
    ph(3).Marker = 'x';
    ph(3).LineStyle = (':');
   
    subplot(4,1,4)
    plot(ee,':g')
    hold on
    plot(dd,'--r')
   
    pause(0.01)
    drawnow;
end
hold off
 


Zu meiner anderen Frage werde ich mich wohl nächste Woche noch einmal genauer beschäftigen, dies genauer formulierung und noch etwas suchen müssen.

Danke nochmal.

Schönes Wochenende und Viel Spass bei der Mond-Finsternis heute Nacht Very Happy Cool
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.